blob: 0d8a32970a22e888768984b6efe9d82049440127 [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);
137 audio_io_handle_t output;
138 reply.read(&output, sizeof(audio_io_handle_t));
139 return output;
140 }
141
142 virtual status_t startOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
143 {
144 Parcel data, reply;
145 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
146 data.write(&output, sizeof(audio_io_handle_t));
147 data.writeInt32(stream);
148 remote()->transact(START_OUTPUT, data, &reply);
149 return static_cast <status_t> (reply.readInt32());
150 }
151
152 virtual status_t stopOutput(audio_io_handle_t output, AudioSystem::stream_type stream)
153 {
154 Parcel data, reply;
155 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
156 data.write(&output, sizeof(audio_io_handle_t));
157 data.writeInt32(stream);
158 remote()->transact(STOP_OUTPUT, data, &reply);
159 return static_cast <status_t> (reply.readInt32());
160 }
161
162 virtual void releaseOutput(audio_io_handle_t output)
163 {
164 Parcel data, reply;
165 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
166 data.write(&output, sizeof(audio_io_handle_t));
167 remote()->transact(RELEASE_OUTPUT, data, &reply);
168 }
169
170 virtual audio_io_handle_t getInput(
171 int inputSource,
172 uint32_t samplingRate,
173 uint32_t format,
174 uint32_t channels,
175 AudioSystem::audio_in_acoustics acoustics)
176 {
177 Parcel data, reply;
178 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
179 data.writeInt32(inputSource);
180 data.writeInt32(samplingRate);
181 data.writeInt32(static_cast <uint32_t>(format));
182 data.writeInt32(channels);
183 data.writeInt32(static_cast <uint32_t>(acoustics));
184 remote()->transact(GET_INPUT, data, &reply);
185 audio_io_handle_t input;
186 reply.read(&input, sizeof(audio_io_handle_t));
187 return input;
188 }
189
190 virtual status_t startInput(audio_io_handle_t input)
191 {
192 Parcel data, reply;
193 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
194 data.write(&input, sizeof(audio_io_handle_t));
195 remote()->transact(START_INPUT, data, &reply);
196 return static_cast <status_t> (reply.readInt32());
197 }
198
199 virtual status_t stopInput(audio_io_handle_t input)
200 {
201 Parcel data, reply;
202 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
203 data.write(&input, sizeof(audio_io_handle_t));
204 remote()->transact(STOP_INPUT, data, &reply);
205 return static_cast <status_t> (reply.readInt32());
206 }
207
208 virtual void releaseInput(audio_io_handle_t input)
209 {
210 Parcel data, reply;
211 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
212 data.write(&input, sizeof(audio_io_handle_t));
213 remote()->transact(RELEASE_INPUT, data, &reply);
214 }
215
216 virtual status_t initStreamVolume(AudioSystem::stream_type stream,
217 int indexMin,
218 int indexMax)
219 {
220 Parcel data, reply;
221 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
222 data.writeInt32(static_cast <uint32_t>(stream));
223 data.writeInt32(indexMin);
224 data.writeInt32(indexMax);
225 remote()->transact(INIT_STREAM_VOLUME, data, &reply);
226 return static_cast <status_t> (reply.readInt32());
227 }
228
229 virtual status_t setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
230 {
231 Parcel data, reply;
232 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
233 data.writeInt32(static_cast <uint32_t>(stream));
234 data.writeInt32(index);
235 remote()->transact(SET_STREAM_VOLUME, data, &reply);
236 return static_cast <status_t> (reply.readInt32());
237 }
238
239 virtual status_t getStreamVolumeIndex(AudioSystem::stream_type stream, int *index)
240 {
241 Parcel data, reply;
242 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
243 data.writeInt32(static_cast <uint32_t>(stream));
244 remote()->transact(GET_STREAM_VOLUME, data, &reply);
245 int lIndex = reply.readInt32();
246 if (index) *index = lIndex;
247 return static_cast <status_t> (reply.readInt32());
248 }
249};
250
251IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
252
253// ----------------------------------------------------------------------
254
255
256status_t BnAudioPolicyService::onTransact(
257 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
258{
259 switch(code) {
260 case SET_DEVICE_CONNECTION_STATE: {
261 CHECK_INTERFACE(IAudioPolicyService, data, reply);
262 AudioSystem::audio_devices device = static_cast <AudioSystem::audio_devices>(data.readInt32());
263 AudioSystem::device_connection_state state = static_cast <AudioSystem::device_connection_state>(data.readInt32());
264 const char *device_address = data.readCString();
265 reply->writeInt32(static_cast <uint32_t>(setDeviceConnectionState(device, state, device_address)));
266 return NO_ERROR;
267 } break;
268
269 case GET_DEVICE_CONNECTION_STATE: {
270 CHECK_INTERFACE(IAudioPolicyService, data, reply);
271 AudioSystem::audio_devices device = static_cast <AudioSystem::audio_devices>(data.readInt32());
272 const char *device_address = data.readCString();
273 reply->writeInt32(static_cast <uint32_t>(getDeviceConnectionState(device, device_address)));
274 return NO_ERROR;
275 } break;
276
277 case SET_PHONE_STATE: {
278 CHECK_INTERFACE(IAudioPolicyService, data, reply);
279 reply->writeInt32(static_cast <uint32_t>(setPhoneState(data.readInt32())));
280 return NO_ERROR;
281 } break;
282
283 case SET_RINGER_MODE: {
284 CHECK_INTERFACE(IAudioPolicyService, data, reply);
285 uint32_t mode = data.readInt32();
286 uint32_t mask = data.readInt32();
287 reply->writeInt32(static_cast <uint32_t>(setRingerMode(mode, mask)));
288 return NO_ERROR;
289 } break;
290
291 case SET_FORCE_USE: {
292 CHECK_INTERFACE(IAudioPolicyService, data, reply);
293 AudioSystem::force_use usage = static_cast <AudioSystem::force_use>(data.readInt32());
294 AudioSystem::forced_config config = static_cast <AudioSystem::forced_config>(data.readInt32());
295 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
296 return NO_ERROR;
297 } break;
298
299 case GET_FORCE_USE: {
300 CHECK_INTERFACE(IAudioPolicyService, data, reply);
301 AudioSystem::force_use usage = static_cast <AudioSystem::force_use>(data.readInt32());
302 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
303 return NO_ERROR;
304 } break;
305
306 case GET_OUTPUT: {
307 CHECK_INTERFACE(IAudioPolicyService, data, reply);
308 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
309 uint32_t samplingRate = data.readInt32();
310 uint32_t format = data.readInt32();
311 uint32_t channels = data.readInt32();
312 AudioSystem::output_flags flags = static_cast <AudioSystem::output_flags>(data.readInt32());
313
314 audio_io_handle_t output = getOutput(stream,
315 samplingRate,
316 format,
317 channels,
318 flags);
319 reply->write(&output, sizeof(audio_io_handle_t));
320 return NO_ERROR;
321 } break;
322
323 case START_OUTPUT: {
324 CHECK_INTERFACE(IAudioPolicyService, data, reply);
325 audio_io_handle_t output;
326 data.read(&output, sizeof(audio_io_handle_t));
327 uint32_t stream = data.readInt32();
328 reply->writeInt32(static_cast <uint32_t>(startOutput(output, (AudioSystem::stream_type)stream)));
329 return NO_ERROR;
330 } break;
331
332 case STOP_OUTPUT: {
333 CHECK_INTERFACE(IAudioPolicyService, data, reply);
334 audio_io_handle_t output;
335 data.read(&output, sizeof(audio_io_handle_t));
336 uint32_t stream = data.readInt32();
337 reply->writeInt32(static_cast <uint32_t>(stopOutput(output, (AudioSystem::stream_type)stream)));
338 return NO_ERROR;
339 } break;
340
341 case RELEASE_OUTPUT: {
342 CHECK_INTERFACE(IAudioPolicyService, data, reply);
343 audio_io_handle_t output;
344 data.read(&output, sizeof(audio_io_handle_t));
345 releaseOutput(output);
346 return NO_ERROR;
347 } break;
348
349 case GET_INPUT: {
350 CHECK_INTERFACE(IAudioPolicyService, data, reply);
351 int inputSource = data.readInt32();
352 uint32_t samplingRate = data.readInt32();
353 uint32_t format = data.readInt32();
354 uint32_t channels = data.readInt32();
355 AudioSystem::audio_in_acoustics acoustics = static_cast <AudioSystem::audio_in_acoustics>(data.readInt32());
356 audio_io_handle_t input = getInput(inputSource,
357 samplingRate,
358 format,
359 channels,
360 acoustics);
361 reply->write(&input, sizeof(audio_io_handle_t));
362 return NO_ERROR;
363 } break;
364
365 case START_INPUT: {
366 CHECK_INTERFACE(IAudioPolicyService, data, reply);
367 audio_io_handle_t input;
368 data.read(&input, sizeof(audio_io_handle_t));
369 reply->writeInt32(static_cast <uint32_t>(startInput(input)));
370 return NO_ERROR;
371 } break;
372
373 case STOP_INPUT: {
374 CHECK_INTERFACE(IAudioPolicyService, data, reply);
375 audio_io_handle_t input;
376 data.read(&input, sizeof(audio_io_handle_t));
377 reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
378 return NO_ERROR;
379 } break;
380
381 case RELEASE_INPUT: {
382 CHECK_INTERFACE(IAudioPolicyService, data, reply);
383 audio_io_handle_t input;
384 data.read(&input, sizeof(audio_io_handle_t));
385 releaseInput(input);
386 return NO_ERROR;
387 } break;
388
389 case INIT_STREAM_VOLUME: {
390 CHECK_INTERFACE(IAudioPolicyService, data, reply);
391 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
392 int indexMin = data.readInt32();
393 int indexMax = data.readInt32();
394 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
395 return NO_ERROR;
396 } break;
397
398 case SET_STREAM_VOLUME: {
399 CHECK_INTERFACE(IAudioPolicyService, data, reply);
400 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
401 int index = data.readInt32();
402 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, index)));
403 return NO_ERROR;
404 } break;
405
406 case GET_STREAM_VOLUME: {
407 CHECK_INTERFACE(IAudioPolicyService, data, reply);
408 AudioSystem::stream_type stream = static_cast <AudioSystem::stream_type>(data.readInt32());
409 int index;
410 status_t status = getStreamVolumeIndex(stream, &index);
411 reply->writeInt32(index);
412 reply->writeInt32(static_cast <uint32_t>(status));
413 return NO_ERROR;
414 } break;
415
416 default:
417 return BBinder::onTransact(code, data, reply, flags);
418 }
419}
420
421// ----------------------------------------------------------------------------
422
423}; // namespace android