| Index: media/audio/audio_system_impl.cc
|
| diff --git a/media/audio/audio_system_impl.cc b/media/audio/audio_system_impl.cc
|
| index 7504744d42173a3c2529a59f3e169970821f94de..9d009aa5079c9d47b692ab38e13920e5ea12a85c 100644
|
| --- a/media/audio/audio_system_impl.cc
|
| +++ b/media/audio/audio_system_impl.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/task_runner_util.h"
|
| #include "media/audio/audio_device_description.h"
|
| #include "media/audio/audio_manager.h"
|
| +#include "media/base/bind_to_current_loop.h"
|
|
|
| // Using base::Unretained for |audio_manager_| is safe since it is deleted after
|
| // its task runner, and AudioSystemImpl is deleted on the UI thread after the IO
|
| @@ -57,6 +58,23 @@ AudioDeviceDescriptions GetDeviceDescriptionsOnDeviceThread(
|
| return descriptions;
|
| }
|
|
|
| +void GetInputDeviceInfoOnDeviceThread(
|
| + AudioManager* audio_manager,
|
| + const std::string& input_device_id,
|
| + AudioSystem::OnInputDeviceInfoCallback on_input_device_info_cb) {
|
| + DCHECK(audio_manager->GetTaskRunner()->BelongsToCurrentThread());
|
| + const std::string associated_output_device_id =
|
| + audio_manager->GetAssociatedOutputDeviceID(input_device_id);
|
| +
|
| + on_input_device_info_cb.Run(
|
| + GetInputParametersOnDeviceThread(audio_manager, input_device_id),
|
| + associated_output_device_id.empty()
|
| + ? AudioParameters()
|
| + : GetOutputParametersOnDeviceThread(audio_manager,
|
| + associated_output_device_id),
|
| + associated_output_device_id);
|
| +}
|
| +
|
| } // namespace
|
|
|
| AudioSystemImpl::AudioSystemImpl(AudioManager* audio_manager)
|
| @@ -136,11 +154,11 @@ void AudioSystemImpl::HasOutputDevices(OnBoolCallback on_has_devices_cb) const {
|
| }
|
|
|
| void AudioSystemImpl::GetDeviceDescriptions(
|
| - OnDeviceDescriptionsCallback on_descriptions_cp,
|
| + OnDeviceDescriptionsCallback on_descriptions_cb,
|
| bool for_input) {
|
| if (GetTaskRunner()->BelongsToCurrentThread()) {
|
| GetTaskRunner()->PostTask(
|
| - FROM_HERE, base::Bind(on_descriptions_cp,
|
| + FROM_HERE, base::Bind(on_descriptions_cb,
|
| base::Passed(GetDeviceDescriptionsOnDeviceThread(
|
| audio_manager_, for_input))));
|
| return;
|
| @@ -150,11 +168,40 @@ void AudioSystemImpl::GetDeviceDescriptions(
|
| GetTaskRunner(), FROM_HERE,
|
| base::Bind(&GetDeviceDescriptionsOnDeviceThread,
|
| base::Unretained(audio_manager_), for_input),
|
| - std::move(on_descriptions_cp));
|
| + std::move(on_descriptions_cb));
|
| +}
|
| +
|
| +void AudioSystemImpl::GetAssociatedOutputDeviceID(
|
| + const std::string& input_device_id,
|
| + OnDeviceIdCallback on_device_id_cb) {
|
| + if (GetTaskRunner()->BelongsToCurrentThread()) {
|
| + GetTaskRunner()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(on_device_id_cb, audio_manager_->GetAssociatedOutputDeviceID(
|
| + input_device_id)));
|
| + return;
|
| + }
|
| + base::PostTaskAndReplyWithResult(
|
| + GetTaskRunner(), FROM_HERE,
|
| + base::Bind(&AudioManager::GetAssociatedOutputDeviceID,
|
| + base::Unretained(audio_manager_), input_device_id),
|
| + std::move(on_device_id_cb));
|
| }
|
|
|
| -AudioManager* AudioSystemImpl::GetAudioManager() const {
|
| - return audio_manager_;
|
| +void AudioSystemImpl::GetInputDeviceInfo(
|
| + const std::string& input_device_id,
|
| + OnInputDeviceInfoCallback on_input_device_info_cb) {
|
| + // No need to bind |on_input_device_info_cb| to the current loop if we are on
|
| + // the audio thread. However, the client still expect to receive the reply
|
| + // asynchronously, so we always post GetInputDeviceInfoOnDeviceThread(), which
|
| + // will syncronously call the (bound to current loop or not) callback.
|
| + GetTaskRunner()->PostTask(
|
| + FROM_HERE, base::Bind(&GetInputDeviceInfoOnDeviceThread,
|
| + base::Unretained(audio_manager_), input_device_id,
|
| + GetTaskRunner()->BelongsToCurrentThread()
|
| + ? std::move(on_input_device_info_cb)
|
| + : media::BindToCurrentLoop(
|
| + std::move(on_input_device_info_cb))));
|
| }
|
|
|
| base::SingleThreadTaskRunner* AudioSystemImpl::GetTaskRunner() const {
|
|
|