IAudioPolicyService.cpp revision ad3af3305f024bcbbd55c894a4995e449498e1ba
1/*
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
28#include <system/audio.h>
29
30namespace android {
31
32enum {
33    SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
34    GET_DEVICE_CONNECTION_STATE,
35    SET_PHONE_STATE,
36    SET_RINGER_MODE,    // reserved, no longer used
37    SET_FORCE_USE,
38    GET_FORCE_USE,
39    GET_OUTPUT,
40    START_OUTPUT,
41    STOP_OUTPUT,
42    RELEASE_OUTPUT,
43    GET_INPUT,
44    START_INPUT,
45    STOP_INPUT,
46    RELEASE_INPUT,
47    INIT_STREAM_VOLUME,
48    SET_STREAM_VOLUME,
49    GET_STREAM_VOLUME,
50    GET_STRATEGY_FOR_STREAM,
51    GET_OUTPUT_FOR_EFFECT,
52    REGISTER_EFFECT,
53    UNREGISTER_EFFECT,
54    IS_STREAM_ACTIVE,
55    IS_SOURCE_ACTIVE,
56    GET_DEVICES_FOR_STREAM,
57    QUERY_DEFAULT_PRE_PROCESSING,
58    SET_EFFECT_ENABLED,
59    IS_STREAM_ACTIVE_REMOTELY,
60    IS_OFFLOAD_SUPPORTED
61};
62
63class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
64{
65public:
66    BpAudioPolicyService(const sp<IBinder>& impl)
67        : BpInterface<IAudioPolicyService>(impl)
68    {
69    }
70
71    virtual status_t setDeviceConnectionState(
72                                    audio_devices_t device,
73                                    audio_policy_dev_state_t state,
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.writeInt32(static_cast <uint32_t>(state));
80        data.writeCString(device_address);
81        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
82        return static_cast <status_t> (reply.readInt32());
83    }
84
85    virtual audio_policy_dev_state_t getDeviceConnectionState(
86                                    audio_devices_t device,
87                                    const char *device_address)
88    {
89        Parcel data, reply;
90        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
91        data.writeInt32(static_cast <uint32_t>(device));
92        data.writeCString(device_address);
93        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
94        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
95    }
96
97    virtual status_t setPhoneState(audio_mode_t state)
98    {
99        Parcel data, reply;
100        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
101        data.writeInt32(state);
102        remote()->transact(SET_PHONE_STATE, data, &reply);
103        return static_cast <status_t> (reply.readInt32());
104    }
105
106    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
107    {
108        Parcel data, reply;
109        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
110        data.writeInt32(static_cast <uint32_t>(usage));
111        data.writeInt32(static_cast <uint32_t>(config));
112        remote()->transact(SET_FORCE_USE, data, &reply);
113        return static_cast <status_t> (reply.readInt32());
114    }
115
116    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
117    {
118        Parcel data, reply;
119        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
120        data.writeInt32(static_cast <uint32_t>(usage));
121        remote()->transact(GET_FORCE_USE, data, &reply);
122        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
123    }
124
125    virtual audio_io_handle_t getOutput(
126                                        audio_stream_type_t stream,
127                                        uint32_t samplingRate,
128                                        audio_format_t format,
129                                        audio_channel_mask_t channelMask,
130                                        audio_output_flags_t flags,
131                                        const audio_offload_info_t *offloadInfo)
132    {
133        Parcel data, reply;
134        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
135        data.writeInt32(static_cast <uint32_t>(stream));
136        data.writeInt32(samplingRate);
137        data.writeInt32(static_cast <uint32_t>(format));
138        data.writeInt32(channelMask);
139        data.writeInt32(static_cast <uint32_t>(flags));
140        remote()->transact(GET_OUTPUT, data, &reply);
141        return static_cast <audio_io_handle_t> (reply.readInt32());
142    }
143
144    virtual status_t startOutput(audio_io_handle_t output,
145                                 audio_stream_type_t stream,
146                                 int session)
147    {
148        Parcel data, reply;
149        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
150        data.writeInt32(output);
151        data.writeInt32((int32_t) stream);
152        data.writeInt32(session);
153        remote()->transact(START_OUTPUT, data, &reply);
154        return static_cast <status_t> (reply.readInt32());
155    }
156
157    virtual status_t stopOutput(audio_io_handle_t output,
158                                audio_stream_type_t stream,
159                                int session)
160    {
161        Parcel data, reply;
162        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
163        data.writeInt32(output);
164        data.writeInt32((int32_t) stream);
165        data.writeInt32(session);
166        remote()->transact(STOP_OUTPUT, data, &reply);
167        return static_cast <status_t> (reply.readInt32());
168    }
169
170    virtual void releaseOutput(audio_io_handle_t output)
171    {
172        Parcel data, reply;
173        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
174        data.writeInt32(output);
175        remote()->transact(RELEASE_OUTPUT, data, &reply);
176    }
177
178    virtual audio_io_handle_t getInput(
179                                    audio_source_t inputSource,
180                                    uint32_t samplingRate,
181                                    audio_format_t format,
182                                    audio_channel_mask_t channelMask,
183                                    int audioSession)
184    {
185        Parcel data, reply;
186        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
187        data.writeInt32((int32_t) inputSource);
188        data.writeInt32(samplingRate);
189        data.writeInt32(static_cast <uint32_t>(format));
190        data.writeInt32(channelMask);
191        data.writeInt32(audioSession);
192        remote()->transact(GET_INPUT, data, &reply);
193        return static_cast <audio_io_handle_t> (reply.readInt32());
194    }
195
196    virtual status_t startInput(audio_io_handle_t input)
197    {
198        Parcel data, reply;
199        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
200        data.writeInt32(input);
201        remote()->transact(START_INPUT, data, &reply);
202        return static_cast <status_t> (reply.readInt32());
203    }
204
205    virtual status_t stopInput(audio_io_handle_t input)
206    {
207        Parcel data, reply;
208        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
209        data.writeInt32(input);
210        remote()->transact(STOP_INPUT, data, &reply);
211        return static_cast <status_t> (reply.readInt32());
212    }
213
214    virtual void releaseInput(audio_io_handle_t input)
215    {
216        Parcel data, reply;
217        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
218        data.writeInt32(input);
219        remote()->transact(RELEASE_INPUT, data, &reply);
220    }
221
222    virtual status_t initStreamVolume(audio_stream_type_t stream,
223                                    int indexMin,
224                                    int indexMax)
225    {
226        Parcel data, reply;
227        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
228        data.writeInt32(static_cast <uint32_t>(stream));
229        data.writeInt32(indexMin);
230        data.writeInt32(indexMax);
231        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
232        return static_cast <status_t> (reply.readInt32());
233    }
234
235    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
236                                          int index,
237                                          audio_devices_t device)
238    {
239        Parcel data, reply;
240        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
241        data.writeInt32(static_cast <uint32_t>(stream));
242        data.writeInt32(index);
243        data.writeInt32(static_cast <uint32_t>(device));
244        remote()->transact(SET_STREAM_VOLUME, data, &reply);
245        return static_cast <status_t> (reply.readInt32());
246    }
247
248    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
249                                          int *index,
250                                          audio_devices_t device)
251    {
252        Parcel data, reply;
253        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
254        data.writeInt32(static_cast <uint32_t>(stream));
255        data.writeInt32(static_cast <uint32_t>(device));
256
257        remote()->transact(GET_STREAM_VOLUME, data, &reply);
258        int lIndex = reply.readInt32();
259        if (index) *index = lIndex;
260        return static_cast <status_t> (reply.readInt32());
261    }
262
263    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
264    {
265        Parcel data, reply;
266        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
267        data.writeInt32(static_cast <uint32_t>(stream));
268        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
269        return reply.readInt32();
270    }
271
272    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
273    {
274        Parcel data, reply;
275        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
276        data.writeInt32(static_cast <uint32_t>(stream));
277        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
278        return (audio_devices_t) reply.readInt32();
279    }
280
281    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
282    {
283        Parcel data, reply;
284        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
285        data.write(desc, sizeof(effect_descriptor_t));
286        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
287        return static_cast <audio_io_handle_t> (reply.readInt32());
288    }
289
290    virtual status_t registerEffect(const effect_descriptor_t *desc,
291                                        audio_io_handle_t io,
292                                        uint32_t strategy,
293                                        int session,
294                                        int id)
295    {
296        Parcel data, reply;
297        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
298        data.write(desc, sizeof(effect_descriptor_t));
299        data.writeInt32(io);
300        data.writeInt32(strategy);
301        data.writeInt32(session);
302        data.writeInt32(id);
303        remote()->transact(REGISTER_EFFECT, data, &reply);
304        return static_cast <status_t> (reply.readInt32());
305    }
306
307    virtual status_t unregisterEffect(int id)
308    {
309        Parcel data, reply;
310        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
311        data.writeInt32(id);
312        remote()->transact(UNREGISTER_EFFECT, data, &reply);
313        return static_cast <status_t> (reply.readInt32());
314    }
315
316    virtual status_t setEffectEnabled(int id, bool enabled)
317    {
318        Parcel data, reply;
319        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
320        data.writeInt32(id);
321        data.writeInt32(enabled);
322        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
323        return static_cast <status_t> (reply.readInt32());
324    }
325
326    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
327    {
328        Parcel data, reply;
329        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
330        data.writeInt32((int32_t) stream);
331        data.writeInt32(inPastMs);
332        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
333        return reply.readInt32();
334    }
335
336    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
337    {
338        Parcel data, reply;
339        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
340        data.writeInt32((int32_t) stream);
341        data.writeInt32(inPastMs);
342        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
343        return reply.readInt32();
344    }
345
346    virtual bool isSourceActive(audio_source_t source) const
347    {
348        Parcel data, reply;
349        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
350        data.writeInt32((int32_t) source);
351        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
352        return reply.readInt32();
353    }
354
355    virtual status_t queryDefaultPreProcessing(int audioSession,
356                                               effect_descriptor_t *descriptors,
357                                               uint32_t *count)
358    {
359        if (descriptors == NULL || count == NULL) {
360            return BAD_VALUE;
361        }
362        Parcel data, reply;
363        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
364        data.writeInt32(audioSession);
365        data.writeInt32(*count);
366        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
367        if (status != NO_ERROR) {
368            return status;
369        }
370        status = static_cast <status_t> (reply.readInt32());
371        uint32_t retCount = reply.readInt32();
372        if (retCount != 0) {
373            uint32_t numDesc = (retCount < *count) ? retCount : *count;
374            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
375        }
376        *count = retCount;
377        return status;
378    }
379
380    virtual bool isOffloadSupported(const audio_offload_info_t& info)
381    {
382        // stub function
383        return false;
384    }
385};
386
387IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
388
389// ----------------------------------------------------------------------
390
391
392status_t BnAudioPolicyService::onTransact(
393    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
394{
395    switch (code) {
396        case SET_DEVICE_CONNECTION_STATE: {
397            CHECK_INTERFACE(IAudioPolicyService, data, reply);
398            audio_devices_t device =
399                    static_cast <audio_devices_t>(data.readInt32());
400            audio_policy_dev_state_t state =
401                    static_cast <audio_policy_dev_state_t>(data.readInt32());
402            const char *device_address = data.readCString();
403            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
404                                                                              state,
405                                                                              device_address)));
406            return NO_ERROR;
407        } break;
408
409        case GET_DEVICE_CONNECTION_STATE: {
410            CHECK_INTERFACE(IAudioPolicyService, data, reply);
411            audio_devices_t device =
412                    static_cast<audio_devices_t> (data.readInt32());
413            const char *device_address = data.readCString();
414            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
415                                                                              device_address)));
416            return NO_ERROR;
417        } break;
418
419        case SET_PHONE_STATE: {
420            CHECK_INTERFACE(IAudioPolicyService, data, reply);
421            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
422                    (audio_mode_t) data.readInt32())));
423            return NO_ERROR;
424        } break;
425
426        case SET_FORCE_USE: {
427            CHECK_INTERFACE(IAudioPolicyService, data, reply);
428            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
429                    data.readInt32());
430            audio_policy_forced_cfg_t config =
431                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
432            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
433            return NO_ERROR;
434        } break;
435
436        case GET_FORCE_USE: {
437            CHECK_INTERFACE(IAudioPolicyService, data, reply);
438            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
439                    data.readInt32());
440            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
441            return NO_ERROR;
442        } break;
443
444        case GET_OUTPUT: {
445            CHECK_INTERFACE(IAudioPolicyService, data, reply);
446            audio_stream_type_t stream =
447                    static_cast <audio_stream_type_t>(data.readInt32());
448            uint32_t samplingRate = data.readInt32();
449            audio_format_t format = (audio_format_t) data.readInt32();
450            audio_channel_mask_t channelMask = data.readInt32();
451            audio_output_flags_t flags =
452                    static_cast <audio_output_flags_t>(data.readInt32());
453
454            audio_io_handle_t output = getOutput(stream,
455                                                 samplingRate,
456                                                 format,
457                                                 channelMask,
458                                                 flags);
459            reply->writeInt32(static_cast <int>(output));
460            return NO_ERROR;
461        } break;
462
463        case START_OUTPUT: {
464            CHECK_INTERFACE(IAudioPolicyService, data, reply);
465            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
466            uint32_t stream = data.readInt32();
467            int session = data.readInt32();
468            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
469                                                                 (audio_stream_type_t)stream,
470                                                                 session)));
471            return NO_ERROR;
472        } break;
473
474        case STOP_OUTPUT: {
475            CHECK_INTERFACE(IAudioPolicyService, data, reply);
476            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
477            uint32_t stream = data.readInt32();
478            int session = data.readInt32();
479            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
480                                                                (audio_stream_type_t)stream,
481                                                                session)));
482            return NO_ERROR;
483        } break;
484
485        case RELEASE_OUTPUT: {
486            CHECK_INTERFACE(IAudioPolicyService, data, reply);
487            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
488            releaseOutput(output);
489            return NO_ERROR;
490        } break;
491
492        case GET_INPUT: {
493            CHECK_INTERFACE(IAudioPolicyService, data, reply);
494            audio_source_t inputSource = (audio_source_t) data.readInt32();
495            uint32_t samplingRate = data.readInt32();
496            audio_format_t format = (audio_format_t) data.readInt32();
497            audio_channel_mask_t channelMask = data.readInt32();
498            int audioSession = data.readInt32();
499            audio_io_handle_t input = getInput(inputSource,
500                                               samplingRate,
501                                               format,
502                                               channelMask,
503                                               audioSession);
504            reply->writeInt32(static_cast <int>(input));
505            return NO_ERROR;
506        } break;
507
508        case START_INPUT: {
509            CHECK_INTERFACE(IAudioPolicyService, data, reply);
510            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
511            reply->writeInt32(static_cast <uint32_t>(startInput(input)));
512            return NO_ERROR;
513        } break;
514
515        case STOP_INPUT: {
516            CHECK_INTERFACE(IAudioPolicyService, data, reply);
517            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
518            reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
519            return NO_ERROR;
520        } break;
521
522        case RELEASE_INPUT: {
523            CHECK_INTERFACE(IAudioPolicyService, data, reply);
524            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
525            releaseInput(input);
526            return NO_ERROR;
527        } break;
528
529        case INIT_STREAM_VOLUME: {
530            CHECK_INTERFACE(IAudioPolicyService, data, reply);
531            audio_stream_type_t stream =
532                    static_cast <audio_stream_type_t>(data.readInt32());
533            int indexMin = data.readInt32();
534            int indexMax = data.readInt32();
535            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
536            return NO_ERROR;
537        } break;
538
539        case SET_STREAM_VOLUME: {
540            CHECK_INTERFACE(IAudioPolicyService, data, reply);
541            audio_stream_type_t stream =
542                    static_cast <audio_stream_type_t>(data.readInt32());
543            int index = data.readInt32();
544            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
545            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
546                                                                          index,
547                                                                          device)));
548            return NO_ERROR;
549        } break;
550
551        case GET_STREAM_VOLUME: {
552            CHECK_INTERFACE(IAudioPolicyService, data, reply);
553            audio_stream_type_t stream =
554                    static_cast <audio_stream_type_t>(data.readInt32());
555            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
556            int index;
557            status_t status = getStreamVolumeIndex(stream, &index, device);
558            reply->writeInt32(index);
559            reply->writeInt32(static_cast <uint32_t>(status));
560            return NO_ERROR;
561        } break;
562
563        case GET_STRATEGY_FOR_STREAM: {
564            CHECK_INTERFACE(IAudioPolicyService, data, reply);
565            audio_stream_type_t stream =
566                    static_cast <audio_stream_type_t>(data.readInt32());
567            reply->writeInt32(getStrategyForStream(stream));
568            return NO_ERROR;
569        } break;
570
571        case GET_DEVICES_FOR_STREAM: {
572            CHECK_INTERFACE(IAudioPolicyService, data, reply);
573            audio_stream_type_t stream =
574                    static_cast <audio_stream_type_t>(data.readInt32());
575            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
576            return NO_ERROR;
577        } break;
578
579        case GET_OUTPUT_FOR_EFFECT: {
580            CHECK_INTERFACE(IAudioPolicyService, data, reply);
581            effect_descriptor_t desc;
582            data.read(&desc, sizeof(effect_descriptor_t));
583            audio_io_handle_t output = getOutputForEffect(&desc);
584            reply->writeInt32(static_cast <int>(output));
585            return NO_ERROR;
586        } break;
587
588        case REGISTER_EFFECT: {
589            CHECK_INTERFACE(IAudioPolicyService, data, reply);
590            effect_descriptor_t desc;
591            data.read(&desc, sizeof(effect_descriptor_t));
592            audio_io_handle_t io = data.readInt32();
593            uint32_t strategy = data.readInt32();
594            int session = data.readInt32();
595            int id = data.readInt32();
596            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
597                                                                   io,
598                                                                   strategy,
599                                                                   session,
600                                                                   id)));
601            return NO_ERROR;
602        } break;
603
604        case UNREGISTER_EFFECT: {
605            CHECK_INTERFACE(IAudioPolicyService, data, reply);
606            int id = data.readInt32();
607            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
608            return NO_ERROR;
609        } break;
610
611        case SET_EFFECT_ENABLED: {
612            CHECK_INTERFACE(IAudioPolicyService, data, reply);
613            int id = data.readInt32();
614            bool enabled = static_cast <bool>(data.readInt32());
615            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
616            return NO_ERROR;
617        } break;
618
619        case IS_STREAM_ACTIVE: {
620            CHECK_INTERFACE(IAudioPolicyService, data, reply);
621            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
622            uint32_t inPastMs = (uint32_t)data.readInt32();
623            reply->writeInt32( isStreamActive((audio_stream_type_t) stream, inPastMs) );
624            return NO_ERROR;
625        } break;
626
627        case IS_STREAM_ACTIVE_REMOTELY: {
628            CHECK_INTERFACE(IAudioPolicyService, data, reply);
629            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
630            uint32_t inPastMs = (uint32_t)data.readInt32();
631            reply->writeInt32( isStreamActiveRemotely((audio_stream_type_t) stream, inPastMs) );
632            return NO_ERROR;
633        } break;
634
635        case IS_SOURCE_ACTIVE: {
636            CHECK_INTERFACE(IAudioPolicyService, data, reply);
637            audio_source_t source = (audio_source_t) data.readInt32();
638            reply->writeInt32( isSourceActive(source));
639            return NO_ERROR;
640        }
641
642        case QUERY_DEFAULT_PRE_PROCESSING: {
643            CHECK_INTERFACE(IAudioPolicyService, data, reply);
644            int audioSession = data.readInt32();
645            uint32_t count = data.readInt32();
646            uint32_t retCount = count;
647            effect_descriptor_t *descriptors =
648                    (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
649            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
650            reply->writeInt32(status);
651            if (status != NO_ERROR && status != NO_MEMORY) {
652                retCount = 0;
653            }
654            reply->writeInt32(retCount);
655            if (retCount) {
656                if (retCount < count) {
657                    count = retCount;
658                }
659                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
660            }
661            delete[] descriptors;
662            return status;
663        }
664
665        default:
666            return BBinder::onTransact(code, data, reply, flags);
667    }
668}
669
670// ----------------------------------------------------------------------------
671
672}; // namespace android
673