| Index: content/browser/renderer_host/media/audio_input_device_manager.cc
|
| diff --git a/content/browser/renderer_host/media/audio_input_device_manager.cc b/content/browser/renderer_host/media/audio_input_device_manager.cc
|
| index 4ad35755240e59932c8d60e8e8998c3eca558254..8afe06724f3412afb9acd021fd322f62d52091df 100644
|
| --- a/content/browser/renderer_host/media/audio_input_device_manager.cc
|
| +++ b/content/browser/renderer_host/media/audio_input_device_manager.cc
|
| @@ -13,7 +13,7 @@
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/common/media_stream_request.h"
|
| #include "media/audio/audio_input_ipc.h"
|
| -#include "media/audio/audio_manager_base.h"
|
| +#include "media/audio/audio_system.h"
|
| #include "media/base/audio_parameters.h"
|
| #include "media/base/channel_layout.h"
|
| #include "media/base/media_switches.h"
|
| @@ -32,13 +32,12 @@ const int kFirstSessionId = AudioInputDeviceManager::kFakeOpenSessionId + 1;
|
| }
|
|
|
| AudioInputDeviceManager::AudioInputDeviceManager(
|
| - media::AudioManager* audio_manager)
|
| + media::AudioSystem* audio_system)
|
| : next_capture_session_id_(kFirstSessionId),
|
| #if defined(OS_CHROMEOS)
|
| keyboard_mic_streams_count_(0),
|
| #endif
|
| - audio_manager_(audio_manager),
|
| - device_task_runner_(audio_manager_->GetTaskRunner()) {
|
| + audio_system_(audio_system) {
|
| }
|
|
|
| AudioInputDeviceManager::~AudioInputDeviceManager() {
|
| @@ -58,7 +57,6 @@ void AudioInputDeviceManager::RegisterListener(
|
| MediaStreamProviderListener* listener) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| DCHECK(listener);
|
| - DCHECK(device_task_runner_);
|
| listeners_.AddObserver(listener);
|
| }
|
|
|
| @@ -73,10 +71,35 @@ int AudioInputDeviceManager::Open(const MediaStreamDevice& device) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| // Generate a new id for this device.
|
| int session_id = next_capture_session_id_++;
|
| - device_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&AudioInputDeviceManager::OpenOnDeviceThread,
|
| - this, session_id, device));
|
| +
|
| + // base::Unretained(this) is safe, because AudioInputDeviceManager is
|
| + // destroyed not earlier than on the IO message loop destruction.
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kUseFakeDeviceForMediaStream)) {
|
| + audio_system_->GetAssociatedOutputDeviceID(
|
| + device.id,
|
| + base::Bind(&AudioInputDeviceManager::OpenedOnIOThread,
|
| + base::Unretained(this), session_id, device,
|
| + base::TimeTicks::Now(),
|
| + media::AudioParameters::UnavailableDeviceParams(),
|
| + media::AudioParameters::UnavailableDeviceParams()));
|
| + } else {
|
| + // TODO(tommi): As is, we hit this code path when device.type is
|
| + // MEDIA_TAB_AUDIO_CAPTURE and the device id is not a device that
|
| + // the AudioManager can know about. This currently does not fail because
|
| + // the implementation of GetInputStreamParameters returns valid parameters
|
| + // by default for invalid devices. That behavior is problematic because it
|
| + // causes other parts of the code to attempt to open truly invalid or
|
| + // missing devices and falling back on alternate devices (and likely fail
|
| + // twice in a row). Tab audio capture should not pass through here and
|
| + // GetInputStreamParameters should return invalid parameters for invalid
|
| + // devices.
|
| +
|
| + audio_system_->GetInputDeviceInfo(
|
| + device.id, base::Bind(&AudioInputDeviceManager::OpenedOnIOThread,
|
| + base::Unretained(this), session_id, device,
|
| + base::TimeTicks::Now()));
|
| + }
|
|
|
| return session_id;
|
| }
|
| @@ -135,78 +158,34 @@ void AudioInputDeviceManager::UnregisterKeyboardMicStream() {
|
| }
|
| #endif
|
|
|
| -void AudioInputDeviceManager::OpenOnDeviceThread(
|
| +void AudioInputDeviceManager::OpenedOnIOThread(
|
| int session_id,
|
| - const MediaStreamDevice& device) {
|
| - SCOPED_UMA_HISTOGRAM_TIMER(
|
| - "Media.AudioInputDeviceManager.OpenOnDeviceThreadTime");
|
| - DCHECK(IsOnDeviceThread());
|
| -
|
| - StreamDeviceInfo out(device.type, device.name, device.id, 0, 0, 0);
|
| - out.session_id = session_id;
|
| -
|
| - MediaStreamDevice::AudioDeviceParameters& input_params = out.device.input;
|
| -
|
| - // Add preferred output device information if a matching output device
|
| - // exists.
|
| - out.device.matched_output_device_id =
|
| - audio_manager_->GetAssociatedOutputDeviceID(device.id);
|
| -
|
| - if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kUseFakeDeviceForMediaStream)) {
|
| - // Don't need to query the hardware information if using fake device.
|
| - input_params.sample_rate = 44100;
|
| - input_params.channel_layout = media::CHANNEL_LAYOUT_STEREO;
|
| - if (!out.device.matched_output_device_id.empty()) {
|
| - out.device.matched_output.sample_rate = 44100;
|
| - out.device.matched_output.channel_layout = media::CHANNEL_LAYOUT_STEREO;
|
| - }
|
| - } else {
|
| - // TODO(tommi): As is, we hit this code path when device.type is
|
| - // MEDIA_TAB_AUDIO_CAPTURE and the device id is not a device that
|
| - // the AudioManager can know about. This currently does not fail because
|
| - // the implementation of GetInputStreamParameters returns valid parameters
|
| - // by default for invalid devices. That behavior is problematic because it
|
| - // causes other parts of the code to attempt to open truly invalid or
|
| - // missing devices and falling back on alternate devices (and likely fail
|
| - // twice in a row). Tab audio capture should not pass through here and
|
| - // GetInputStreamParameters should return invalid parameters for invalid
|
| - // devices.
|
| -
|
| - // Get the preferred sample rate and channel configuration for the
|
| - // audio device.
|
| - media::AudioParameters params =
|
| - audio_manager_->GetInputStreamParameters(device.id);
|
| - input_params.sample_rate = params.sample_rate();
|
| - input_params.channel_layout = params.channel_layout();
|
| - input_params.frames_per_buffer = params.frames_per_buffer();
|
| - input_params.effects = params.effects();
|
| - input_params.mic_positions = params.mic_positions();
|
| - if (!out.device.matched_output_device_id.empty()) {
|
| - params = audio_manager_->GetOutputStreamParameters(
|
| - out.device.matched_output_device_id);
|
| - MediaStreamDevice::AudioDeviceParameters& matched_output_params =
|
| - out.device.matched_output;
|
| - matched_output_params.sample_rate = params.sample_rate();
|
| - matched_output_params.channel_layout = params.channel_layout();
|
| - matched_output_params.frames_per_buffer = params.frames_per_buffer();
|
| - }
|
| - }
|
| -
|
| - // Return the |session_id| through the listener by posting a task on
|
| - // IO thread since MediaStreamManager handles the callback asynchronously.
|
| - BrowserThread::PostTask(BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(&AudioInputDeviceManager::OpenedOnIOThread,
|
| - this, session_id, out));
|
| -}
|
| -
|
| -void AudioInputDeviceManager::OpenedOnIOThread(int session_id,
|
| - const StreamDeviceInfo& info) {
|
| + const MediaStreamDevice& device,
|
| + base::TimeTicks start_time,
|
| + const media::AudioParameters& input_params,
|
| + const media::AudioParameters& matched_output_params,
|
| + const std::string& matched_output_device_id) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - DCHECK_EQ(session_id, info.session_id);
|
| DCHECK(GetDevice(session_id) == devices_.end());
|
|
|
| + UMA_HISTOGRAM_TIMES("Media.AudioInputDeviceManager.OpenOnDeviceThreadTime",
|
| + base::TimeTicks::Now() - start_time);
|
| +
|
| + StreamDeviceInfo info(device.type, device.name, device.id);
|
| + info.session_id = session_id;
|
| + info.device.input.sample_rate = input_params.sample_rate();
|
| + info.device.input.channel_layout = input_params.channel_layout();
|
| + info.device.input.frames_per_buffer = input_params.frames_per_buffer();
|
| + info.device.input.effects = input_params.effects();
|
| + info.device.input.mic_positions = input_params.mic_positions();
|
| + info.device.matched_output_device_id = matched_output_device_id;
|
| + info.device.matched_output.sample_rate = matched_output_params.sample_rate();
|
| + info.device.matched_output.channel_layout =
|
| + matched_output_params.channel_layout();
|
| + info.device.matched_output.frames_per_buffer =
|
| + matched_output_params.frames_per_buffer();
|
| + info.device.matched_output.effects = matched_output_params.effects();
|
| +
|
| devices_.push_back(info);
|
|
|
| for (auto& listener : listeners_)
|
| @@ -220,9 +199,6 @@ void AudioInputDeviceManager::ClosedOnIOThread(MediaStreamType stream_type,
|
| listener.Closed(stream_type, session_id);
|
| }
|
|
|
| -bool AudioInputDeviceManager::IsOnDeviceThread() const {
|
| - return device_task_runner_->BelongsToCurrentThread();
|
| -}
|
|
|
| AudioInputDeviceManager::StreamDeviceList::iterator
|
| AudioInputDeviceManager::GetDevice(int session_id) {
|
| @@ -243,5 +219,4 @@ void AudioInputDeviceManager::SetKeyboardMicStreamActiveOnUIThread(
|
| }
|
| #endif
|
|
|
| -
|
| } // namespace content
|
|
|