1 // Copyright 2016 The Android Open Source Project
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
16 // Implementation of brillo_audio_manager.h.
18 #include "include/brillo_audio_manager.h"
23 #include "audio_service_callback.h"
24 #include "brillo_audio_client.h"
25 #include "brillo_audio_client_helpers.h"
26 #include "brillo_audio_device_info_def.h"
27 #include "brillo_audio_device_info_internal.h"
29 using brillo::AudioServiceCallback;
30 using brillo::BrilloAudioClient;
31 using brillo::BrilloAudioClientHelpers;
33 struct BAudioManager {
34 std::weak_ptr<BrilloAudioClient> client_;
37 BAudioManager* BAudioManager_new() {
38 auto client = BrilloAudioClient::GetClientInstance();
41 BAudioManager* bam = new BAudioManager;
42 bam->client_ = client;
46 int BAudioManager_getDevices(
47 const BAudioManager* brillo_audio_manager, int flag,
48 BAudioDeviceInfo* device_array[], unsigned int size,
49 unsigned int* num_devices) {
50 if (!brillo_audio_manager || !num_devices ||
51 (flag != GET_DEVICES_INPUTS && flag != GET_DEVICES_OUTPUTS))
53 auto client = brillo_audio_manager->client_.lock();
58 std::vector<int> devices;
59 auto rc = client->GetDevices(flag, devices);
64 unsigned int num_elems = (devices.size() < size) ? devices.size() : size;
65 for (size_t i = 0; i < num_elems; i++) {
66 device_array[i] = new BAudioDeviceInfo;
67 device_array[i]->internal_ = std::unique_ptr<BAudioDeviceInfoInternal>(
68 BAudioDeviceInfoInternal::CreateFromAudioDevicesT(devices[i]));
70 *num_devices = devices.size();
74 int BAudioManager_setInputDevice(const BAudioManager* brillo_audio_manager,
75 const BAudioDeviceInfo* device) {
76 if (!brillo_audio_manager || !device)
78 auto client = brillo_audio_manager->client_.lock();
82 return client->SetDevice(AUDIO_POLICY_FORCE_FOR_RECORD,
83 device->internal_->GetConfig());
86 int BAudioManager_setOutputDevice(
87 const BAudioManager* brillo_audio_manager, const BAudioDeviceInfo* device,
89 if (!brillo_audio_manager || !device)
91 auto client = brillo_audio_manager->client_.lock();
94 return client->SetDevice(BrilloAudioClientHelpers::GetForceUse(usage),
95 device->internal_->GetConfig());
98 int BAudioManager_getMaxVolumeSteps(const BAudioManager* brillo_audio_manager,
101 if (!brillo_audio_manager || !max_steps)
103 auto client = brillo_audio_manager->client_.lock();
106 return client->GetMaxVolumeSteps(usage, max_steps);
109 int BAudioManager_setMaxVolumeSteps(const BAudioManager* brillo_audio_manager,
112 if (!brillo_audio_manager || max_steps < 0 || max_steps > 100)
114 auto client = brillo_audio_manager->client_.lock();
117 return client->SetMaxVolumeSteps(usage, max_steps);
120 int BAudioManager_setVolumeIndex(const BAudioManager* brillo_audio_manager,
122 const BAudioDeviceInfo* device,
124 if (!brillo_audio_manager || !device) {
127 auto client = brillo_audio_manager->client_.lock();
131 return client->SetVolumeIndex(
132 usage, device->internal_->GetAudioDevicesT(), index);
135 int BAudioManager_getVolumeIndex(const BAudioManager* brillo_audio_manager,
137 const BAudioDeviceInfo* device,
139 if (!brillo_audio_manager || !device || !index) {
142 auto client = brillo_audio_manager->client_.lock();
146 return client->GetVolumeIndex(
147 usage, device->internal_->GetAudioDevicesT(), index);
150 int BAudioManager_getVolumeControlUsage(
151 const BAudioManager* brillo_audio_manager, BAudioUsage* usage) {
152 if (!brillo_audio_manager || !usage) {
155 auto client = brillo_audio_manager->client_.lock();
159 return client->GetVolumeControlStream(usage);
162 int BAudioManager_setVolumeControlUsage(
163 const BAudioManager* brillo_audio_manager, BAudioUsage usage) {
164 if (!brillo_audio_manager) {
167 auto client = brillo_audio_manager->client_.lock();
171 return client->SetVolumeControlStream(usage);
174 int BAudioManager_incrementVolume(const BAudioManager* brillo_audio_manager) {
175 if (!brillo_audio_manager) {
178 auto client = brillo_audio_manager->client_.lock();
182 return client->IncrementVolume();
185 int BAudioManager_decrementVolume(const BAudioManager* brillo_audio_manager) {
186 if (!brillo_audio_manager) {
189 auto client = brillo_audio_manager->client_.lock();
193 return client->DecrementVolume();
196 int BAudioManager_registerAudioCallback(
197 const BAudioManager* brillo_audio_manager, const BAudioCallback* callback,
198 void* user_data, int* callback_id) {
199 if (!brillo_audio_manager || !callback || !callback_id)
201 auto client = brillo_audio_manager->client_.lock();
206 // This copies the BAudioCallback into AudioServiceCallback so the
207 // BAudioCallback can be safely deleted.
208 return client->RegisterAudioCallback(
209 new AudioServiceCallback(callback, user_data), callback_id);
212 int BAudioManager_unregisterAudioCallback(
213 const BAudioManager* brillo_audio_manager, int callback_id) {
214 if (!brillo_audio_manager)
216 auto client = brillo_audio_manager->client_.lock();
219 return client->UnregisterAudioCallback(callback_id);
222 int BAudioManager_delete(BAudioManager* brillo_audio_manager) {
223 if (!brillo_audio_manager)
225 delete brillo_audio_manager;