1c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent/* 2c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 3c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Copyright 2009, The Android Open Source Project 4c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 5c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Licensed under the Apache License, Version 2.0 (the "License"); 6c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** you may not use this file except in compliance with the License. 7c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** You may obtain a copy of the License at 8c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 9c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** http://www.apache.org/licenses/LICENSE-2.0 10c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 11c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Unless required by applicable law or agreed to in writing, software 12c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** distributed under the License is distributed on an "AS IS" BASIS, 13c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** See the License for the specific language governing permissions and 15c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** limitations under the License. 16c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent*/ 17c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 18c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#define LOG_TAG "IAudioPolicyService" 19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <utils/Log.h> 20c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 21c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <stdint.h> 22ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent#include <math.h> 23c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <sys/types.h> 24c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 25b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent#include <binder/IPCThreadState.h> 26c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <binder/Parcel.h> 27f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent#include <cutils/multiuser.h> 2874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent#include <media/AudioEffect.h> 29c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h> 303528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent#include <media/TimeCheck.h> 314980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent#include <private/android_filesystem_config.h> 3264760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 33fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android { 35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 36c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum { 37c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION, 38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_DEVICE_CONNECTION_STATE, 39f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov HANDLE_DEVICE_CONFIG_CHANGE, 40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PHONE_STATE, 410b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten SET_RINGER_MODE, // reserved, no longer used 42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_FORCE_USE, 43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_FORCE_USE, 44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_OUTPUT, 45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_OUTPUT, 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_OUTPUT, 47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_OUTPUT, 48caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent GET_INPUT_FOR_ATTR, 49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_INPUT, 50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_INPUT, 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_INPUT, 52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent INIT_STREAM_VOLUME, 53c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_STREAM_VOLUME, 54de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STREAM_VOLUME, 55de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STRATEGY_FOR_STREAM, 56de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_OUTPUT_FOR_EFFECT, 57de070137f11d346fba77605bd76a44c040a618fcEric Laurent REGISTER_EFFECT, 58eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent UNREGISTER_EFFECT, 596b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten IS_STREAM_ACTIVE, 60d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi IS_SOURCE_ACTIVE, 616b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten GET_DEVICES_FOR_STREAM, 62db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent QUERY_DEFAULT_PRE_PROCESSING, 63272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi SET_EFFECT_ENABLED, 64ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald IS_STREAM_ACTIVE_REMOTELY, 65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent IS_OFFLOAD_SUPPORTED, 66203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PORTS, 67203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent GET_AUDIO_PORT, 68203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CREATE_AUDIO_PATCH, 69203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent RELEASE_AUDIO_PATCH, 70203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PATCHES, 71b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent SET_AUDIO_PORT_CONFIG, 725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi REGISTER_CLIENT, 73df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent GET_OUTPUT_FOR_ATTR, 74df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent ACQUIRE_SOUNDTRIGGER_SESSION, 75bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent RELEASE_SOUNDTRIGGER_SESSION, 76baac183f3808d7b68f184647a97bd381620415feEric Laurent GET_PHONE_STATE, 77baac183f3808d7b68f184647a97bd381620415feEric Laurent REGISTER_POLICY_MIXES, 78554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent START_AUDIO_SOURCE, 79e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent STOP_AUDIO_SOURCE, 80e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent SET_AUDIO_PORT_CALLBACK_ENABLED, 812ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung SET_MASTER_MONO, 822ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung GET_MASTER_MONO, 83817729095966c338615a8a791d2dbf774fc034efjiabin GET_STREAM_VOLUME_DB, 84817729095966c338615a8a791d2dbf774fc034efjiabin GET_SURROUND_FORMATS, 85817729095966c338615a8a791d2dbf774fc034efjiabin SET_SURROUND_FORMAT_ENABLED 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 881d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024 891d670b11313250442455a22f1056ad649d607fb2Eric Laurent 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 93090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioPolicyService(const sp<IBinder>& impl) 94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 99fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 100fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 101e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 102e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 109e743a47f445f02a0612018fa5640301304844fbfPaul McLean data.writeCString(device_name); 110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 114fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 115fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 123fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 126f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov virtual status_t handleDeviceConfigChange(audio_devices_t device, 127f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_address, 128f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_name) 129f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov { 130f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov Parcel data, reply; 131f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 132f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeInt32(static_cast <uint32_t>(device)); 133f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeCString(device_address); 134f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeCString(device_name); 135f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply); 136f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov return static_cast <status_t> (reply.readInt32()); 137f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov } 138f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov 139f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 148fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 158fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 163c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 164fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 166c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 167f4e63452b37c799c9387a6a88b46e6191f6a5f7eEric Laurent virtual audio_io_handle_t getOutput(audio_stream_type_t stream) 168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 173fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 174c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 180766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar pid_t pid, 1818c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 18220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent const audio_config_t *config, 183e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 1849ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent audio_port_handle_t *selectedDeviceId, 18520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t *portId) 1865bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi { 1875bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Parcel data, reply; 1885bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1895bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (attr == NULL) { 190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr(): NULL audio attributes and stream type"); 192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr unspecified stream type"); 196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (output == NULL) { 200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr NULL output - shouldn't happen"); 201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 2039ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent if (selectedDeviceId == NULL) { 2049ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent ALOGE("getOutputForAttr NULL selectedDeviceId - shouldn't happen"); 2059ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent return BAD_VALUE; 2069ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent } 20720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent if (portId == NULL) { 20820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent ALOGE("getOutputForAttr NULL portId - shouldn't happen"); 20920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent return BAD_VALUE; 21020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent } 211e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr == NULL) { 212e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 213e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 214e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 215e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.write(attr, sizeof(audio_attributes_t)); 216e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 217e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(session); 218e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 219e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 220e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 221e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(*stream); 2235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 224766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar data.writeInt32(pid); 2258c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 22620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.write(config, sizeof(audio_config_t)); 2275bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 2289ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent data.writeInt32(*selectedDeviceId); 22920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.writeInt32(*portId); 230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status = (status_t)reply.readInt32(); 235e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 237e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 238e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 23920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32(); 240e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream != NULL) { 24120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent *stream = lStream; 242e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 2439ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent *selectedDeviceId = (audio_port_handle_t)reply.readInt32(); 24420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent *portId = (audio_port_handle_t)reply.readInt32(); 245e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 2465bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2475bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 248de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 249fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 250e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 254fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 255fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 256d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 260c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 261de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 262fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 263e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 267fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 268fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 269d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 274e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 275e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 276e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 280fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 281e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)stream); 282e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 284c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 285c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 286caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 287caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 288caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 289b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid, 2908c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 291fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent const String16& opPackageName, 29220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent const audio_config_base_t *config, 293466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 2949ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent audio_port_handle_t *selectedDeviceId, 29520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t *portId) 296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 298c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr == NULL) { 300caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL attr - shouldn't happen"); 301caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 302caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 303caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (input == NULL) { 304caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL input - shouldn't happen"); 305caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 306caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 3079ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent if (selectedDeviceId == NULL) { 3089ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen"); 3099ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent return BAD_VALUE; 3109ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent } 31120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent if (portId == NULL) { 31220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent ALOGE("getInputForAttr NULL portId - shouldn't happen"); 31320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent return BAD_VALUE; 31420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent } 315caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.write(attr, sizeof(audio_attributes_t)); 316a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent data.writeInt32(*input); 317caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.writeInt32(session); 318b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent data.writeInt32(pid); 3198c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 320fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent data.writeString16(opPackageName); 32120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.write(config, sizeof(audio_config_base_t)); 322b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 3239ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent data.writeInt32(*selectedDeviceId); 32420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.writeInt32(*portId); 325caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 326caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 327caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 328caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 329caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status = reply.readInt32(); 330caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 331caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 332caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 333caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent *input = (audio_io_handle_t)reply.readInt32(); 3349ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent *selectedDeviceId = (audio_port_handle_t)reply.readInt32(); 33520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent *portId = (audio_port_handle_t)reply.readInt32(); 336caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 339fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent virtual status_t startInput(audio_port_handle_t portId, 340f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov bool *silenced) 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 344fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent data.writeInt32(portId); 345f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.writeInt32(*silenced ? 1 : 0); 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 347f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov status_t status = static_cast <status_t> (reply.readInt32()); 348f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov *silenced = reply.readInt32() == 1; 349f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov return status; 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 352fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent virtual status_t stopInput(audio_port_handle_t portId) 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 356fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent data.writeInt32(portId); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 361fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent virtual void releaseInput(audio_port_handle_t portId) 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 365fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent data.writeInt32(portId); 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 369fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 38283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 38383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 38483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 39083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 39683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 39783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 40283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 40383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 409de070137f11d346fba77605bd76a44c040a618fcEric Laurent 410fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 411de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 412de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 413de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 414de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 415de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 416de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 417de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 418de070137f11d346fba77605bd76a44c040a618fcEric Laurent 4196374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 4206b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 4216b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 4226b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 4236b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 4246b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 4256374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 4266b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 4276b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 42858e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 429de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 430de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 431de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 432de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 433de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 434de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 435de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 436de070137f11d346fba77605bd76a44c040a618fcEric Laurent 43758e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 4387c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 439de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 440d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session, 441de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 442de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 443de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 444de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 445de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 4467c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 447de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 448de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 449de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 450de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 451de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 452de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 453de070137f11d346fba77605bd76a44c040a618fcEric Laurent 454de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 455de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 456de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 457de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 458de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 459de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 460de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 461de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 462de070137f11d346fba77605bd76a44c040a618fcEric Laurent 463db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 464db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 465db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 466db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 467db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 468db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 469db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 470db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 471db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 472db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 473fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 474eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 475eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 476eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 477fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 478eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 479eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 480eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 481eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 48257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 483272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 484272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 485272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 486272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 487272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 488272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 489272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 490272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 491272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 492272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 493d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 494d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 495d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 496d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 497d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 498d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 499d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 500d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 501d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 502d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t queryDefaultPreProcessing(audio_session_t audioSession, 50357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 50457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 50557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 50657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 50757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 50857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 50957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 51057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 51157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 51257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 51357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 51457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 51557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 51657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 51757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 51857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 51957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 52057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 52157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 52257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 52357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 52457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 52557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 526ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 527ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 528ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 529b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 530b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 531b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 532b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 640203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 641203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 642203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 643203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 644203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 645203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 646203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 647203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 648203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 649203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 650203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 651203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 652203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 653203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 654203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 655203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 656203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 657203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 658203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 659203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 661b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 662b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 663b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 664b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 665f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 666b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 667b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 669e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent virtual void setAudioPortCallbacksEnabled(bool enabled) 670e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent { 671e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent Parcel data, reply; 672e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 673e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInt32(enabled ? 1 : 0); 674e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply); 675e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } 676e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 678df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 682df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 683df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 684df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 685df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 686df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 687df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 688df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 689df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 690df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 691df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 692df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 693df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 694df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 695df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 696df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 697df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 698df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 699df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 700df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 701df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 702df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 703df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 704df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 705df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 706df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 707df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 708df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 709df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 710bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 711bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 712bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 713bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 714bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 715bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 716bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 717bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 718bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 719bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 720bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 721baac183f3808d7b68f184647a97bd381620415feEric Laurent 722e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) 723baac183f3808d7b68f184647a97bd381620415feEric Laurent { 724baac183f3808d7b68f184647a97bd381620415feEric Laurent Parcel data, reply; 725baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 726baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(registration ? 1 : 0); 727baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = mixes.size(); 728baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 729baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 730baac183f3808d7b68f184647a97bd381620415feEric Laurent } 731baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t sizePosition = data.dataPosition(); 732baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(size); 733baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t finalSize = size; 734baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 735baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 736baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mixes[i].writeToParcel(&data) != NO_ERROR) { 737baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 738baac183f3808d7b68f184647a97bd381620415feEric Laurent finalSize--; 739baac183f3808d7b68f184647a97bd381620415feEric Laurent } 740baac183f3808d7b68f184647a97bd381620415feEric Laurent } 741baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size != finalSize) { 742baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 743baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(sizePosition); 744baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(finalSize); 745baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 746baac183f3808d7b68f184647a97bd381620415feEric Laurent } 747baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); 748baac183f3808d7b68f184647a97bd381620415feEric Laurent if (status == NO_ERROR) { 749baac183f3808d7b68f184647a97bd381620415feEric Laurent status = (status_t)reply.readInt32(); 750baac183f3808d7b68f184647a97bd381620415feEric Laurent } 751baac183f3808d7b68f184647a97bd381620415feEric Laurent return status; 752baac183f3808d7b68f184647a97bd381620415feEric Laurent } 753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t startAudioSource(const struct audio_port_config *source, 755554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 756559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten audio_patch_handle_t *handle) 757554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 758554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 759554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 760554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (source == NULL || attributes == NULL || handle == NULL) { 761554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return BAD_VALUE; 762554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 763554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(source, sizeof(struct audio_port_config)); 764554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(attributes, sizeof(audio_attributes_t)); 765554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply); 766554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 767554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 768554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 769554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 770554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 771554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 772554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 773559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten *handle = (audio_patch_handle_t)reply.readInt32(); 774554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 775554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 776554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 777559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten virtual status_t stopAudioSource(audio_patch_handle_t handle) 778554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 779554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 780554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 781554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInt32(handle); 782554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply); 783554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 784554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 785554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 786554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 787554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 788554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 7892ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 7902ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t setMasterMono(bool mono) 7912ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 7922ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 7932ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 7942ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInt32(static_cast<int32_t>(mono)); 7952ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(SET_MASTER_MONO, data, &reply); 7962ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 7972ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 7982ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7992ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return static_cast<status_t>(reply.readInt32()); 8002ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8012ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 8022ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t getMasterMono(bool *mono) 8032ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 8042ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (mono == nullptr) { 8052ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return BAD_VALUE; 8062ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8072ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 8082ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 8092ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 8102ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(GET_MASTER_MONO, data, &reply); 8112ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 8122ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8132ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8142ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status = static_cast<status_t>(reply.readInt32()); 8152ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 8162ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung *mono = static_cast<bool>(reply.readInt32()); 8172ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8182ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8192ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 820ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent 821ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device) 822ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent { 823ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent Parcel data, reply; 824ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 825ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeInt32(static_cast <int32_t>(stream)); 826ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeInt32(static_cast <int32_t>(index)); 827ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeUint32(static_cast <uint32_t>(device)); 828ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply); 829ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent if (status != NO_ERROR) { 830ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent return NAN; 831ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent } 832ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent return reply.readFloat(); 833ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent } 834817729095966c338615a8a791d2dbf774fc034efjiabin 835817729095966c338615a8a791d2dbf774fc034efjiabin virtual status_t getSurroundFormats(unsigned int *numSurroundFormats, 836817729095966c338615a8a791d2dbf774fc034efjiabin audio_format_t *surroundFormats, 837817729095966c338615a8a791d2dbf774fc034efjiabin bool *surroundFormatsEnabled, 838817729095966c338615a8a791d2dbf774fc034efjiabin bool reported) 839817729095966c338615a8a791d2dbf774fc034efjiabin { 840817729095966c338615a8a791d2dbf774fc034efjiabin if (numSurroundFormats == NULL || (*numSurroundFormats != 0 && 841817729095966c338615a8a791d2dbf774fc034efjiabin (surroundFormats == NULL || surroundFormatsEnabled == NULL))) { 842817729095966c338615a8a791d2dbf774fc034efjiabin return BAD_VALUE; 843817729095966c338615a8a791d2dbf774fc034efjiabin } 844817729095966c338615a8a791d2dbf774fc034efjiabin Parcel data, reply; 845817729095966c338615a8a791d2dbf774fc034efjiabin data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 846817729095966c338615a8a791d2dbf774fc034efjiabin unsigned int numSurroundFormatsReq = *numSurroundFormats; 847817729095966c338615a8a791d2dbf774fc034efjiabin data.writeUint32(numSurroundFormatsReq); 848817729095966c338615a8a791d2dbf774fc034efjiabin data.writeBool(reported); 849817729095966c338615a8a791d2dbf774fc034efjiabin status_t status = remote()->transact(GET_SURROUND_FORMATS, data, &reply); 850817729095966c338615a8a791d2dbf774fc034efjiabin if (status == NO_ERROR && (status = (status_t)reply.readInt32()) == NO_ERROR) { 851817729095966c338615a8a791d2dbf774fc034efjiabin *numSurroundFormats = reply.readUint32(); 852817729095966c338615a8a791d2dbf774fc034efjiabin } 853817729095966c338615a8a791d2dbf774fc034efjiabin if (status == NO_ERROR) { 854817729095966c338615a8a791d2dbf774fc034efjiabin if (numSurroundFormatsReq > *numSurroundFormats) { 855817729095966c338615a8a791d2dbf774fc034efjiabin numSurroundFormatsReq = *numSurroundFormats; 856817729095966c338615a8a791d2dbf774fc034efjiabin } 857817729095966c338615a8a791d2dbf774fc034efjiabin if (numSurroundFormatsReq > 0) { 858817729095966c338615a8a791d2dbf774fc034efjiabin status = reply.read(surroundFormats, 859817729095966c338615a8a791d2dbf774fc034efjiabin numSurroundFormatsReq * sizeof(audio_format_t)); 860817729095966c338615a8a791d2dbf774fc034efjiabin if (status != NO_ERROR) { 861817729095966c338615a8a791d2dbf774fc034efjiabin return status; 862817729095966c338615a8a791d2dbf774fc034efjiabin } 863817729095966c338615a8a791d2dbf774fc034efjiabin status = reply.read(surroundFormatsEnabled, 864817729095966c338615a8a791d2dbf774fc034efjiabin numSurroundFormatsReq * sizeof(bool)); 865817729095966c338615a8a791d2dbf774fc034efjiabin } 866817729095966c338615a8a791d2dbf774fc034efjiabin } 867817729095966c338615a8a791d2dbf774fc034efjiabin return status; 868817729095966c338615a8a791d2dbf774fc034efjiabin } 869817729095966c338615a8a791d2dbf774fc034efjiabin 870817729095966c338615a8a791d2dbf774fc034efjiabin virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) 871817729095966c338615a8a791d2dbf774fc034efjiabin { 872817729095966c338615a8a791d2dbf774fc034efjiabin Parcel data, reply; 873817729095966c338615a8a791d2dbf774fc034efjiabin data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 874817729095966c338615a8a791d2dbf774fc034efjiabin data.writeInt32(audioFormat); 875817729095966c338615a8a791d2dbf774fc034efjiabin data.writeBool(enabled); 876817729095966c338615a8a791d2dbf774fc034efjiabin status_t status = remote()->transact(SET_SURROUND_FORMAT_ENABLED, data, &reply); 877817729095966c338615a8a791d2dbf774fc034efjiabin if (status != NO_ERROR) { 878817729095966c338615a8a791d2dbf774fc034efjiabin return status; 879817729095966c338615a8a791d2dbf774fc034efjiabin } 880817729095966c338615a8a791d2dbf774fc034efjiabin return reply.readInt32(); 881817729095966c338615a8a791d2dbf774fc034efjiabin } 882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 884c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 891b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent // make sure transactions reserved to AudioFlinger do not come from other processes 892b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent switch (code) { 893b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case START_OUTPUT: 894b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case STOP_OUTPUT: 895b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RELEASE_OUTPUT: 896b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case GET_INPUT_FOR_ATTR: 897b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case START_INPUT: 898b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case STOP_INPUT: 899b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RELEASE_INPUT: 900b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case GET_STRATEGY_FOR_STREAM: 901b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case GET_OUTPUT_FOR_EFFECT: 902b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case REGISTER_EFFECT: 903b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case UNREGISTER_EFFECT: 904b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_EFFECT_ENABLED: 905b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case GET_OUTPUT_FOR_ATTR: 906b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: 907b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RELEASE_SOUNDTRIGGER_SESSION: 908b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent ALOGW("%s: transaction %d received from PID %d", 909b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent __func__, code, IPCThreadState::self()->getCallingPid()); 910ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent // return status only for non void methods 911ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent switch (code) { 912ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent case RELEASE_OUTPUT: 913ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent case RELEASE_INPUT: 914ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent break; 915ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent default: 916ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 917ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent break; 918ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent } 919ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent return OK; 920b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent default: 921b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent break; 922b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent } 923b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent 9244980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent // make sure the following transactions come from system components 9254980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent switch (code) { 9264980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_DEVICE_CONNECTION_STATE: 9274980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case HANDLE_DEVICE_CONFIG_CHANGE: 9284980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_PHONE_STATE: 929e17378d11b275daecd20ff840bcb7d275b6801bfEric Laurent//FIXME: Allow SET_FORCE_USE calls from system apps until a better use case routing API is available 930e17378d11b275daecd20ff840bcb7d275b6801bfEric Laurent// case SET_FORCE_USE: 9314980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case INIT_STREAM_VOLUME: 9324980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_STREAM_VOLUME: 9334980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case REGISTER_POLICY_MIXES: 93410b7123bd6ce29fe756422aeedc5cfe469c4309fEric Laurent case SET_MASTER_MONO: 93510b7123bd6ce29fe756422aeedc5cfe469c4309fEric Laurent case START_AUDIO_SOURCE: 936817729095966c338615a8a791d2dbf774fc034efjiabin case STOP_AUDIO_SOURCE: 937817729095966c338615a8a791d2dbf774fc034efjiabin case GET_SURROUND_FORMATS: 938817729095966c338615a8a791d2dbf774fc034efjiabin case SET_SURROUND_FORMAT_ENABLED: { 939f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent if (multiuser_get_app_id(IPCThreadState::self()->getCallingUid()) >= AID_APP_START) { 9404980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", 9414980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent __func__, code, IPCThreadState::self()->getCallingPid(), 9424980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent IPCThreadState::self()->getCallingUid()); 943ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 944ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent return OK; 9454980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent } 94696c7eed596077ff84e75b7b1c6f20c3a29219bd1Eric Laurent } break; 9474980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent default: 9484980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent break; 9494980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent } 9504980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent 951da6a5a80b402fa0d836240d7e05cd887080c4f4dEric Laurent TimeCheck check("IAudioPolicyService"); 9523528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent 953e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 954c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 955c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 956fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 957fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 958fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 959fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 960c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 961e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name = data.readCString(); 962c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr || device_name == nullptr) { 963c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device); 964c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 965c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 966c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 967c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov state, 968c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address, 969c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_name))); 970c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 971c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 972c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 973c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 974c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 975c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 976fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 977fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 978c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 979c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr) { 980c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device); 981c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE)); 982c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 983c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 984c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address))); 985c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 986c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 987c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 988c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 989f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov case HANDLE_DEVICE_CONFIG_CHANGE: { 990f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov CHECK_INTERFACE(IAudioPolicyService, data, reply); 991f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov audio_devices_t device = 992f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov static_cast <audio_devices_t>(data.readInt32()); 993f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_address = data.readCString(); 994f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_name = data.readCString(); 995c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr || device_name == nullptr) { 996c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device); 997c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 998c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 999c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device, 1000c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address, 1001c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_name))); 1002c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 1003f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov return NO_ERROR; 1004f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov } break; 1005f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov 1006c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 1007c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 100885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 100985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 1010c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1011c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1012c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1013c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 1014c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 101585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 101685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 1017fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 1018fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 1019c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 1020c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1021c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1022c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1023c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 1024c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 102585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 102685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 1027c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 1028c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1029c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1030c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1031c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 1032c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1033fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1034fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1035f4e63452b37c799c9387a6a88b46e6191f6a5f7eEric Laurent audio_io_handle_t output = getOutput(stream); 1036fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1039c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 10405bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 10415bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1042b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung audio_attributes_t attr = {}; 1043e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 1044e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 1045e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 104639fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard sanetizeAudioAttributes(&attr); 1047e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 1048e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1049e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 1050e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 1051e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 1052e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 1053e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 1054766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar pid_t pid = (pid_t)data.readInt32(); 10558c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 105620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_config_t config; 105720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent memset(&config, 0, sizeof(audio_config_t)); 105820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.read(&config, sizeof(audio_config_t)); 10595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 10605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 1061aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId = data.readInt32(); 106220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId = (audio_port_handle_t)data.readInt32(); 1063a946d844a77906072f5eb7093d41db465d6514bbRobert Shih audio_io_handle_t output = 0; 1064e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 1065766fb020a50b64bf9a808bd80df60c54c2ca8cc3Nadav Bar &output, session, &stream, pid, uid, 106620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent &config, 10679ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent flags, &selectedDeviceId, &portId); 1068e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 1069e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 1070e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 10719ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent reply->writeInt32(selectedDeviceId); 107220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent reply->writeInt32(portId); 10735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 10745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 10755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 1076c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 1077c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1078fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 1079ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 1080ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 1081e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1082de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 1083ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 1084de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 1085c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1090fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 1091ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 1092ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 1093e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1094de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 1095ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 1096de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 1097c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1098c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1099c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 1101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1102fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 1103e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 1104e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1105e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 1106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1109caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent case GET_INPUT_FOR_ATTR: { 1110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1111b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung audio_attributes_t attr = {}; 1112caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.read(&attr, sizeof(audio_attributes_t)); 111339fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard sanetizeAudioAttributes(&attr); 1114a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1115caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1116b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid = (pid_t)data.readInt32(); 11178c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 1118fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent const String16 opPackageName = data.readString16(); 111920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_config_base_t config; 112020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent memset(&config, 0, sizeof(audio_config_base_t)); 112120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.read(&config, sizeof(audio_config_base_t)); 1122b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1123466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32(); 112420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId = (audio_port_handle_t)data.readInt32(); 1125b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent status_t status = getInputForAttr(&attr, &input, session, pid, uid, 1126fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent opPackageName, &config, 11279ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent flags, &selectedDeviceId, &portId); 1128caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(status); 1129caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status == NO_ERROR) { 1130caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(input); 11319ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent reply->writeInt32(selectedDeviceId); 113220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent reply->writeInt32(portId); 1133caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1139fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1140f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov bool silenced = data.readInt32() == 1; 1141fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent status_t status = startInput(portId, &silenced); 1142f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov reply->writeInt32(static_cast <uint32_t>(status)); 1143f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov reply->writeInt32(silenced ? 1 : 0); 1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 1148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1149fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1150fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(portId))); 1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1156fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1157fee1976a2849c37a53d8a01ac10327d522a1ba93Eric Laurent releaseInput(portId); 1158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 1162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1163fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1164fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 1166c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 1167c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 1168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 1172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1173fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1174fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 117683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 117783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 117883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 117983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 1180c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1181c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1182c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1183c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 1184c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1185fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1186fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 118783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1188892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih int index = 0; 118983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 1190c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 1191c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 1192c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1193c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1194c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1195de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 1196de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1197fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1198fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1199de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 1200de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1201de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1202de070137f11d346fba77605bd76a44c040a618fcEric Laurent 12036b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 12046b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 1205fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1206fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 12076b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 12086b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 12096b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 12106b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 1211de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 1212de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1213b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung effect_descriptor_t desc = {}; 1214b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung if (data.read(&desc, sizeof(desc)) != NO_ERROR) { 1215b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung android_errorWriteLog(0x534e4554, "73126106"); 1216b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung } 1217b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung (void)sanitizeEffectDescriptor(&desc); 1218de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 1219de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 1220de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1221de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1222de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1223de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 1224de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1225b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung effect_descriptor_t desc = {}; 1226b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung if (data.read(&desc, sizeof(desc)) != NO_ERROR) { 1227b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung android_errorWriteLog(0x534e4554, "73126106"); 1228b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung } 1229b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung (void)sanitizeEffectDescriptor(&desc); 12307c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 1231de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 1232d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 1233de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1234de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 12357c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 1236de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 1237de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 1238de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 1239de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1240de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1241de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1242de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 1243de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1244de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1245de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 1246de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1247de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1248de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1249db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 1250db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1251db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 1252db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 1253db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 1254db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 1255db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 1256db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 1257eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 1258eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1259fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1260eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 1261ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 1262eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 1263eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 1264eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 1265272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 1266272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1267272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1268272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 1269ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 1270272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 1271272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 1272272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 1273d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 1274d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1275d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 1276d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 1277d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 1278d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 1279d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 128057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 128157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1282d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 128357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 128474adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 128574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 128674adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 128757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 1288b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung effect_descriptor_t *descriptors = new effect_descriptor_t[count]{}; 128957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 129057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 129157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 129257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 129357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 129457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 129574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 129657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 129757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 129857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 129957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 130057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 130157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 130257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 130357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 130457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 1305b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 1306b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 1307b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung audio_offload_info_t info = {}; 1308b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 1309b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 1310b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 1311b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 1312b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1313b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1314203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1315203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1316203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1317203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1318203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 13191d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 13201d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 13211d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1322203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1323203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1324203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 13251d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (ports == NULL) { 13261d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 13271d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 13281d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 13291d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 13301d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1331203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1332203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1333203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1334203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1335203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1336203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1337203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1338203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1339203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1340203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1341203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1342203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1343203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1344203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1345203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1346203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1347203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1348e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1349e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1350e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1351e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1352203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1353203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1354203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1355203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1356203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1357203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1358203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1359203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1360203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1361203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1362b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung struct audio_patch patch = {}; 1363203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1364a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1365e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1366e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1367e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1368203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1369203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1370203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1371203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1372203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1373203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1374203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1375203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1376203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1377203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1378b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1379203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1380203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1381203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1382203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1383203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1384203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1385203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1386203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1387203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 13881d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 13891d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 13901d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1391203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1392203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1393203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1394203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 13951d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (patches == NULL) { 13961d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 13971d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 13981d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 13991d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 14001d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1401203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1402203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1403203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1404203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1405203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1406203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1407203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1408203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1409203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1410203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1411203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1412203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1413203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1414203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1415203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1416203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1417b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung struct audio_port_config config = {}; 1418203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 1419b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung (void)sanitizeAudioPortConfig(&config); 1420203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1421203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1422203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1423203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1424df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1425b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1426b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1427b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1428b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1429b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1430b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1431b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1432203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1433e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent case SET_AUDIO_PORT_CALLBACK_ENABLED: { 1434e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1435e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent setAudioPortCallbacksEnabled(data.readInt32() == 1); 1436e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent return NO_ERROR; 1437e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } break; 1438e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 1439df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1440df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1441df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1442df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1443a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_session_t session = AUDIO_SESSION_NONE; 1444a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE; 1445a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_devices_t device = AUDIO_DEVICE_NONE; 1446df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1447df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1448df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1449df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1450df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1451df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1452df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1453df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1454df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1455df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1456df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1457df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1458df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1459df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1460df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1461df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1462df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1463df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1464df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1465df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1466bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1467bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1468bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1469bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1470bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1471bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1472baac183f3808d7b68f184647a97bd381620415feEric Laurent case REGISTER_POLICY_MIXES: { 1473baac183f3808d7b68f184647a97bd381620415feEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1474baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration = data.readInt32() == 1; 1475baac183f3808d7b68f184647a97bd381620415feEric Laurent Vector<AudioMix> mixes; 1476baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = (size_t)data.readInt32(); 1477baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 1478baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 1479baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1480baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 1481baac183f3808d7b68f184647a97bd381620415feEric Laurent AudioMix mix; 1482baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { 1483baac183f3808d7b68f184647a97bd381620415feEric Laurent mixes.add(mix); 1484baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1485baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1486baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = registerPolicyMixes(mixes, registration); 1487baac183f3808d7b68f184647a97bd381620415feEric Laurent reply->writeInt32(status); 1488baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_ERROR; 1489baac183f3808d7b68f184647a97bd381620415feEric Laurent } break; 1490baac183f3808d7b68f184647a97bd381620415feEric Laurent 1491554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case START_AUDIO_SOURCE: { 1492554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1493b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung struct audio_port_config source = {}; 1494554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&source, sizeof(struct audio_port_config)); 1495b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung (void)sanitizeAudioPortConfig(&source); 1496b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung audio_attributes_t attributes = {}; 1497554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&attributes, sizeof(audio_attributes_t)); 149839fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard sanetizeAudioAttributes(&attributes); 1499559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1500554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = startAudioSource(&source, &attributes, &handle); 1501554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1502554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(handle); 1503554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1504554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1505554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1506554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case STOP_AUDIO_SOURCE: { 1507554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1508559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten audio_patch_handle_t handle = (audio_patch_handle_t) data.readInt32(); 1509554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = stopAudioSource(handle); 1510554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1511554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1512554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1513554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 15142ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case SET_MASTER_MONO: { 15152ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 15162ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono = static_cast<bool>(data.readInt32()); 15172ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = setMasterMono(mono); 15182ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 15192ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 15202ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 15212ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 15222ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case GET_MASTER_MONO: { 15232ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 15242ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono; 15252ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = getMasterMono(&mono); 15262ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 15272ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 15282ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(static_cast<int32_t>(mono)); 15292ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 15302ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 15312ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 15322ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 1533ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent case GET_STREAM_VOLUME_DB: { 1534ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1535ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent audio_stream_type_t stream = 1536ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 1537ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent int index = static_cast <int>(data.readInt32()); 1538ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent audio_devices_t device = 1539ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent static_cast <audio_devices_t>(data.readUint32()); 1540ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent reply->writeFloat(getStreamVolumeDB(stream, index, device)); 1541ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent return NO_ERROR; 1542ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent } 1543ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent 1544817729095966c338615a8a791d2dbf774fc034efjiabin case GET_SURROUND_FORMATS: { 1545817729095966c338615a8a791d2dbf774fc034efjiabin CHECK_INTERFACE(IAudioPolicyService, data, reply); 1546817729095966c338615a8a791d2dbf774fc034efjiabin unsigned int numSurroundFormatsReq = data.readUint32(); 1547817729095966c338615a8a791d2dbf774fc034efjiabin if (numSurroundFormatsReq > MAX_ITEMS_PER_LIST) { 1548817729095966c338615a8a791d2dbf774fc034efjiabin numSurroundFormatsReq = MAX_ITEMS_PER_LIST; 1549817729095966c338615a8a791d2dbf774fc034efjiabin } 1550817729095966c338615a8a791d2dbf774fc034efjiabin bool reported = data.readBool(); 1551817729095966c338615a8a791d2dbf774fc034efjiabin unsigned int numSurroundFormats = numSurroundFormatsReq; 1552817729095966c338615a8a791d2dbf774fc034efjiabin audio_format_t *surroundFormats = (audio_format_t *)calloc( 1553817729095966c338615a8a791d2dbf774fc034efjiabin numSurroundFormats, sizeof(audio_format_t)); 1554817729095966c338615a8a791d2dbf774fc034efjiabin bool *surroundFormatsEnabled = (bool *)calloc(numSurroundFormats, sizeof(bool)); 1555817729095966c338615a8a791d2dbf774fc034efjiabin if (numSurroundFormatsReq > 0 && 1556817729095966c338615a8a791d2dbf774fc034efjiabin (surroundFormats == NULL || surroundFormatsEnabled == NULL)) { 1557817729095966c338615a8a791d2dbf774fc034efjiabin free(surroundFormats); 1558817729095966c338615a8a791d2dbf774fc034efjiabin free(surroundFormatsEnabled); 1559817729095966c338615a8a791d2dbf774fc034efjiabin reply->writeInt32(NO_MEMORY); 1560817729095966c338615a8a791d2dbf774fc034efjiabin return NO_ERROR; 1561817729095966c338615a8a791d2dbf774fc034efjiabin } 1562817729095966c338615a8a791d2dbf774fc034efjiabin status_t status = getSurroundFormats( 1563817729095966c338615a8a791d2dbf774fc034efjiabin &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported); 1564817729095966c338615a8a791d2dbf774fc034efjiabin reply->writeInt32(status); 1565817729095966c338615a8a791d2dbf774fc034efjiabin 1566817729095966c338615a8a791d2dbf774fc034efjiabin if (status == NO_ERROR) { 1567817729095966c338615a8a791d2dbf774fc034efjiabin reply->writeUint32(numSurroundFormats); 1568817729095966c338615a8a791d2dbf774fc034efjiabin if (numSurroundFormatsReq > numSurroundFormats) { 1569817729095966c338615a8a791d2dbf774fc034efjiabin numSurroundFormatsReq = numSurroundFormats; 1570817729095966c338615a8a791d2dbf774fc034efjiabin } 1571817729095966c338615a8a791d2dbf774fc034efjiabin reply->write(surroundFormats, numSurroundFormatsReq * sizeof(audio_format_t)); 1572817729095966c338615a8a791d2dbf774fc034efjiabin reply->write(surroundFormatsEnabled, numSurroundFormatsReq * sizeof(bool)); 1573817729095966c338615a8a791d2dbf774fc034efjiabin } 1574817729095966c338615a8a791d2dbf774fc034efjiabin free(surroundFormats); 1575817729095966c338615a8a791d2dbf774fc034efjiabin free(surroundFormatsEnabled); 1576817729095966c338615a8a791d2dbf774fc034efjiabin return NO_ERROR; 1577817729095966c338615a8a791d2dbf774fc034efjiabin } 1578817729095966c338615a8a791d2dbf774fc034efjiabin 1579817729095966c338615a8a791d2dbf774fc034efjiabin case SET_SURROUND_FORMAT_ENABLED: { 1580817729095966c338615a8a791d2dbf774fc034efjiabin CHECK_INTERFACE(IAudioPolicyService, data, reply); 1581817729095966c338615a8a791d2dbf774fc034efjiabin audio_format_t audioFormat = (audio_format_t) data.readInt32(); 1582817729095966c338615a8a791d2dbf774fc034efjiabin bool enabled = data.readBool(); 1583817729095966c338615a8a791d2dbf774fc034efjiabin status_t status = setSurroundFormatEnabled(audioFormat, enabled); 1584817729095966c338615a8a791d2dbf774fc034efjiabin reply->writeInt32(status); 1585817729095966c338615a8a791d2dbf774fc034efjiabin return NO_ERROR; 1586817729095966c338615a8a791d2dbf774fc034efjiabin } 1587817729095966c338615a8a791d2dbf774fc034efjiabin 1588c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1589c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1590c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1591c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1592c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1593b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung/** returns true if string overflow was prevented by zero termination */ 1594b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungtemplate <size_t size> 1595b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungstatic bool preventStringOverflow(char (&s)[size]) { 1596b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung if (strnlen(s, size) < size) return false; 1597b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung s[size - 1] = '\0'; 1598b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung return true; 1599b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung} 1600b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung 160139fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocardvoid BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr) 160239fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard{ 160339fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE; 160439fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) { 160539fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging 160639fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard } 160739fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard attr->tags[tagsMaxSize - 1] = '\0'; 160839fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard} 160939fdbd097a147b5c719dac9ad2759e6c44eb3a4eKevin Rocard 1610b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung/** returns BAD_VALUE if sanitization was required. */ 1611b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungstatus_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc) 1612b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung{ 1613b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung if (preventStringOverflow(desc->name) 1614b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung | /* always */ preventStringOverflow(desc->implementor)) { 1615b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging 1616b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung return BAD_VALUE; 1617b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung } 1618b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung return NO_ERROR; 1619b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung} 1620b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung 1621b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung/** returns BAD_VALUE if sanitization was required. */ 1622b0272097450ef868637e8a50d2575e16e37c90fbAndy Hungstatus_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config) 1623b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung{ 1624b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung if (config->type == AUDIO_PORT_TYPE_DEVICE && 1625b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung preventStringOverflow(config->ext.device.address)) { 1626b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung return BAD_VALUE; 1627b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung } 1628b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung return NO_ERROR; 1629b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung} 1630b0272097450ef868637e8a50d2575e16e37c90fbAndy Hung 1631c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1632c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 163340bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1634