blob: 90b93e2cd380aaed487ff83b2502143b133b1a17 [file] [log] [blame]
Eric Laurent2d388ec2014-03-07 13:25:54 -08001/*
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
Eric Laurentdce54a12014-03-10 12:19:46 -070017#define LOG_TAG "AudioPolicyClientImpl"
Eric Laurent2d388ec2014-03-07 13:25:54 -080018//#define LOG_NDEBUG 0
19
Eric Laurent2d388ec2014-03-07 13:25:54 -080020#include "AudioPolicyService.h"
Eric Laurent2d388ec2014-03-07 13:25:54 -080021
Ytai Ben-Tsvi74cd6b02019-10-25 10:06:40 -070022#include <utils/Log.h>
23
24#include "BinderProxy.h"
25
Eric Laurent2d388ec2014-03-07 13:25:54 -080026namespace android {
27
Eric Laurentdce54a12014-03-10 12:19:46 -070028/* implementation of the client interface from the policy manager */
Eric Laurent2d388ec2014-03-07 13:25:54 -080029
Eric Laurentdce54a12014-03-10 12:19:46 -070030audio_module_handle_t AudioPolicyService::AudioPolicyClient::loadHwModule(const char *name)
Eric Laurent2d388ec2014-03-07 13:25:54 -080031{
32 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
33 if (af == 0) {
34 ALOGW("%s: could not get AudioFlinger", __func__);
Glenn Kastena13cde92016-03-28 15:26:02 -070035 return AUDIO_MODULE_HANDLE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -080036 }
37
38 return af->loadHwModule(name);
39}
40
Eric Laurentcf2c0212014-07-25 16:20:43 -070041status_t AudioPolicyService::AudioPolicyClient::openOutput(audio_module_handle_t module,
42 audio_io_handle_t *output,
43 audio_config_t *config,
jiabin43810402019-10-24 14:58:31 -070044 const sp<DeviceDescriptorBase>& device,
Eric Laurentcf2c0212014-07-25 16:20:43 -070045 uint32_t *latencyMs,
46 audio_output_flags_t flags)
Eric Laurent2d388ec2014-03-07 13:25:54 -080047{
48 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
49 if (af == 0) {
50 ALOGW("%s: could not get AudioFlinger", __func__);
Eric Laurentcf2c0212014-07-25 16:20:43 -070051 return PERMISSION_DENIED;
Eric Laurent2d388ec2014-03-07 13:25:54 -080052 }
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -080053
54 media::OpenOutputRequest request;
55 media::OpenOutputResponse response;
56
57 request.module = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_module_handle_t_int32_t(module));
58 request.config = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(*config));
59 request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_DeviceDescriptorBase(device));
Andy Hung973638a2020-12-08 20:47:45 -080060 request.flags = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_output_flags_t_int32_t_mask(flags));
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -080061
62 status_t status = af->openOutput(request, &response);
63 if (status == OK) {
64 *output = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_io_handle_t(response.output));
65 *config = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioConfig_audio_config_t(response.config));
66 *latencyMs = VALUE_OR_RETURN_STATUS(convertIntegral<uint32_t>(response.latencyMs));
67 }
68 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -080069}
70
Eric Laurentdce54a12014-03-10 12:19:46 -070071audio_io_handle_t AudioPolicyService::AudioPolicyClient::openDuplicateOutput(
72 audio_io_handle_t output1,
73 audio_io_handle_t output2)
Eric Laurent2d388ec2014-03-07 13:25:54 -080074{
75 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
76 if (af == 0) {
77 ALOGW("%s: could not get AudioFlinger", __func__);
78 return 0;
79 }
80 return af->openDuplicateOutput(output1, output2);
81}
82
Eric Laurentdce54a12014-03-10 12:19:46 -070083status_t AudioPolicyService::AudioPolicyClient::closeOutput(audio_io_handle_t output)
Eric Laurent2d388ec2014-03-07 13:25:54 -080084{
85 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
86 if (af == 0) {
87 return PERMISSION_DENIED;
88 }
89
90 return af->closeOutput(output);
91}
92
Eric Laurentdce54a12014-03-10 12:19:46 -070093status_t AudioPolicyService::AudioPolicyClient::suspendOutput(audio_io_handle_t output)
Eric Laurent2d388ec2014-03-07 13:25:54 -080094{
95 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
96 if (af == 0) {
97 ALOGW("%s: could not get AudioFlinger", __func__);
98 return PERMISSION_DENIED;
99 }
100
101 return af->suspendOutput(output);
102}
103
Eric Laurentdce54a12014-03-10 12:19:46 -0700104status_t AudioPolicyService::AudioPolicyClient::restoreOutput(audio_io_handle_t output)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800105{
106 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
107 if (af == 0) {
108 ALOGW("%s: could not get AudioFlinger", __func__);
109 return PERMISSION_DENIED;
110 }
111
112 return af->restoreOutput(output);
113}
114
Eric Laurentcf2c0212014-07-25 16:20:43 -0700115status_t AudioPolicyService::AudioPolicyClient::openInput(audio_module_handle_t module,
116 audio_io_handle_t *input,
117 audio_config_t *config,
118 audio_devices_t *device,
119 const String8& address,
120 audio_source_t source,
121 audio_input_flags_t flags)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800122{
123 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
124 if (af == 0) {
125 ALOGW("%s: could not get AudioFlinger", __func__);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700126 return PERMISSION_DENIED;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800127 }
128
Ytai Ben-Tsvi12a0b842020-11-05 13:47:32 -0800129 AudioDeviceTypeAddr deviceTypeAddr(*device, address.c_str());
130
131 media::OpenInputRequest request;
132 request.module = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_module_handle_t_int32_t(module));
133 request.input = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(*input));
134 request.config = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(*config));
135 request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(deviceTypeAddr));
136 request.source = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_source_t_AudioSourceType(source));
Andy Hung973638a2020-12-08 20:47:45 -0800137 request.flags = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_input_flags_t_int32_t_mask(flags));
Ytai Ben-Tsvi12a0b842020-11-05 13:47:32 -0800138
139 media::OpenInputResponse response;
140 status_t status = af->openInput(request, &response);
141 if (status == OK) {
142 *input = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_module_handle_t(response.input));
143 }
144 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800145}
146
Eric Laurentdce54a12014-03-10 12:19:46 -0700147status_t AudioPolicyService::AudioPolicyClient::closeInput(audio_io_handle_t input)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800148{
149 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
150 if (af == 0) {
151 return PERMISSION_DENIED;
152 }
153
154 return af->closeInput(input);
155}
156
Eric Laurentdce54a12014-03-10 12:19:46 -0700157status_t AudioPolicyService::AudioPolicyClient::setStreamVolume(audio_stream_type_t stream,
158 float volume, audio_io_handle_t output,
159 int delay_ms)
160{
161 return mAudioPolicyService->setStreamVolume(stream, volume, output,
162 delay_ms);
163}
164
165status_t AudioPolicyService::AudioPolicyClient::invalidateStream(audio_stream_type_t stream)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800166{
167 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
168 if (af == 0) {
169 return PERMISSION_DENIED;
170 }
171
172 return af->invalidateStream(stream);
173}
174
Eric Laurentdce54a12014-03-10 12:19:46 -0700175void AudioPolicyService::AudioPolicyClient::setParameters(audio_io_handle_t io_handle,
176 const String8& keyValuePairs,
177 int delay_ms)
178{
179 mAudioPolicyService->setParameters(io_handle, keyValuePairs.string(), delay_ms);
180}
181
182String8 AudioPolicyService::AudioPolicyClient::getParameters(audio_io_handle_t io_handle,
183 const String8& keys)
184{
185 String8 result = AudioSystem::getParameters(io_handle, keys);
186 return result;
187}
188
Eric Laurentdce54a12014-03-10 12:19:46 -0700189status_t AudioPolicyService::AudioPolicyClient::setVoiceVolume(float volume, int delay_ms)
190{
191 return mAudioPolicyService->setVoiceVolume(volume, delay_ms);
192}
193
Glenn Kastend848eb42016-03-08 13:42:11 -0800194status_t AudioPolicyService::AudioPolicyClient::moveEffects(audio_session_t session,
Eric Laurentdce54a12014-03-10 12:19:46 -0700195 audio_io_handle_t src_output,
196 audio_io_handle_t dst_output)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800197{
198 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
199 if (af == 0) {
200 return PERMISSION_DENIED;
201 }
202
203 return af->moveEffects(session, src_output, dst_output);
204}
205
Eric Laurentb20cf7d2019-04-05 19:37:34 -0700206void AudioPolicyService::AudioPolicyClient::setEffectSuspended(int effectId,
207 audio_session_t sessionId,
208 bool suspended)
209{
210 mAudioPolicyService->setEffectSuspended(effectId, sessionId, suspended);
211}
212
Eric Laurent951f4552014-05-20 10:48:17 -0700213status_t AudioPolicyService::AudioPolicyClient::createAudioPatch(const struct audio_patch *patch,
214 audio_patch_handle_t *handle,
215 int delayMs)
216{
217 return mAudioPolicyService->clientCreateAudioPatch(patch, handle, delayMs);
218}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800219
Eric Laurent951f4552014-05-20 10:48:17 -0700220status_t AudioPolicyService::AudioPolicyClient::releaseAudioPatch(audio_patch_handle_t handle,
221 int delayMs)
222{
223 return mAudioPolicyService->clientReleaseAudioPatch(handle, delayMs);
224}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800225
Eric Laurente1715a42014-05-20 11:30:42 -0700226status_t AudioPolicyService::AudioPolicyClient::setAudioPortConfig(
227 const struct audio_port_config *config,
228 int delayMs)
229{
230 return mAudioPolicyService->clientSetAudioPortConfig(config, delayMs);
231}
232
Eric Laurentb52c1522014-05-20 11:27:36 -0700233void AudioPolicyService::AudioPolicyClient::onAudioPortListUpdate()
234{
235 mAudioPolicyService->onAudioPortListUpdate();
236}
237
238void AudioPolicyService::AudioPolicyClient::onAudioPatchListUpdate()
239{
240 mAudioPolicyService->onAudioPatchListUpdate();
241}
242
Jean-Michel Trivide801052015-04-14 19:10:14 -0700243void AudioPolicyService::AudioPolicyClient::onDynamicPolicyMixStateUpdate(
244 String8 regId, int32_t state)
245{
246 mAudioPolicyService->onDynamicPolicyMixStateUpdate(regId, state);
247}
248
Jean-Michel Trivi2f4fe9f2015-12-04 16:20:59 -0800249void AudioPolicyService::AudioPolicyClient::onRecordingConfigurationUpdate(
Eric Laurenta9f86652018-11-28 17:23:11 -0800250 int event,
251 const record_client_info_t *clientInfo,
252 const audio_config_base_t *clientConfig,
253 std::vector<effect_descriptor_t> clientEffects,
254 const audio_config_base_t *deviceConfig,
255 std::vector<effect_descriptor_t> effects,
256 audio_patch_handle_t patchHandle,
257 audio_source_t source)
Jean-Michel Trivi2f4fe9f2015-12-04 16:20:59 -0800258{
Jean-Michel Triviac4e4292016-12-22 11:39:31 -0800259 mAudioPolicyService->onRecordingConfigurationUpdate(event, clientInfo,
Eric Laurenta9f86652018-11-28 17:23:11 -0800260 clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
Jean-Michel Trivi2f4fe9f2015-12-04 16:20:59 -0800261}
262
François Gaffiecfe17322018-11-07 13:41:29 +0100263void AudioPolicyService::AudioPolicyClient::onAudioVolumeGroupChanged(volume_group_t group,
264 int flags)
265{
266 mAudioPolicyService->onAudioVolumeGroupChanged(group, flags);
267}
268
Glenn Kasteneeecb982016-02-26 10:44:04 -0800269audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId(audio_unique_id_use_t use)
Eric Laurentde3f8392014-07-27 18:38:22 -0700270{
Glenn Kasteneeecb982016-02-26 10:44:04 -0800271 return AudioSystem::newAudioUniqueId(use);
Eric Laurentde3f8392014-07-27 18:38:22 -0700272}
273
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -0700274void AudioPolicyService::AudioPolicyClient::setSoundTriggerCaptureState(bool active)
275{
276 mAudioPolicyService->mCaptureStateNotifier.setCaptureState(active);
Ytai Ben-Tsvi74cd6b02019-10-25 10:06:40 -0700277}
278
jiabinb4fed192020-09-22 14:45:40 -0700279status_t AudioPolicyService::AudioPolicyClient::getAudioPort(struct audio_port_v7 *port)
280{
281 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
282 if (af == 0) {
283 ALOGW("%s: could not get AudioFlinger", __func__);
284 return PERMISSION_DENIED;
285 }
286 return af->getAudioPort(port);
287}
288
Mikhail Naganov1b2a7942017-12-08 10:18:09 -0800289} // namespace android