blob: 18dd173bfc6441ac3a6a486d06d575420fb86bbb [file] [log] [blame]
Eric Laurentc2f1f072009-07-17 12:17:14 -07001/*
2**
3** Copyright 2009, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#define LOG_TAG "IAudioPolicyService"
19#include <utils/Log.h>
20
21#include <stdint.h>
22#include <sys/types.h>
23
24#include <binder/Parcel.h>
25
26#include <media/IAudioPolicyService.h>
27
28namespace android {
29
30enum {
31 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
32 GET_DEVICE_CONNECTION_STATE,
33 SET_PHONE_STATE,
34 SET_RINGER_MODE,
35 SET_FORCE_USE,
36 GET_FORCE_USE,
37 GET_OUTPUT,
38 START_OUTPUT,
39 STOP_OUTPUT,
40 RELEASE_OUTPUT,
41 GET_INPUT,
42 START_INPUT,
43 STOP_INPUT,
44 RELEASE_INPUT,
45 INIT_STREAM_VOLUME,
46 SET_STREAM_VOLUME,
47 GET_STREAM_VOLUME
48};
49
50class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
51{
52public:
53 BpAudioPolicyService(const sp<IBinder>& impl)
54 : BpInterface<IAudioPolicyService>(impl)
55 {
56 }
57
58 virtual status_t setDeviceConnectionState(
59 AudioSystem::audio_devices device,
60 AudioSystem::device_connection_state state,
61 const char *device_address)
62 {
63 Parcel data, reply;
64 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
65 data.writeInt32(static_cast <uint32_t>(device));
66 data.writeInt32(static_cast <uint32_t>(state));
67 data.writeCString(device_address);
68 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
69 return static_cast <status_t> (reply.readInt32());
70 }
71
72 virtual AudioSystem::device_connection_state getDeviceConnectionState(
73 AudioSystem::audio_devices device,
74 const char *device_address)
75 {
76 Parcel data, reply;
77 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
78 data.writeInt32(static_cast <uint32_t>(device));
79 data.writeCString(device_address);
80 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
81 return static_cast <AudioSystem::device_connection_state>(reply.readInt32());
82 }
83
84 virtual status_t setPhoneState(int state)
85 {
86 Parcel data, reply;
87 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
88 data.writeInt32(state);
89 remote()->transact(SET_PHONE_STATE, data, &reply);
90 return static_cast <status_t> (reply.readInt32());
91 }
92
93 virtual status_t setRingerMode(uint32_t mode, uint32_t mask)
94 {
95 Parcel data, reply;
96 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
97 data.writeInt32(mode);
98 data.writeInt32(mask);
99 remote()->transact(SET_RINGER_MODE, data, &reply);
100 return static_cast <status_t> (reply.readInt32());
101 }
102
103 virtual status_t setForceUse(AudioSystem::force_use usage, AudioSystem::forced_config config)
104 {
105 Parcel data, reply;
106 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
107 data.writeInt32(static_cast <uint32_t>(usage));
108 data.writeInt32(static_cast <uint32_t>(config));
109 remote()->transact(SET_FORCE_USE, data, &reply);
110 return static_cast <status_t> (reply.readInt32());
111 }
112
113 virtual AudioSystem::forced_config getForceUse(AudioSystem::force_use usage)
114 {
115 Parcel data, reply;
116 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
117 data.writeInt32(static_cast <uint32_t>(usage));
118 remote()->transact(GET_FORCE_USE, data, &reply);
119 return static_cast <AudioSystem::forced_config> (reply.readInt32());
120 }
121
122 virtual audio_io_handle_t getOutput(
123 AudioSystem::stream_type stream,
124 uint32_t samplingRate,
125 uint32_t format,
126 uint32_t channels,
127 AudioSystem::output_flags flags)
128 {
129 Parcel data, reply;
130 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
131 data.writeInt32(static_cast <uint32_t>(stream));
132 data.writeInt32(samplingRate);
133 data.writeInt32(static_cast <uint32_t>(format));
134 data.writeInt32(channels);
135 data.writeInt32(static_cast <uint32_t>(flags));
136 remote()->transact(GET_OUTPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700137 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700138 }
139
140 virtual status_t startOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
141 {
142 Parcel data, reply;
143 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700144 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700145 data.writeInt32(stream);
146 remote()->transact(START_OUTPUT, data, &reply);
147 return static_cast <status_t> (reply.readInt32());
148 }
149
150 virtual status_t stopOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
151 {
152 Parcel data, reply;
153 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700154 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700155 data.writeInt32(stream);
156 remote()->transact(STOP_OUTPUT, data, &reply);
157 return static_cast <status_t> (reply.readInt32());
158 }
159
160 virtual void releaseOutput(audio_io_handle_t output)
161 {
162 Parcel data, reply;
163 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700164 data.writeInt32(output);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700165 remote()->transact(RELEASE_OUTPUT, data, &reply);
166 }
167
168 virtual audio_io_handle_t getInput(
169 int inputSource,
170 uint32_t samplingRate,
171 uint32_t format,
172 uint32_t channels,
173 AudioSystem::audio_in_acoustics acoustics)
174 {
175 Parcel data, reply;
176 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
177 data.writeInt32(inputSource);
178 data.writeInt32(samplingRate);
179 data.writeInt32(static_cast <uint32_t>(format));
180 data.writeInt32(channels);
181 data.writeInt32(static_cast <uint32_t>(acoustics));
182 remote()->transact(GET_INPUT, data, &reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700183 return static_cast <audio_io_handle_t> (reply.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700184 }
185
186 virtual status_t startInput(audio_io_handle_t input)
187 {
188 Parcel data, reply;
189 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700190 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700191 remote()->transact(START_INPUT, data, &reply);
192 return static_cast <status_t> (reply.readInt32());
193 }
194
195 virtual status_t stopInput(audio_io_handle_t input)
196 {
197 Parcel data, reply;
198 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700199 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700200 remote()->transact(STOP_INPUT, data, &reply);
201 return static_cast <status_t> (reply.readInt32());
202 }
203
204 virtual void releaseInput(audio_io_handle_t input)
205 {
206 Parcel data, reply;
207 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
Eric Laurentfa2877b2009-07-28 08:44:33 -0700208 data.writeInt32(input);
Eric Laurentc2f1f072009-07-17 12:17:14 -0700209 remote()->transact(RELEASE_INPUT, data, &reply);
210 }
211
212 virtual status_t initStreamVolume(AudioSystem::stream_type stream,
213 int indexMin,
214 int indexMax)
215 {
216 Parcel data, reply;
217 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
218 data.writeInt32(static_cast <uint32_t>(stream));
219 data.writeInt32(indexMin);
220 data.writeInt32(indexMax);
221 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
222 return static_cast <status_t> (reply.readInt32());
223 }
224
225 virtual status_t setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
226 {
227 Parcel data, reply;
228 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
229 data.writeInt32(static_cast <uint32_t>(stream));
230 data.writeInt32(index);
231 remote()->transact(SET_STREAM_VOLUME, data, &reply);
232 return static_cast <status_t> (reply.readInt32());
233 }
234
235 virtual status_t getStreamVolumeIndex(AudioSystem::stream_type stream, int *index)
236 {
237 Parcel data, reply;
238 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
239 data.writeInt32(static_cast <uint32_t>(stream));
240 remote()->transact(GET_STREAM_VOLUME, data, &reply);
241 int lIndex = reply.readInt32();
242 if (index) *index = lIndex;
243 return static_cast <status_t> (reply.readInt32());
244 }
245};
246
247IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
248
249// ----------------------------------------------------------------------
250
251
252status_t BnAudioPolicyService::onTransact(
253 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
254{
255 switch(code) {
256 case SET_DEVICE_CONNECTION_STATE: {
257 CHECK_INTERFACE(IAudioPolicyService, data, reply);
258 AudioSystem::audio_devices device = static_cast <AudioSystem::audio_devices>(data.readInt32());
259 AudioSystem::device_connection_state state = static_cast <AudioSystem::device_connection_state>(data.readInt32());
260 const char *device_address = data.readCString();
261 reply->writeInt32(static_cast <uint32_t>(setDeviceConnectionState(device, state, device_address)));
262 return NO_ERROR;
263 } break;
264
265 case GET_DEVICE_CONNECTION_STATE: {
266 CHECK_INTERFACE(IAudioPolicyService, data, reply);
267 AudioSystem::audio_devices device = static_cast <AudioSystem::audio_devices>(data.readInt32());
268 const char *device_address = data.readCString();
269 reply->writeInt32(static_cast <uint32_t>(getDeviceConnectionState(device, device_address)));
270 return NO_ERROR;
271 } break;
272
273 case SET_PHONE_STATE: {
274 CHECK_INTERFACE(IAudioPolicyService, data, reply);
275 reply->writeInt32(static_cast <uint32_t>(setPhoneState(data.readInt32())));
276 return NO_ERROR;
277 } break;
278
279 case SET_RINGER_MODE: {
280 CHECK_INTERFACE(IAudioPolicyService, data, reply);
281 uint32_t mode = data.readInt32();
282 uint32_t mask = data.readInt32();
283 reply->writeInt32(static_cast <uint32_t>(setRingerMode(mode, mask)));
284 return NO_ERROR;
285 } break;
286
287 case SET_FORCE_USE: {
288 CHECK_INTERFACE(IAudioPolicyService, data, reply);
289 AudioSystem::force_use usage = static_cast <AudioSystem::force_use>(data.readInt32());
290 AudioSystem::forced_config config = static_cast <AudioSystem::forced_config>(data.readInt32());
291 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
292 return NO_ERROR;
293 } break;
294
295 case GET_FORCE_USE: {
296 CHECK_INTERFACE(IAudioPolicyService, data, reply);
297 AudioSystem::force_use usage = static_cast <AudioSystem::force_use>(data.readInt32());
298 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
299 return NO_ERROR;
300 } break;
301
302 case GET_OUTPUT: {
303 CHECK_INTERFACE(IAudioPolicyService, data, reply);
304 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
305 uint32_t samplingRate = data.readInt32();
306 uint32_t format = data.readInt32();
307 uint32_t channels = data.readInt32();
308 AudioSystem::output_flags flags = static_cast <AudioSystem::output_flags>(data.readInt32());
309
310 audio_io_handle_t output = getOutput(stream,
311 samplingRate,
312 format,
313 channels,
314 flags);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700315 reply->writeInt32(static_cast <int>(output));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700316 return NO_ERROR;
317 } break;
318
319 case START_OUTPUT: {
320 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700321 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700322 uint32_t stream = data.readInt32();
323 reply->writeInt32(static_cast <uint32_t>(startOutput(output, (AudioSystem::stream_type)stream)));
324 return NO_ERROR;
325 } break;
326
327 case STOP_OUTPUT: {
328 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700329 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700330 uint32_t stream = data.readInt32();
331 reply->writeInt32(static_cast <uint32_t>(stopOutput(output, (AudioSystem::stream_type)stream)));
332 return NO_ERROR;
333 } break;
334
335 case RELEASE_OUTPUT: {
336 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700337 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700338 releaseOutput(output);
339 return NO_ERROR;
340 } break;
341
342 case GET_INPUT: {
343 CHECK_INTERFACE(IAudioPolicyService, data, reply);
344 int inputSource = data.readInt32();
345 uint32_t samplingRate = data.readInt32();
346 uint32_t format = data.readInt32();
347 uint32_t channels = data.readInt32();
348 AudioSystem::audio_in_acoustics acoustics = static_cast <AudioSystem::audio_in_acoustics>(data.readInt32());
349 audio_io_handle_t input = getInput(inputSource,
350 samplingRate,
351 format,
352 channels,
353 acoustics);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700354 reply->writeInt32(static_cast <int>(input));
Eric Laurentc2f1f072009-07-17 12:17:14 -0700355 return NO_ERROR;
356 } break;
357
358 case START_INPUT: {
359 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700360 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700361 reply->writeInt32(static_cast <uint32_t>(startInput(input)));
362 return NO_ERROR;
363 } break;
364
365 case STOP_INPUT: {
366 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700367 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700368 reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
369 return NO_ERROR;
370 } break;
371
372 case RELEASE_INPUT: {
373 CHECK_INTERFACE(IAudioPolicyService, data, reply);
Eric Laurentfa2877b2009-07-28 08:44:33 -0700374 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
Eric Laurentc2f1f072009-07-17 12:17:14 -0700375 releaseInput(input);
376 return NO_ERROR;
377 } break;
378
379 case INIT_STREAM_VOLUME: {
380 CHECK_INTERFACE(IAudioPolicyService, data, reply);
381 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
382 int indexMin = data.readInt32();
383 int indexMax = data.readInt32();
384 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
385 return NO_ERROR;
386 } break;
387
388 case SET_STREAM_VOLUME: {
389 CHECK_INTERFACE(IAudioPolicyService, data, reply);
390 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
391 int index = data.readInt32();
392 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, index)));
393 return NO_ERROR;
394 } break;
395
396 case GET_STREAM_VOLUME: {
397 CHECK_INTERFACE(IAudioPolicyService, data, reply);
398 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
399 int index;
400 status_t status = getStreamVolumeIndex(stream, &index);
401 reply->writeInt32(index);
402 reply->writeInt32(static_cast <uint32_t>(status));
403 return NO_ERROR;
404 } break;
405
406 default:
407 return BBinder::onTransact(code, data, reply, flags);
408 }
409}
410
411// ----------------------------------------------------------------------------
412
413}; // namespace android