| Index: media/audio/cras/audio_manager_cras.cc
|
| diff --git a/media/audio/cras/audio_manager_cras.cc b/media/audio/cras/audio_manager_cras.cc
|
| index 6df14bc87191ff8ac16eed8ed3482fca43d53ada..a05789037e0089ccea1b275c063c3f7b819fff17 100644
|
| --- a/media/audio/cras/audio_manager_cras.cc
|
| +++ b/media/audio/cras/audio_manager_cras.cc
|
| @@ -49,6 +49,10 @@ const int kDefaultInputBufferSize = 1024;
|
| const char kBeamformingOnDeviceId[] = "default-beamforming-on";
|
| const char kBeamformingOffDeviceId[] = "default-beamforming-off";
|
|
|
| +// Labels for showing audio devices with internal nodes.
|
| +const char kInternalInputDevice[] = "Headset/Front Mic";
|
| +const char kInternalOutputDevice[] = "HP/Speaker";
|
| +
|
| enum CrosBeamformingDeviceState {
|
| BEAMFORMING_DEFAULT_ENABLED = 0,
|
| BEAMFORMING_USER_ENABLED,
|
| @@ -159,15 +163,48 @@ void AudioManagerCras::GetAudioDeviceNamesImpl(bool is_input,
|
| if (is_input && mic_positions_.size() > 1)
|
| AddBeamformingDevices(device_names);
|
| else
|
| - device_names->push_back(media::AudioDeviceName::CreateDefault());
|
| + device_names->push_back(AudioDeviceName::CreateDefault());
|
|
|
| if (base::FeatureList::IsEnabled(features::kEnumerateAudioDevices)) {
|
| chromeos::AudioDeviceList devices;
|
| chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices);
|
| +
|
| + // Find if there exists |AUDIO_TYPE_INTERNAL_MIC| or
|
| + // |AUDIO_TYPE_INTERNAL_SPEAKER|. If so, labeling the audio nodes that are
|
| + // on internal devices using kInternalInputDevice or kInternalOutputDevice
|
| + // and skip duplicates since pinning stream is pinned on device not node.
|
| + // We only need to take care whenever there exists internal mic or internal
|
| + // speaker since only internal device supports two nodes.
|
| + int internal_input_dev_index = 0;
|
| + int internal_output_dev_index = 0;
|
| + for (const auto& device : devices) {
|
| + if (device.type == chromeos::AUDIO_TYPE_INTERNAL_MIC)
|
| + internal_input_dev_index = dev_index_of(device.id);
|
| + else if (device.type == chromeos::AUDIO_TYPE_INTERNAL_SPEAKER)
|
| + internal_output_dev_index = dev_index_of(device.id);
|
| + }
|
| +
|
| + bool has_internal_input = false;
|
| + bool has_internal_output = false;
|
| for (const auto& device : devices) {
|
| if (device.is_input == is_input && device.is_for_simple_usage()) {
|
| - device_names->emplace_back(device.display_name,
|
| - base::Uint64ToString(device.id));
|
| + int dev_index = dev_index_of(device.id);
|
| + if (dev_index == internal_input_dev_index) {
|
| + if (!has_internal_input) {
|
| + device_names->emplace_back(kInternalInputDevice,
|
| + base::Uint64ToString(device.id));
|
| + has_internal_input = true;
|
| + }
|
| + } else if (dev_index == internal_output_dev_index) {
|
| + if (!has_internal_output) {
|
| + device_names->emplace_back(kInternalOutputDevice,
|
| + base::Uint64ToString(device.id));
|
| + has_internal_output = true;
|
| + }
|
| + } else {
|
| + device_names->emplace_back(device.display_name,
|
| + base::Uint64ToString(device.id));
|
| + }
|
| }
|
| }
|
| }
|
| @@ -232,17 +269,17 @@ AudioOutputStream* AudioManagerCras::MakeLinearOutputStream(
|
| const AudioParameters& params,
|
| const LogCallback& log_callback) {
|
| DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format());
|
| - return MakeOutputStream(params);
|
| + // (warx): pinning stream is not supported for MakeLinearOutputStream.
|
| + return MakeOutputStream(params, AudioDeviceDescription::kDefaultDeviceId);
|
| }
|
|
|
| AudioOutputStream* AudioManagerCras::MakeLowLatencyOutputStream(
|
| const AudioParameters& params,
|
| const std::string& device_id,
|
| const LogCallback& log_callback) {
|
| - DLOG_IF(ERROR, !device_id.empty()) << "Not implemented!";
|
| DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format());
|
| // TODO(dgreid): Open the correct input device for unified IO.
|
| - return MakeOutputStream(params);
|
| + return MakeOutputStream(params, device_id);
|
| }
|
|
|
| AudioInputStream* AudioManagerCras::MakeLinearInputStream(
|
| @@ -264,8 +301,6 @@ AudioInputStream* AudioManagerCras::MakeLowLatencyInputStream(
|
| AudioParameters AudioManagerCras::GetPreferredOutputStreamParameters(
|
| const std::string& output_device_id,
|
| const AudioParameters& input_params) {
|
| - // TODO(tommi): Support |output_device_id|.
|
| - DLOG_IF(ERROR, !output_device_id.empty()) << "Not implemented!";
|
| ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
|
| int sample_rate = kDefaultSampleRate;
|
| int buffer_size = kMinimumOutputBufferSize;
|
| @@ -288,8 +323,9 @@ AudioParameters AudioManagerCras::GetPreferredOutputStreamParameters(
|
| }
|
|
|
| AudioOutputStream* AudioManagerCras::MakeOutputStream(
|
| - const AudioParameters& params) {
|
| - return new CrasUnifiedStream(params, this);
|
| + const AudioParameters& params,
|
| + const std::string& device_id) {
|
| + return new CrasUnifiedStream(params, this, device_id);
|
| }
|
|
|
| AudioInputStream* AudioManagerCras::MakeInputStream(
|
| @@ -312,4 +348,12 @@ snd_pcm_format_t AudioManagerCras::BitsToFormat(int bits_per_sample) {
|
| }
|
| }
|
|
|
| +bool AudioManagerCras::IsDefault(const std::string& device_id, bool is_input) {
|
| + AudioDeviceNames device_names;
|
| + GetAudioDeviceNamesImpl(is_input, &device_names);
|
| + DCHECK(!device_names.empty());
|
| + AudioDeviceName device_name = device_names.front();
|
| + return device_name.unique_id == device_id;
|
| +}
|
| +
|
| } // namespace media
|
|
|