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