blob: 4876fe788111ce4935b22e84093591bbffed34db [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 }
jiabin43810402019-10-24 14:58:31 -070053 return af->openOutput(module, output, config, device, latencyMs, flags);
Eric Laurent2d388ec2014-03-07 13:25:54 -080054}
55
Eric Laurentdce54a12014-03-10 12:19:46 -070056audio_io_handle_t AudioPolicyService::AudioPolicyClient::openDuplicateOutput(
57 audio_io_handle_t output1,
58 audio_io_handle_t output2)
Eric Laurent2d388ec2014-03-07 13:25:54 -080059{
60 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
61 if (af == 0) {
62 ALOGW("%s: could not get AudioFlinger", __func__);
63 return 0;
64 }
65 return af->openDuplicateOutput(output1, output2);
66}
67
Eric Laurentdce54a12014-03-10 12:19:46 -070068status_t AudioPolicyService::AudioPolicyClient::closeOutput(audio_io_handle_t output)
Eric Laurent2d388ec2014-03-07 13:25:54 -080069{
70 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
71 if (af == 0) {
72 return PERMISSION_DENIED;
73 }
74
75 return af->closeOutput(output);
76}
77
Eric Laurentdce54a12014-03-10 12:19:46 -070078status_t AudioPolicyService::AudioPolicyClient::suspendOutput(audio_io_handle_t output)
Eric Laurent2d388ec2014-03-07 13:25:54 -080079{
80 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
81 if (af == 0) {
82 ALOGW("%s: could not get AudioFlinger", __func__);
83 return PERMISSION_DENIED;
84 }
85
86 return af->suspendOutput(output);
87}
88
Eric Laurentdce54a12014-03-10 12:19:46 -070089status_t AudioPolicyService::AudioPolicyClient::restoreOutput(audio_io_handle_t output)
Eric Laurent2d388ec2014-03-07 13:25:54 -080090{
91 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
92 if (af == 0) {
93 ALOGW("%s: could not get AudioFlinger", __func__);
94 return PERMISSION_DENIED;
95 }
96
97 return af->restoreOutput(output);
98}
99
Eric Laurentcf2c0212014-07-25 16:20:43 -0700100status_t AudioPolicyService::AudioPolicyClient::openInput(audio_module_handle_t module,
101 audio_io_handle_t *input,
102 audio_config_t *config,
103 audio_devices_t *device,
104 const String8& address,
105 audio_source_t source,
106 audio_input_flags_t flags)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800107{
108 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
109 if (af == 0) {
110 ALOGW("%s: could not get AudioFlinger", __func__);
Eric Laurentcf2c0212014-07-25 16:20:43 -0700111 return PERMISSION_DENIED;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800112 }
113
Ytai Ben-Tsvi12a0b842020-11-05 13:47:32 -0800114 AudioDeviceTypeAddr deviceTypeAddr(*device, address.c_str());
115
116 media::OpenInputRequest request;
117 request.module = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_module_handle_t_int32_t(module));
118 request.input = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(*input));
119 request.config = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_config_t_AudioConfig(*config));
120 request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(deviceTypeAddr));
121 request.source = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_source_t_AudioSourceType(source));
122 request.flags = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_input_flags_mask(flags));
123
124 media::OpenInputResponse response;
125 status_t status = af->openInput(request, &response);
126 if (status == OK) {
127 *input = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_module_handle_t(response.input));
128 }
129 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800130}
131
Eric Laurentdce54a12014-03-10 12:19:46 -0700132status_t AudioPolicyService::AudioPolicyClient::closeInput(audio_io_handle_t input)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800133{
134 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
135 if (af == 0) {
136 return PERMISSION_DENIED;
137 }
138
139 return af->closeInput(input);
140}
141
Eric Laurentdce54a12014-03-10 12:19:46 -0700142status_t AudioPolicyService::AudioPolicyClient::setStreamVolume(audio_stream_type_t stream,
143 float volume, audio_io_handle_t output,
144 int delay_ms)
145{
146 return mAudioPolicyService->setStreamVolume(stream, volume, output,
147 delay_ms);
148}
149
150status_t AudioPolicyService::AudioPolicyClient::invalidateStream(audio_stream_type_t stream)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800151{
152 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
153 if (af == 0) {
154 return PERMISSION_DENIED;
155 }
156
157 return af->invalidateStream(stream);
158}
159
Eric Laurentdce54a12014-03-10 12:19:46 -0700160void AudioPolicyService::AudioPolicyClient::setParameters(audio_io_handle_t io_handle,
161 const String8& keyValuePairs,
162 int delay_ms)
163{
164 mAudioPolicyService->setParameters(io_handle, keyValuePairs.string(), delay_ms);
165}
166
167String8 AudioPolicyService::AudioPolicyClient::getParameters(audio_io_handle_t io_handle,
168 const String8& keys)
169{
170 String8 result = AudioSystem::getParameters(io_handle, keys);
171 return result;
172}
173
Eric Laurentdce54a12014-03-10 12:19:46 -0700174status_t AudioPolicyService::AudioPolicyClient::setVoiceVolume(float volume, int delay_ms)
175{
176 return mAudioPolicyService->setVoiceVolume(volume, delay_ms);
177}
178
Glenn Kastend848eb42016-03-08 13:42:11 -0800179status_t AudioPolicyService::AudioPolicyClient::moveEffects(audio_session_t session,
Eric Laurentdce54a12014-03-10 12:19:46 -0700180 audio_io_handle_t src_output,
181 audio_io_handle_t dst_output)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800182{
183 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
184 if (af == 0) {
185 return PERMISSION_DENIED;
186 }
187
188 return af->moveEffects(session, src_output, dst_output);
189}
190
Eric Laurentb20cf7d2019-04-05 19:37:34 -0700191void AudioPolicyService::AudioPolicyClient::setEffectSuspended(int effectId,
192 audio_session_t sessionId,
193 bool suspended)
194{
195 mAudioPolicyService->setEffectSuspended(effectId, sessionId, suspended);
196}
197
Eric Laurent951f4552014-05-20 10:48:17 -0700198status_t AudioPolicyService::AudioPolicyClient::createAudioPatch(const struct audio_patch *patch,
199 audio_patch_handle_t *handle,
200 int delayMs)
201{
202 return mAudioPolicyService->clientCreateAudioPatch(patch, handle, delayMs);
203}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800204
Eric Laurent951f4552014-05-20 10:48:17 -0700205status_t AudioPolicyService::AudioPolicyClient::releaseAudioPatch(audio_patch_handle_t handle,
206 int delayMs)
207{
208 return mAudioPolicyService->clientReleaseAudioPatch(handle, delayMs);
209}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800210
Eric Laurente1715a42014-05-20 11:30:42 -0700211status_t AudioPolicyService::AudioPolicyClient::setAudioPortConfig(
212 const struct audio_port_config *config,
213 int delayMs)
214{
215 return mAudioPolicyService->clientSetAudioPortConfig(config, delayMs);
216}
217
Eric Laurentb52c1522014-05-20 11:27:36 -0700218void AudioPolicyService::AudioPolicyClient::onAudioPortListUpdate()
219{
220 mAudioPolicyService->onAudioPortListUpdate();
221}
222
223void AudioPolicyService::AudioPolicyClient::onAudioPatchListUpdate()
224{
225 mAudioPolicyService->onAudioPatchListUpdate();
226}
227
Jean-Michel Trivide801052015-04-14 19:10:14 -0700228void AudioPolicyService::AudioPolicyClient::onDynamicPolicyMixStateUpdate(
229 String8 regId, int32_t state)
230{
231 mAudioPolicyService->onDynamicPolicyMixStateUpdate(regId, state);
232}
233
Jean-Michel Trivi2f4fe9f2015-12-04 16:20:59 -0800234void AudioPolicyService::AudioPolicyClient::onRecordingConfigurationUpdate(
Eric Laurenta9f86652018-11-28 17:23:11 -0800235 int event,
236 const record_client_info_t *clientInfo,
237 const audio_config_base_t *clientConfig,
238 std::vector<effect_descriptor_t> clientEffects,
239 const audio_config_base_t *deviceConfig,
240 std::vector<effect_descriptor_t> effects,
241 audio_patch_handle_t patchHandle,
242 audio_source_t source)
Jean-Michel Trivi2f4fe9f2015-12-04 16:20:59 -0800243{
Jean-Michel Triviac4e4292016-12-22 11:39:31 -0800244 mAudioPolicyService->onRecordingConfigurationUpdate(event, clientInfo,
Eric Laurenta9f86652018-11-28 17:23:11 -0800245 clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
Jean-Michel Trivi2f4fe9f2015-12-04 16:20:59 -0800246}
247
François Gaffiecfe17322018-11-07 13:41:29 +0100248void AudioPolicyService::AudioPolicyClient::onAudioVolumeGroupChanged(volume_group_t group,
249 int flags)
250{
251 mAudioPolicyService->onAudioVolumeGroupChanged(group, flags);
252}
253
Glenn Kasteneeecb982016-02-26 10:44:04 -0800254audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId(audio_unique_id_use_t use)
Eric Laurentde3f8392014-07-27 18:38:22 -0700255{
Glenn Kasteneeecb982016-02-26 10:44:04 -0800256 return AudioSystem::newAudioUniqueId(use);
Eric Laurentde3f8392014-07-27 18:38:22 -0700257}
258
Ytai Ben-Tsvi1ef846b2020-03-26 09:41:15 -0700259void AudioPolicyService::AudioPolicyClient::setSoundTriggerCaptureState(bool active)
260{
261 mAudioPolicyService->mCaptureStateNotifier.setCaptureState(active);
Ytai Ben-Tsvi74cd6b02019-10-25 10:06:40 -0700262}
263
jiabinb4fed192020-09-22 14:45:40 -0700264status_t AudioPolicyService::AudioPolicyClient::getAudioPort(struct audio_port_v7 *port)
265{
266 sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
267 if (af == 0) {
268 ALOGW("%s: could not get AudioFlinger", __func__);
269 return PERMISSION_DENIED;
270 }
271 return af->getAudioPort(port);
272}
273
Mikhail Naganov1b2a7942017-12-08 10:18:09 -0800274} // namespace android