IAudioPolicyService.cpp revision 2301acc6a9c7a3af4ad01f3d1d0f76f13eca7350
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** Copyright 2009, The Android Open Source Project
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** Licensed under the Apache License, Version 2.0 (the "License");
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** you may not use this file except in compliance with the License.
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** You may obtain a copy of the License at
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**     http://www.apache.org/licenses/LICENSE-2.0
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** Unless required by applicable law or agreed to in writing, software
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** distributed under the License is distributed on an "AS IS" BASIS,
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** See the License for the specific language governing permissions and
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org** limitations under the License.
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LOG_TAG "IAudioPolicyService"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <utils/Log.h>
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdint.h>
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <sys/types.h>
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <binder/Parcel.h>
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <media/IAudioPolicyService.h>
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <system/audio.h>
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace android {
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum {
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_DEVICE_CONNECTION_STATE,
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SET_PHONE_STATE,
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SET_RINGER_MODE,    // reserved, no longer used
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SET_FORCE_USE,
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_FORCE_USE,
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_OUTPUT,
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    START_OUTPUT,
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    STOP_OUTPUT,
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RELEASE_OUTPUT,
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_INPUT,
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    START_INPUT,
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    STOP_INPUT,
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RELEASE_INPUT,
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    INIT_STREAM_VOLUME,
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SET_STREAM_VOLUME,
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_STREAM_VOLUME,
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_STRATEGY_FOR_STREAM,
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_OUTPUT_FOR_EFFECT,
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    REGISTER_EFFECT,
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UNREGISTER_EFFECT,
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IS_STREAM_ACTIVE,
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IS_SOURCE_ACTIVE,
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GET_DEVICES_FOR_STREAM,
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    QUERY_DEFAULT_PRE_PROCESSING,
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SET_EFFECT_ENABLED,
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IS_STREAM_ACTIVE_REMOTELY,
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    IS_OFFLOAD_SUPPORTED
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass BpAudioPolicyService : public BpInterface<IAudioPolicyService>
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BpAudioPolicyService(const sp<IBinder>& impl)
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        : BpInterface<IAudioPolicyService>(impl)
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t setDeviceConnectionState(
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    audio_devices_t device,
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    audio_policy_dev_state_t state,
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    const char *device_address)
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(device));
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(state));
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeCString(device_address);
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual audio_policy_dev_state_t getDeviceConnectionState(
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    audio_devices_t device,
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    const char *device_address)
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(device));
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeCString(device_address);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply);
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <audio_policy_dev_state_t>(reply.readInt32());
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t setPhoneState(audio_mode_t state)
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(state);
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(SET_PHONE_STATE, data, &reply);
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(usage));
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(config));
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(SET_FORCE_USE, data, &reply);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage)
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(usage));
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(GET_FORCE_USE, data, &reply);
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <audio_policy_forced_cfg_t> (reply.readInt32());
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual audio_io_handle_t getOutput(
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        audio_stream_type_t stream,
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        uint32_t samplingRate,
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        audio_format_t format,
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        audio_channel_mask_t channelMask,
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        audio_output_flags_t flags,
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        const audio_offload_info_t *offloadInfo)
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(stream));
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(samplingRate);
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(format));
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(channelMask);
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(flags));
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // hasOffloadInfo
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (offloadInfo == NULL) {
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            data.writeInt32(0);
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            data.writeInt32(1);
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            data.write(offloadInfo, sizeof(audio_offload_info_t));
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(GET_OUTPUT, data, &reply);
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <audio_io_handle_t> (reply.readInt32());
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t startOutput(audio_io_handle_t output,
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 audio_stream_type_t stream,
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 int session)
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(output);
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32((int32_t) stream);
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(session);
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(START_OUTPUT, data, &reply);
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t stopOutput(audio_io_handle_t output,
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                audio_stream_type_t stream,
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                int session)
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(output);
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32((int32_t) stream);
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(session);
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(STOP_OUTPUT, data, &reply);
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void releaseOutput(audio_io_handle_t output)
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(output);
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(RELEASE_OUTPUT, data, &reply);
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual audio_io_handle_t getInput(
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    audio_source_t inputSource,
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    uint32_t samplingRate,
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    audio_format_t format,
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    audio_channel_mask_t channelMask,
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    int audioSession)
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32((int32_t) inputSource);
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(samplingRate);
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(format));
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(channelMask);
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(audioSession);
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(GET_INPUT, data, &reply);
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <audio_io_handle_t> (reply.readInt32());
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t startInput(audio_io_handle_t input)
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(input);
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(START_INPUT, data, &reply);
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t stopInput(audio_io_handle_t input)
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(input);
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(STOP_INPUT, data, &reply);
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void releaseInput(audio_io_handle_t input)
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(input);
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(RELEASE_INPUT, data, &reply);
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t initStreamVolume(audio_stream_type_t stream,
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    int indexMin,
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    int indexMax)
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(stream));
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(indexMin);
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(indexMax);
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(INIT_STREAM_VOLUME, data, &reply);
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          int index,
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          audio_devices_t device)
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(stream));
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(index);
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(device));
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(SET_STREAM_VOLUME, data, &reply);
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          int *index,
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          audio_devices_t device)
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(stream));
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(device));
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(GET_STREAM_VOLUME, data, &reply);
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int lIndex = reply.readInt32();
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (index) *index = lIndex;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return static_cast <status_t> (reply.readInt32());
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual uint32_t getStrategyForStream(audio_stream_type_t stream)
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Parcel data, reply;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        data.writeInt32(static_cast <uint32_t>(stream));
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply);
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return reply.readInt32();
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream)
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
281        Parcel data, reply;
282        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
283        data.writeInt32(static_cast <uint32_t>(stream));
284        remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply);
285        return (audio_devices_t) reply.readInt32();
286    }
287
288    virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc)
289    {
290        Parcel data, reply;
291        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
292        data.write(desc, sizeof(effect_descriptor_t));
293        remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply);
294        return static_cast <audio_io_handle_t> (reply.readInt32());
295    }
296
297    virtual status_t registerEffect(const effect_descriptor_t *desc,
298                                        audio_io_handle_t io,
299                                        uint32_t strategy,
300                                        int session,
301                                        int id)
302    {
303        Parcel data, reply;
304        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
305        data.write(desc, sizeof(effect_descriptor_t));
306        data.writeInt32(io);
307        data.writeInt32(strategy);
308        data.writeInt32(session);
309        data.writeInt32(id);
310        remote()->transact(REGISTER_EFFECT, data, &reply);
311        return static_cast <status_t> (reply.readInt32());
312    }
313
314    virtual status_t unregisterEffect(int id)
315    {
316        Parcel data, reply;
317        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
318        data.writeInt32(id);
319        remote()->transact(UNREGISTER_EFFECT, data, &reply);
320        return static_cast <status_t> (reply.readInt32());
321    }
322
323    virtual status_t setEffectEnabled(int id, bool enabled)
324    {
325        Parcel data, reply;
326        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
327        data.writeInt32(id);
328        data.writeInt32(enabled);
329        remote()->transact(SET_EFFECT_ENABLED, data, &reply);
330        return static_cast <status_t> (reply.readInt32());
331    }
332
333    virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
334    {
335        Parcel data, reply;
336        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
337        data.writeInt32((int32_t) stream);
338        data.writeInt32(inPastMs);
339        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
340        return reply.readInt32();
341    }
342
343    virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
344    {
345        Parcel data, reply;
346        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
347        data.writeInt32((int32_t) stream);
348        data.writeInt32(inPastMs);
349        remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply);
350        return reply.readInt32();
351    }
352
353    virtual bool isSourceActive(audio_source_t source) const
354    {
355        Parcel data, reply;
356        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
357        data.writeInt32((int32_t) source);
358        remote()->transact(IS_SOURCE_ACTIVE, data, &reply);
359        return reply.readInt32();
360    }
361
362    virtual status_t queryDefaultPreProcessing(int audioSession,
363                                               effect_descriptor_t *descriptors,
364                                               uint32_t *count)
365    {
366        if (descriptors == NULL || count == NULL) {
367            return BAD_VALUE;
368        }
369        Parcel data, reply;
370        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
371        data.writeInt32(audioSession);
372        data.writeInt32(*count);
373        status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply);
374        if (status != NO_ERROR) {
375            return status;
376        }
377        status = static_cast <status_t> (reply.readInt32());
378        uint32_t retCount = reply.readInt32();
379        if (retCount != 0) {
380            uint32_t numDesc = (retCount < *count) ? retCount : *count;
381            reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc);
382        }
383        *count = retCount;
384        return status;
385    }
386
387    virtual bool isOffloadSupported(const audio_offload_info_t& info)
388    {
389        Parcel data, reply;
390        data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
391        data.write(&info, sizeof(audio_offload_info_t));
392        remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply);
393        return reply.readInt32();    }
394};
395
396IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
397
398// ----------------------------------------------------------------------
399
400
401status_t BnAudioPolicyService::onTransact(
402    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
403{
404    switch (code) {
405        case SET_DEVICE_CONNECTION_STATE: {
406            CHECK_INTERFACE(IAudioPolicyService, data, reply);
407            audio_devices_t device =
408                    static_cast <audio_devices_t>(data.readInt32());
409            audio_policy_dev_state_t state =
410                    static_cast <audio_policy_dev_state_t>(data.readInt32());
411            const char *device_address = data.readCString();
412            reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device,
413                                                                              state,
414                                                                              device_address)));
415            return NO_ERROR;
416        } break;
417
418        case GET_DEVICE_CONNECTION_STATE: {
419            CHECK_INTERFACE(IAudioPolicyService, data, reply);
420            audio_devices_t device =
421                    static_cast<audio_devices_t> (data.readInt32());
422            const char *device_address = data.readCString();
423            reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device,
424                                                                              device_address)));
425            return NO_ERROR;
426        } break;
427
428        case SET_PHONE_STATE: {
429            CHECK_INTERFACE(IAudioPolicyService, data, reply);
430            reply->writeInt32(static_cast <uint32_t>(setPhoneState(
431                    (audio_mode_t) data.readInt32())));
432            return NO_ERROR;
433        } break;
434
435        case SET_FORCE_USE: {
436            CHECK_INTERFACE(IAudioPolicyService, data, reply);
437            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
438                    data.readInt32());
439            audio_policy_forced_cfg_t config =
440                    static_cast <audio_policy_forced_cfg_t>(data.readInt32());
441            reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config)));
442            return NO_ERROR;
443        } break;
444
445        case GET_FORCE_USE: {
446            CHECK_INTERFACE(IAudioPolicyService, data, reply);
447            audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(
448                    data.readInt32());
449            reply->writeInt32(static_cast <uint32_t>(getForceUse(usage)));
450            return NO_ERROR;
451        } break;
452
453        case GET_OUTPUT: {
454            CHECK_INTERFACE(IAudioPolicyService, data, reply);
455            audio_stream_type_t stream =
456                    static_cast <audio_stream_type_t>(data.readInt32());
457            uint32_t samplingRate = data.readInt32();
458            audio_format_t format = (audio_format_t) data.readInt32();
459            audio_channel_mask_t channelMask = data.readInt32();
460            audio_output_flags_t flags =
461                    static_cast <audio_output_flags_t>(data.readInt32());
462            bool hasOffloadInfo = data.readInt32() != 0;
463            audio_offload_info_t offloadInfo;
464            if (hasOffloadInfo) {
465                data.read(&offloadInfo, sizeof(audio_offload_info_t));
466            }
467            audio_io_handle_t output = getOutput(stream,
468                                                 samplingRate,
469                                                 format,
470                                                 channelMask,
471                                                 flags,
472                                                 hasOffloadInfo ? &offloadInfo : NULL);
473            reply->writeInt32(static_cast <int>(output));
474            return NO_ERROR;
475        } break;
476
477        case START_OUTPUT: {
478            CHECK_INTERFACE(IAudioPolicyService, data, reply);
479            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
480            audio_stream_type_t stream =
481                                static_cast <audio_stream_type_t>(data.readInt32());
482            int session = data.readInt32();
483            reply->writeInt32(static_cast <uint32_t>(startOutput(output,
484                                                                 stream,
485                                                                 session)));
486            return NO_ERROR;
487        } break;
488
489        case STOP_OUTPUT: {
490            CHECK_INTERFACE(IAudioPolicyService, data, reply);
491            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
492            audio_stream_type_t stream =
493                                static_cast <audio_stream_type_t>(data.readInt32());
494            int session = data.readInt32();
495            reply->writeInt32(static_cast <uint32_t>(stopOutput(output,
496                                                                stream,
497                                                                session)));
498            return NO_ERROR;
499        } break;
500
501        case RELEASE_OUTPUT: {
502            CHECK_INTERFACE(IAudioPolicyService, data, reply);
503            audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32());
504            releaseOutput(output);
505            return NO_ERROR;
506        } break;
507
508        case GET_INPUT: {
509            CHECK_INTERFACE(IAudioPolicyService, data, reply);
510            audio_source_t inputSource = (audio_source_t) data.readInt32();
511            uint32_t samplingRate = data.readInt32();
512            audio_format_t format = (audio_format_t) data.readInt32();
513            audio_channel_mask_t channelMask = data.readInt32();
514            int audioSession = data.readInt32();
515            audio_io_handle_t input = getInput(inputSource,
516                                               samplingRate,
517                                               format,
518                                               channelMask,
519                                               audioSession);
520            reply->writeInt32(static_cast <int>(input));
521            return NO_ERROR;
522        } break;
523
524        case START_INPUT: {
525            CHECK_INTERFACE(IAudioPolicyService, data, reply);
526            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
527            reply->writeInt32(static_cast <uint32_t>(startInput(input)));
528            return NO_ERROR;
529        } break;
530
531        case STOP_INPUT: {
532            CHECK_INTERFACE(IAudioPolicyService, data, reply);
533            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
534            reply->writeInt32(static_cast <uint32_t>(stopInput(input)));
535            return NO_ERROR;
536        } break;
537
538        case RELEASE_INPUT: {
539            CHECK_INTERFACE(IAudioPolicyService, data, reply);
540            audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
541            releaseInput(input);
542            return NO_ERROR;
543        } break;
544
545        case INIT_STREAM_VOLUME: {
546            CHECK_INTERFACE(IAudioPolicyService, data, reply);
547            audio_stream_type_t stream =
548                    static_cast <audio_stream_type_t>(data.readInt32());
549            int indexMin = data.readInt32();
550            int indexMax = data.readInt32();
551            reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax)));
552            return NO_ERROR;
553        } break;
554
555        case SET_STREAM_VOLUME: {
556            CHECK_INTERFACE(IAudioPolicyService, data, reply);
557            audio_stream_type_t stream =
558                    static_cast <audio_stream_type_t>(data.readInt32());
559            int index = data.readInt32();
560            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
561            reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream,
562                                                                          index,
563                                                                          device)));
564            return NO_ERROR;
565        } break;
566
567        case GET_STREAM_VOLUME: {
568            CHECK_INTERFACE(IAudioPolicyService, data, reply);
569            audio_stream_type_t stream =
570                    static_cast <audio_stream_type_t>(data.readInt32());
571            audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
572            int index;
573            status_t status = getStreamVolumeIndex(stream, &index, device);
574            reply->writeInt32(index);
575            reply->writeInt32(static_cast <uint32_t>(status));
576            return NO_ERROR;
577        } break;
578
579        case GET_STRATEGY_FOR_STREAM: {
580            CHECK_INTERFACE(IAudioPolicyService, data, reply);
581            audio_stream_type_t stream =
582                    static_cast <audio_stream_type_t>(data.readInt32());
583            reply->writeInt32(getStrategyForStream(stream));
584            return NO_ERROR;
585        } break;
586
587        case GET_DEVICES_FOR_STREAM: {
588            CHECK_INTERFACE(IAudioPolicyService, data, reply);
589            audio_stream_type_t stream =
590                    static_cast <audio_stream_type_t>(data.readInt32());
591            reply->writeInt32(static_cast <int>(getDevicesForStream(stream)));
592            return NO_ERROR;
593        } break;
594
595        case GET_OUTPUT_FOR_EFFECT: {
596            CHECK_INTERFACE(IAudioPolicyService, data, reply);
597            effect_descriptor_t desc;
598            data.read(&desc, sizeof(effect_descriptor_t));
599            audio_io_handle_t output = getOutputForEffect(&desc);
600            reply->writeInt32(static_cast <int>(output));
601            return NO_ERROR;
602        } break;
603
604        case REGISTER_EFFECT: {
605            CHECK_INTERFACE(IAudioPolicyService, data, reply);
606            effect_descriptor_t desc;
607            data.read(&desc, sizeof(effect_descriptor_t));
608            audio_io_handle_t io = data.readInt32();
609            uint32_t strategy = data.readInt32();
610            int session = data.readInt32();
611            int id = data.readInt32();
612            reply->writeInt32(static_cast <int32_t>(registerEffect(&desc,
613                                                                   io,
614                                                                   strategy,
615                                                                   session,
616                                                                   id)));
617            return NO_ERROR;
618        } break;
619
620        case UNREGISTER_EFFECT: {
621            CHECK_INTERFACE(IAudioPolicyService, data, reply);
622            int id = data.readInt32();
623            reply->writeInt32(static_cast <int32_t>(unregisterEffect(id)));
624            return NO_ERROR;
625        } break;
626
627        case SET_EFFECT_ENABLED: {
628            CHECK_INTERFACE(IAudioPolicyService, data, reply);
629            int id = data.readInt32();
630            bool enabled = static_cast <bool>(data.readInt32());
631            reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled)));
632            return NO_ERROR;
633        } break;
634
635        case IS_STREAM_ACTIVE: {
636            CHECK_INTERFACE(IAudioPolicyService, data, reply);
637            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
638            uint32_t inPastMs = (uint32_t)data.readInt32();
639            reply->writeInt32( isStreamActive(stream, inPastMs) );
640            return NO_ERROR;
641        } break;
642
643        case IS_STREAM_ACTIVE_REMOTELY: {
644            CHECK_INTERFACE(IAudioPolicyService, data, reply);
645            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
646            uint32_t inPastMs = (uint32_t)data.readInt32();
647            reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) );
648            return NO_ERROR;
649        } break;
650
651        case IS_SOURCE_ACTIVE: {
652            CHECK_INTERFACE(IAudioPolicyService, data, reply);
653            audio_source_t source = (audio_source_t) data.readInt32();
654            reply->writeInt32( isSourceActive(source));
655            return NO_ERROR;
656        }
657
658        case QUERY_DEFAULT_PRE_PROCESSING: {
659            CHECK_INTERFACE(IAudioPolicyService, data, reply);
660            int audioSession = data.readInt32();
661            uint32_t count = data.readInt32();
662            uint32_t retCount = count;
663            effect_descriptor_t *descriptors =
664                    (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)];
665            status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount);
666            reply->writeInt32(status);
667            if (status != NO_ERROR && status != NO_MEMORY) {
668                retCount = 0;
669            }
670            reply->writeInt32(retCount);
671            if (retCount) {
672                if (retCount < count) {
673                    count = retCount;
674                }
675                reply->write(descriptors, sizeof(effect_descriptor_t) * count);
676            }
677            delete[] descriptors;
678            return status;
679        }
680
681        case IS_OFFLOAD_SUPPORTED: {
682            CHECK_INTERFACE(IAudioPolicyService, data, reply);
683            audio_offload_info_t info;
684            data.read(&info, sizeof(audio_offload_info_t));
685            bool isSupported = isOffloadSupported(info);
686            reply->writeInt32(isSupported);
687            return NO_ERROR;
688        }
689
690        default:
691            return BBinder::onTransact(code, data, reply, flags);
692    }
693}
694
695// ----------------------------------------------------------------------------
696
697}; // namespace android
698