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