1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "AudioPolicyClientImpl"
18 //#define LOG_NDEBUG 0
19 
20 #include "AudioPolicyService.h"
21 
22 #include <utils/Log.h>
23 
24 #include "BinderProxy.h"
25 
26 namespace android {
27 
28 /* implementation of the client interface from the policy manager */
29 
loadHwModule(const char * name)30 audio_module_handle_t AudioPolicyService::AudioPolicyClient::loadHwModule(const char *name)
31 {
32     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
33     if (af == 0) {
34         ALOGW("%s: could not get AudioFlinger", __func__);
35         return AUDIO_MODULE_HANDLE_NONE;
36     }
37 
38     return af->loadHwModule(name);
39 }
40 
openOutput(audio_module_handle_t module,audio_io_handle_t * output,audio_config_t * halConfig,audio_config_base_t * mixerConfig,const sp<DeviceDescriptorBase> & device,uint32_t * latencyMs,audio_output_flags_t flags)41 status_t AudioPolicyService::AudioPolicyClient::openOutput(audio_module_handle_t module,
42                                                            audio_io_handle_t *output,
43                                                            audio_config_t *halConfig,
44                                                            audio_config_base_t *mixerConfig,
45                                                            const sp<DeviceDescriptorBase>& device,
46                                                            uint32_t *latencyMs,
47                                                            audio_output_flags_t flags)
48 {
49     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
50     if (af == 0) {
51         ALOGW("%s: could not get AudioFlinger", __func__);
52         return PERMISSION_DENIED;
53     }
54 
55     media::OpenOutputRequest request;
56     media::OpenOutputResponse response;
57 
58     request.module = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_module_handle_t_int32_t(module));
59     request.halConfig = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(*halConfig));
60     request.mixerConfig =
61             VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_base_t_AudioConfigBase(*mixerConfig));
62     request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_DeviceDescriptorBase(device));
63     request.flags = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_output_flags_t_int32_t_mask(flags));
64 
65     status_t status = af->openOutput(request, &response);
66     if (status == OK) {
67         *output = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_io_handle_t(response.output));
68         *halConfig =
69                 VALUE_OR_RETURN_STATUS(aidl2legacy_AudioConfig_audio_config_t(response.config));
70         *latencyMs = VALUE_OR_RETURN_STATUS(convertIntegral<uint32_t>(response.latencyMs));
71     }
72     return status;
73 }
74 
openDuplicateOutput(audio_io_handle_t output1,audio_io_handle_t output2)75 audio_io_handle_t AudioPolicyService::AudioPolicyClient::openDuplicateOutput(
76                                                                 audio_io_handle_t output1,
77                                                                 audio_io_handle_t output2)
78 {
79     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
80     if (af == 0) {
81         ALOGW("%s: could not get AudioFlinger", __func__);
82         return 0;
83     }
84     return af->openDuplicateOutput(output1, output2);
85 }
86 
closeOutput(audio_io_handle_t output)87 status_t AudioPolicyService::AudioPolicyClient::closeOutput(audio_io_handle_t output)
88 {
89     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
90     if (af == 0) {
91         return PERMISSION_DENIED;
92     }
93 
94     return af->closeOutput(output);
95 }
96 
suspendOutput(audio_io_handle_t output)97 status_t AudioPolicyService::AudioPolicyClient::suspendOutput(audio_io_handle_t output)
98 {
99     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
100     if (af == 0) {
101         ALOGW("%s: could not get AudioFlinger", __func__);
102         return PERMISSION_DENIED;
103     }
104 
105     return af->suspendOutput(output);
106 }
107 
restoreOutput(audio_io_handle_t output)108 status_t AudioPolicyService::AudioPolicyClient::restoreOutput(audio_io_handle_t output)
109 {
110     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
111     if (af == 0) {
112         ALOGW("%s: could not get AudioFlinger", __func__);
113         return PERMISSION_DENIED;
114     }
115 
116     return af->restoreOutput(output);
117 }
118 
openInput(audio_module_handle_t module,audio_io_handle_t * input,audio_config_t * config,audio_devices_t * device,const String8 & address,audio_source_t source,audio_input_flags_t flags)119 status_t AudioPolicyService::AudioPolicyClient::openInput(audio_module_handle_t module,
120                                                           audio_io_handle_t *input,
121                                                           audio_config_t *config,
122                                                           audio_devices_t *device,
123                                                           const String8& address,
124                                                           audio_source_t source,
125                                                           audio_input_flags_t flags)
126 {
127     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
128     if (af == 0) {
129         ALOGW("%s: could not get AudioFlinger", __func__);
130         return PERMISSION_DENIED;
131     }
132 
133     AudioDeviceTypeAddr deviceTypeAddr(*device, address.c_str());
134 
135     media::OpenInputRequest request;
136     request.module = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_module_handle_t_int32_t(module));
137     request.input = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(*input));
138     request.config = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(*config));
139     request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(deviceTypeAddr));
140     request.source = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_source_t_AudioSourceType(source));
141     request.flags = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_input_flags_t_int32_t_mask(flags));
142 
143     media::OpenInputResponse response;
144     status_t status = af->openInput(request, &response);
145     if (status == OK) {
146         *input = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_module_handle_t(response.input));
147     }
148     return status;
149 }
150 
closeInput(audio_io_handle_t input)151 status_t AudioPolicyService::AudioPolicyClient::closeInput(audio_io_handle_t input)
152 {
153     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
154     if (af == 0) {
155         return PERMISSION_DENIED;
156     }
157 
158     return af->closeInput(input);
159 }
160 
setStreamVolume(audio_stream_type_t stream,float volume,audio_io_handle_t output,int delay_ms)161 status_t AudioPolicyService::AudioPolicyClient::setStreamVolume(audio_stream_type_t stream,
162                      float volume, audio_io_handle_t output,
163                      int delay_ms)
164 {
165     return mAudioPolicyService->setStreamVolume(stream, volume, output,
166                                                delay_ms);
167 }
168 
invalidateStream(audio_stream_type_t stream)169 status_t AudioPolicyService::AudioPolicyClient::invalidateStream(audio_stream_type_t stream)
170 {
171     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
172     if (af == 0) {
173         return PERMISSION_DENIED;
174     }
175 
176     return af->invalidateStream(stream);
177 }
178 
setParameters(audio_io_handle_t io_handle,const String8 & keyValuePairs,int delay_ms)179 void AudioPolicyService::AudioPolicyClient::setParameters(audio_io_handle_t io_handle,
180                    const String8& keyValuePairs,
181                    int delay_ms)
182 {
183     mAudioPolicyService->setParameters(io_handle, keyValuePairs.string(), delay_ms);
184 }
185 
getParameters(audio_io_handle_t io_handle,const String8 & keys)186 String8 AudioPolicyService::AudioPolicyClient::getParameters(audio_io_handle_t io_handle,
187                       const String8& keys)
188 {
189     String8 result = AudioSystem::getParameters(io_handle, keys);
190     return result;
191 }
192 
setVoiceVolume(float volume,int delay_ms)193 status_t AudioPolicyService::AudioPolicyClient::setVoiceVolume(float volume, int delay_ms)
194 {
195     return mAudioPolicyService->setVoiceVolume(volume, delay_ms);
196 }
197 
moveEffects(audio_session_t session,audio_io_handle_t src_output,audio_io_handle_t dst_output)198 status_t AudioPolicyService::AudioPolicyClient::moveEffects(audio_session_t session,
199                         audio_io_handle_t src_output,
200                         audio_io_handle_t dst_output)
201 {
202     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
203     if (af == 0) {
204         return PERMISSION_DENIED;
205     }
206 
207     return af->moveEffects(session, src_output, dst_output);
208 }
209 
setEffectSuspended(int effectId,audio_session_t sessionId,bool suspended)210 void AudioPolicyService::AudioPolicyClient::setEffectSuspended(int effectId,
211                                 audio_session_t sessionId,
212                                 bool suspended)
213 {
214     mAudioPolicyService->setEffectSuspended(effectId, sessionId, suspended);
215 }
216 
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle,int delayMs)217 status_t AudioPolicyService::AudioPolicyClient::createAudioPatch(const struct audio_patch *patch,
218                                                                   audio_patch_handle_t *handle,
219                                                                   int delayMs)
220 {
221     return mAudioPolicyService->clientCreateAudioPatch(patch, handle, delayMs);
222 }
223 
releaseAudioPatch(audio_patch_handle_t handle,int delayMs)224 status_t AudioPolicyService::AudioPolicyClient::releaseAudioPatch(audio_patch_handle_t handle,
225                                                                   int delayMs)
226 {
227     return mAudioPolicyService->clientReleaseAudioPatch(handle, delayMs);
228 }
229 
setAudioPortConfig(const struct audio_port_config * config,int delayMs)230 status_t AudioPolicyService::AudioPolicyClient::setAudioPortConfig(
231                                                         const struct audio_port_config *config,
232                                                         int delayMs)
233 {
234     return mAudioPolicyService->clientSetAudioPortConfig(config, delayMs);
235 }
236 
onAudioPortListUpdate()237 void AudioPolicyService::AudioPolicyClient::onAudioPortListUpdate()
238 {
239     mAudioPolicyService->onAudioPortListUpdate();
240 }
241 
onAudioPatchListUpdate()242 void AudioPolicyService::AudioPolicyClient::onAudioPatchListUpdate()
243 {
244     mAudioPolicyService->onAudioPatchListUpdate();
245 }
246 
onDynamicPolicyMixStateUpdate(String8 regId,int32_t state)247 void AudioPolicyService::AudioPolicyClient::onDynamicPolicyMixStateUpdate(
248         String8 regId, int32_t state)
249 {
250     mAudioPolicyService->onDynamicPolicyMixStateUpdate(regId, state);
251 }
252 
onRecordingConfigurationUpdate(int event,const record_client_info_t * clientInfo,const audio_config_base_t * clientConfig,std::vector<effect_descriptor_t> clientEffects,const audio_config_base_t * deviceConfig,std::vector<effect_descriptor_t> effects,audio_patch_handle_t patchHandle,audio_source_t source)253 void AudioPolicyService::AudioPolicyClient::onRecordingConfigurationUpdate(
254                                                     int event,
255                                                     const record_client_info_t *clientInfo,
256                                                     const audio_config_base_t *clientConfig,
257                                                     std::vector<effect_descriptor_t> clientEffects,
258                                                     const audio_config_base_t *deviceConfig,
259                                                     std::vector<effect_descriptor_t> effects,
260                                                     audio_patch_handle_t patchHandle,
261                                                     audio_source_t source)
262 {
263     mAudioPolicyService->onRecordingConfigurationUpdate(event, clientInfo,
264             clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
265 }
266 
onAudioVolumeGroupChanged(volume_group_t group,int flags)267 void AudioPolicyService::AudioPolicyClient::onAudioVolumeGroupChanged(volume_group_t group,
268                                                                       int flags)
269 {
270     mAudioPolicyService->onAudioVolumeGroupChanged(group, flags);
271 }
272 
onRoutingUpdated()273 void AudioPolicyService::AudioPolicyClient::onRoutingUpdated()
274 {
275     mAudioPolicyService->onRoutingUpdated();
276 }
277 
newAudioUniqueId(audio_unique_id_use_t use)278 audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId(audio_unique_id_use_t use)
279 {
280     return AudioSystem::newAudioUniqueId(use);
281 }
282 
setSoundTriggerCaptureState(bool active)283 void AudioPolicyService::AudioPolicyClient::setSoundTriggerCaptureState(bool active)
284 {
285     mAudioPolicyService->mCaptureStateNotifier.setCaptureState(active);
286 }
287 
getAudioPort(struct audio_port_v7 * port)288 status_t AudioPolicyService::AudioPolicyClient::getAudioPort(struct audio_port_v7 *port)
289 {
290     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
291     if (af == 0) {
292         ALOGW("%s: could not get AudioFlinger", __func__);
293         return PERMISSION_DENIED;
294     }
295     return af->getAudioPort(port);
296 }
297 
updateSecondaryOutputs(const TrackSecondaryOutputsMap & trackSecondaryOutputs)298 status_t AudioPolicyService::AudioPolicyClient::updateSecondaryOutputs(
299         const TrackSecondaryOutputsMap& trackSecondaryOutputs) {
300     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
301     if (af == nullptr) {
302         ALOGW("%s: could not get AudioFlinger", __func__);
303         return PERMISSION_DENIED;
304     }
305     return af->updateSecondaryOutputs(trackSecondaryOutputs);
306 }
307 
308 } // namespace android
309