[go: nahoru, domu]

blob: 74718054e4ed2cb8d3b5e293b6489a722d363b43 [file] [log] [blame]
olkaef762c92017-02-06 16:45:161// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/audio/audio_system_impl.h"
6
Max Morin64be5b22018-05-24 22:01:137#include <utility>
8
olkaef762c92017-02-06 16:45:169#include "base/memory/ptr_util.h"
10#include "base/single_thread_task_runner.h"
11#include "base/task_runner_util.h"
Max Morin64be5b22018-05-24 22:01:1312#include "media/audio/audio_device_description.h"
Olga Sharonovae7b1eb22017-09-13 14:41:4713#include "media/audio/audio_manager.h"
olka3dfb4cf2017-04-11 15:43:2814#include "media/base/bind_to_current_loop.h"
olkaef762c92017-02-06 16:45:1615
Olga Sharonovae7b1eb22017-09-13 14:41:4716// Using base::Unretained for |audio_manager_| is safe since AudioManager is
17// deleted after audio thread is stopped.
Olga Sharonova9b1ae1e2017-09-04 12:24:2918
19// No need to bind the callback to the current loop if we are on the audio
20// thread. However, the client still expects to receive the reply
21// asynchronously, so we always post the helper function, which will
22// syncronously call the (bound to current loop or not) callback. Thus the
23// client always receives the callback on the thread it accesses AudioSystem on.
24
olkaef762c92017-02-06 16:45:1625namespace media {
26
Olga Sharonovae7b1eb22017-09-13 14:41:4727namespace {
28
29void GetInputStreamParametersOnAudioThread(
30 AudioManager* audio_manager,
31 const std::string& device_id,
32 AudioSystem::OnAudioParamsCallback on_params_cb) {
33 AudioSystemHelper(audio_manager)
34 .GetInputStreamParameters(device_id, std::move(on_params_cb));
35}
36
37void GetOutputStreamParametersOnAudioThread(
38 AudioManager* audio_manager,
39 const std::string& device_id,
40 AudioSystem::OnAudioParamsCallback on_params_cb) {
41 AudioSystemHelper(audio_manager)
42 .GetOutputStreamParameters(device_id, std::move(on_params_cb));
43}
44
45void HasInputDevicesOnAudioThread(
46 AudioManager* audio_manager,
47 AudioSystem::OnBoolCallback on_has_devices_cb) {
48 AudioSystemHelper(audio_manager)
49 .HasInputDevices(std::move(on_has_devices_cb));
50}
51
52void HasOutputDevicesOnAudioThread(
53 AudioManager* audio_manager,
54 AudioSystem::OnBoolCallback on_has_devices_cb) {
55 AudioSystemHelper(audio_manager)
56 .HasOutputDevices(std::move(on_has_devices_cb));
57}
58
59void GetDeviceDescriptionsOnAudioThread(
60 AudioManager* audio_manager,
61 bool for_input,
62 AudioSystem::OnDeviceDescriptionsCallback on_descriptions_cb) {
63 AudioSystemHelper(audio_manager)
64 .GetDeviceDescriptions(for_input, std::move(on_descriptions_cb));
65}
66
67void GetAssociatedOutputDeviceIDOnAudioThread(
68 AudioManager* audio_manager,
69 const std::string& input_device_id,
70 AudioSystem::OnDeviceIdCallback on_device_id_cb) {
71 AudioSystemHelper(audio_manager)
72 .GetAssociatedOutputDeviceID(input_device_id, std::move(on_device_id_cb));
73}
74
75void GetInputDeviceInfoOnAudioThread(
76 AudioManager* audio_manager,
77 const std::string& input_device_id,
78 AudioSystem::OnInputDeviceInfoCallback on_input_device_info_cb) {
79 AudioSystemHelper(audio_manager)
80 .GetInputDeviceInfo(input_device_id, std::move(on_input_device_info_cb));
81}
82
83} // namespace
84
Olga Sharonova9b1ae1e2017-09-04 12:24:2985template <typename... Args>
86inline base::OnceCallback<void(Args...)>
87AudioSystemImpl::MaybeBindToCurrentLoop(
88 base::OnceCallback<void(Args...)> callback) {
Olga Sharonovae7b1eb22017-09-13 14:41:4789 return audio_manager_->GetTaskRunner()->BelongsToCurrentThread()
Olga Sharonova9b1ae1e2017-09-04 12:24:2990 ? std::move(callback)
91 : media::BindToCurrentLoop(std::move(callback));
92}
93
Olga Sharonovaa234a0a2018-02-16 11:12:2394// static
95std::unique_ptr<AudioSystem> AudioSystemImpl::CreateInstance() {
96 DCHECK(AudioManager::Get()) << "AudioManager instance is not created";
97 return std::make_unique<AudioSystemImpl>(AudioManager::Get());
98}
99
olkaef762c92017-02-06 16:45:16100AudioSystemImpl::AudioSystemImpl(AudioManager* audio_manager)
Olga Sharonovae7b1eb22017-09-13 14:41:47101 : audio_manager_(audio_manager) {
102 DETACH_FROM_THREAD(thread_checker_);
olkaef762c92017-02-06 16:45:16103}
104
105void AudioSystemImpl::GetInputStreamParameters(
106 const std::string& device_id,
Olga Sharonova62ff2e02017-08-31 22:27:26107 OnAudioParamsCallback on_params_cb) {
Olga Sharonovae7b1eb22017-09-13 14:41:47108 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
109 audio_manager_->GetTaskRunner()->PostTask(
Olga Sharonova9b1ae1e2017-09-04 12:24:29110 FROM_HERE,
Olga Sharonovae7b1eb22017-09-13 14:41:47111 base::BindOnce(&GetInputStreamParametersOnAudioThread,
112 base::Unretained(audio_manager_), device_id,
Olga Sharonova9b1ae1e2017-09-04 12:24:29113 MaybeBindToCurrentLoop(std::move(on_params_cb))));
olkaef762c92017-02-06 16:45:16114}
115
olkaa39bab42017-03-14 17:10:15116void AudioSystemImpl::GetOutputStreamParameters(
117 const std::string& device_id,
Olga Sharonova62ff2e02017-08-31 22:27:26118 OnAudioParamsCallback on_params_cb) {
Olga Sharonovae7b1eb22017-09-13 14:41:47119 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
120 audio_manager_->GetTaskRunner()->PostTask(
Olga Sharonova9b1ae1e2017-09-04 12:24:29121 FROM_HERE,
Olga Sharonovae7b1eb22017-09-13 14:41:47122 base::BindOnce(&GetOutputStreamParametersOnAudioThread,
123 base::Unretained(audio_manager_), device_id,
Olga Sharonova9b1ae1e2017-09-04 12:24:29124 MaybeBindToCurrentLoop(std::move(on_params_cb))));
olkaa39bab42017-03-14 17:10:15125}
126
Olga Sharonova62ff2e02017-08-31 22:27:26127void AudioSystemImpl::HasInputDevices(OnBoolCallback on_has_devices_cb) {
Olga Sharonovae7b1eb22017-09-13 14:41:47128 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
129 audio_manager_->GetTaskRunner()->PostTask(
Olga Sharonova9b1ae1e2017-09-04 12:24:29130 FROM_HERE,
Olga Sharonovae7b1eb22017-09-13 14:41:47131 base::BindOnce(&HasInputDevicesOnAudioThread,
132 base::Unretained(audio_manager_),
Olga Sharonova9b1ae1e2017-09-04 12:24:29133 MaybeBindToCurrentLoop(std::move(on_has_devices_cb))));
olkaf6088702017-02-10 19:52:09134}
135
Olga Sharonova62ff2e02017-08-31 22:27:26136void AudioSystemImpl::HasOutputDevices(OnBoolCallback on_has_devices_cb) {
Olga Sharonovae7b1eb22017-09-13 14:41:47137 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
138 audio_manager_->GetTaskRunner()->PostTask(
Olga Sharonova9b1ae1e2017-09-04 12:24:29139 FROM_HERE,
Olga Sharonovae7b1eb22017-09-13 14:41:47140 base::BindOnce(&HasOutputDevicesOnAudioThread,
141 base::Unretained(audio_manager_),
Olga Sharonova9b1ae1e2017-09-04 12:24:29142 MaybeBindToCurrentLoop(std::move(on_has_devices_cb))));
olkae1920d92017-04-07 14:52:31143}
144
olka4e2655a2017-03-21 18:17:15145void AudioSystemImpl::GetDeviceDescriptions(
Olga Sharonova62ff2e02017-08-31 22:27:26146 bool for_input,
147 OnDeviceDescriptionsCallback on_descriptions_cb) {
Olga Sharonovae7b1eb22017-09-13 14:41:47148 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
149 audio_manager_->GetTaskRunner()->PostTask(
Max Morin64be5b22018-05-24 22:01:13150 FROM_HERE, base::BindOnce(&GetDeviceDescriptionsOnAudioThread,
151 base::Unretained(audio_manager_), for_input,
152 MaybeBindToCurrentLoop(
153 WrapCallbackWithDeviceNameLocalization(
154 std::move(on_descriptions_cb)))));
olka4e2655a2017-03-21 18:17:15155}
156
olka3dfb4cf2017-04-11 15:43:28157void AudioSystemImpl::GetAssociatedOutputDeviceID(
158 const std::string& input_device_id,
159 OnDeviceIdCallback on_device_id_cb) {
Olga Sharonovae7b1eb22017-09-13 14:41:47160 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
161 audio_manager_->GetTaskRunner()->PostTask(
Olga Sharonova9b1ae1e2017-09-04 12:24:29162 FROM_HERE,
Olga Sharonovae7b1eb22017-09-13 14:41:47163 base::BindOnce(&GetAssociatedOutputDeviceIDOnAudioThread,
164 base::Unretained(audio_manager_), input_device_id,
Olga Sharonova9b1ae1e2017-09-04 12:24:29165 MaybeBindToCurrentLoop(std::move(on_device_id_cb))));
olka3dfb4cf2017-04-11 15:43:28166}
167
168void AudioSystemImpl::GetInputDeviceInfo(
169 const std::string& input_device_id,
170 OnInputDeviceInfoCallback on_input_device_info_cb) {
Olga Sharonovae7b1eb22017-09-13 14:41:47171 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
172 audio_manager_->GetTaskRunner()->PostTask(
173 FROM_HERE,
174 base::BindOnce(
175 &GetInputDeviceInfoOnAudioThread, base::Unretained(audio_manager_),
176 input_device_id,
177 MaybeBindToCurrentLoop(std::move(on_input_device_info_cb))));
Olga Sharonovabb578122017-08-31 19:18:38178}
179
olkaef762c92017-02-06 16:45:16180} // namespace media