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 25c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <binder/Parcel.h> 26c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2774adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent#include <media/AudioEffect.h> 28c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h> 29c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3064760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 31fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 32c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android { 33c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum { 35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION, 36c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_DEVICE_CONNECTION_STATE, 37f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov HANDLE_DEVICE_CONFIG_CHANGE, 38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PHONE_STATE, 390b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten SET_RINGER_MODE, // reserved, no longer used 40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_FORCE_USE, 41c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_FORCE_USE, 42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_OUTPUT, 43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_OUTPUT, 44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_OUTPUT, 45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_OUTPUT, 46caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent GET_INPUT_FOR_ATTR, 47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_INPUT, 48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_INPUT, 49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_INPUT, 50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent INIT_STREAM_VOLUME, 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_STREAM_VOLUME, 52de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STREAM_VOLUME, 53de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STRATEGY_FOR_STREAM, 54de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_OUTPUT_FOR_EFFECT, 55de070137f11d346fba77605bd76a44c040a618fcEric Laurent REGISTER_EFFECT, 56eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent UNREGISTER_EFFECT, 576b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten IS_STREAM_ACTIVE, 58d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi IS_SOURCE_ACTIVE, 596b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten GET_DEVICES_FOR_STREAM, 60db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent QUERY_DEFAULT_PRE_PROCESSING, 61272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi SET_EFFECT_ENABLED, 62ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald IS_STREAM_ACTIVE_REMOTELY, 63203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent IS_OFFLOAD_SUPPORTED, 64203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PORTS, 65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent GET_AUDIO_PORT, 66203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CREATE_AUDIO_PATCH, 67203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent RELEASE_AUDIO_PATCH, 68203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PATCHES, 69b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent SET_AUDIO_PORT_CONFIG, 705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi REGISTER_CLIENT, 71df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent GET_OUTPUT_FOR_ATTR, 72df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent ACQUIRE_SOUNDTRIGGER_SESSION, 73bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent RELEASE_SOUNDTRIGGER_SESSION, 74baac183f3808d7b68f184647a97bd381620415feEric Laurent GET_PHONE_STATE, 75baac183f3808d7b68f184647a97bd381620415feEric Laurent REGISTER_POLICY_MIXES, 76554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent START_AUDIO_SOURCE, 77e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent STOP_AUDIO_SOURCE, 78e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent SET_AUDIO_PORT_CALLBACK_ENABLED, 792ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung SET_MASTER_MONO, 802ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung GET_MASTER_MONO, 81ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent GET_STREAM_VOLUME_DB 82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 841d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024 851d670b11313250442455a22f1056ad649d607fb2Eric Laurent 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 89090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioPolicyService(const sp<IBinder>& impl) 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 93c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 95fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 96fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 97e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 98e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 105e743a47f445f02a0612018fa5640301304844fbfPaul McLean data.writeCString(device_name); 106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 110fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 111fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 119fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 122f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov virtual status_t handleDeviceConfigChange(audio_devices_t device, 123f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_address, 124f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_name) 125f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov { 126f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov Parcel data, reply; 127f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 128f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeInt32(static_cast <uint32_t>(device)); 129f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeCString(device_address); 130f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeCString(device_name); 131f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply); 132f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov return static_cast <status_t> (reply.readInt32()); 133f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov } 134f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov 135f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 144fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 154fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 160fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 163c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getOutput( 164fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 16658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 167254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 168ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 169ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 173c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 174c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 176254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 177c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(flags)); 1782301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // hasOffloadInfo 179b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 180b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 181b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 182b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 183b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 184b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 185c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 186fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 187c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 188c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 1938c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 19420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent const audio_config_t *config, 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 1969ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent audio_port_handle_t *selectedDeviceId, 19720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t *portId) 1985bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi { 1995bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Parcel data, reply; 2005bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 2015bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (attr == NULL) { 202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 203e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr(): NULL audio attributes and stream type"); 204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 205e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 207e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr unspecified stream type"); 208e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 209e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 210e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 211e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (output == NULL) { 212e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr NULL output - shouldn't happen"); 213e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 214e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 2159ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent if (selectedDeviceId == NULL) { 2169ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent ALOGE("getOutputForAttr NULL selectedDeviceId - shouldn't happen"); 2179ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent return BAD_VALUE; 2189ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent } 21920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent if (portId == NULL) { 22020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent ALOGE("getOutputForAttr NULL portId - shouldn't happen"); 22120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent return BAD_VALUE; 22220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent } 223e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr == NULL) { 224e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.write(attr, sizeof(audio_attributes_t)); 228e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 229e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(session); 230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(*stream); 2355bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2368c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 23720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.write(config, sizeof(audio_config_t)); 2385bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 2399ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent data.writeInt32(*selectedDeviceId); 24020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.writeInt32(*portId); 241e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 242e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 243e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 244e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 245e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status = (status_t)reply.readInt32(); 246e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 247e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 248e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 249e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 25020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32(); 251e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream != NULL) { 25220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent *stream = lStream; 253e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 2549ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent *selectedDeviceId = (audio_port_handle_t)reply.readInt32(); 25520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent *portId = (audio_port_handle_t)reply.readInt32(); 256e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 2575bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2585bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 259de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 260fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 261e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 265fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 266fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 267d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 269c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 272de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 273fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 274e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 276c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 278fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 279fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 280d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 281c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 282c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 284c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 285e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 286e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 287e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 289c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 290c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 291fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 292e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)stream); 293e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 294c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 300b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid, 3018c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 30220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent const audio_config_base_t *config, 303466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 3049ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent audio_port_handle_t *selectedDeviceId, 30520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t *portId) 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 309caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr == NULL) { 310caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL attr - shouldn't happen"); 311caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 312caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 313caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (input == NULL) { 314caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL input - shouldn't happen"); 315caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 316caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 3179ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent if (selectedDeviceId == NULL) { 3189ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen"); 3199ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent return BAD_VALUE; 3209ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent } 32120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent if (portId == NULL) { 32220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent ALOGE("getInputForAttr NULL portId - shouldn't happen"); 32320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent return BAD_VALUE; 32420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent } 325caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.write(attr, sizeof(audio_attributes_t)); 326a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent data.writeInt32(*input); 327caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.writeInt32(session); 328b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent data.writeInt32(pid); 3298c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 33020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.write(config, sizeof(audio_config_base_t)); 331b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 3329ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent data.writeInt32(*selectedDeviceId); 33320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.writeInt32(*portId); 334caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 335caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 336caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 337caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 338caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status = reply.readInt32(); 339caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 340caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 341caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 342caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent *input = (audio_io_handle_t)reply.readInt32(); 3439ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent *selectedDeviceId = (audio_port_handle_t)reply.readInt32(); 34420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent *portId = (audio_port_handle_t)reply.readInt32(); 345caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3484dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 3494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 353fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3544dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3594dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 3604dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 364fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3654dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3704dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 3714dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 375fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3764dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 380fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 39483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 39583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 40183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 40683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 40783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 40883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 41383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 41483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 415c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 417c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 418c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 420de070137f11d346fba77605bd76a44c040a618fcEric Laurent 421fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 422de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 423de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 424de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 425de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 426de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 427de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 428de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 429de070137f11d346fba77605bd76a44c040a618fcEric Laurent 4306374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 4316b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 4326b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 4336b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 4346b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 4356b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 4366374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 4376b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 4386b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 43958e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 440de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 441de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 442de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 443de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 444de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 445de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 446de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 447de070137f11d346fba77605bd76a44c040a618fcEric Laurent 44858e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 4497c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 450de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 451d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session, 452de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 453de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 454de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 455de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 456de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 4577c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 458de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 459de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 460de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 461de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 462de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 463de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 464de070137f11d346fba77605bd76a44c040a618fcEric Laurent 465de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 466de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 467de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 468de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 469de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 470de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 471de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 472de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 473de070137f11d346fba77605bd76a44c040a618fcEric Laurent 474db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 475db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 476db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 477db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 478db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 479db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 480db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 481db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 482db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 483db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 484fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 485eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 486eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 487eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 488fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 489eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 490eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 491eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 492eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 49357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 494272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 495272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 496272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 497272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 498272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 499272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 500272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 501272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 502272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 503272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 504d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 505d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 506d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 507d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 508d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 509d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 510d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 511d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 512d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 513d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t queryDefaultPreProcessing(audio_session_t audioSession, 51457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 51557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 51657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 51757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 51857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 51957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 52057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 52157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 52257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 52357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 52457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 52557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 52657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 52757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 52857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 52957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 53057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 53157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 53257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 53357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 53457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 53557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 53657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 537ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 538ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 539ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 540b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 541b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 542b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 543b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 640203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 641203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 642203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 643203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 644203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 645203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 646203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 647203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 648203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 649203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 650203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 651203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 652203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 653203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 654203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 655203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 656203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 657203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 658203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 659203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 660203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 661203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 662203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 663203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 664203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 665203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 666203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 667203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 668203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 669203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 670203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 672b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 673b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 674b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 675b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 676f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 677b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 678b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 680e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent virtual void setAudioPortCallbacksEnabled(bool enabled) 681e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent { 682e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent Parcel data, reply; 683e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 684e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInt32(enabled ? 1 : 0); 685e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply); 686e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } 687e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 688df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 689df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 690df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 691df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 692df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 693df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 694df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 695df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 696df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 697df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 698df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 699df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 700df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 701df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 702df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 703df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 704df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 705df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 706df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 707df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 708df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 709df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 710df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 711df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 712df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 713df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 714df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 715df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 716df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 717df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 718df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 719df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 720df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 721bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 722bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 723bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 724bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 725bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 726bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 727bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 728bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 729bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 730bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 731bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 732baac183f3808d7b68f184647a97bd381620415feEric Laurent 733e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) 734baac183f3808d7b68f184647a97bd381620415feEric Laurent { 735baac183f3808d7b68f184647a97bd381620415feEric Laurent Parcel data, reply; 736baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 737baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(registration ? 1 : 0); 738baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = mixes.size(); 739baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 740baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 741baac183f3808d7b68f184647a97bd381620415feEric Laurent } 742baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t sizePosition = data.dataPosition(); 743baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(size); 744baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t finalSize = size; 745baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 746baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 747baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mixes[i].writeToParcel(&data) != NO_ERROR) { 748baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 749baac183f3808d7b68f184647a97bd381620415feEric Laurent finalSize--; 750baac183f3808d7b68f184647a97bd381620415feEric Laurent } 751baac183f3808d7b68f184647a97bd381620415feEric Laurent } 752baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size != finalSize) { 753baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 754baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(sizePosition); 755baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(finalSize); 756baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 757baac183f3808d7b68f184647a97bd381620415feEric Laurent } 758baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); 759baac183f3808d7b68f184647a97bd381620415feEric Laurent if (status == NO_ERROR) { 760baac183f3808d7b68f184647a97bd381620415feEric Laurent status = (status_t)reply.readInt32(); 761baac183f3808d7b68f184647a97bd381620415feEric Laurent } 762baac183f3808d7b68f184647a97bd381620415feEric Laurent return status; 763baac183f3808d7b68f184647a97bd381620415feEric Laurent } 764554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 765554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t startAudioSource(const struct audio_port_config *source, 766554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 767559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten audio_patch_handle_t *handle) 768554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 769554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 770554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 771554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (source == NULL || attributes == NULL || handle == NULL) { 772554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return BAD_VALUE; 773554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 774554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(source, sizeof(struct audio_port_config)); 775554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(attributes, sizeof(audio_attributes_t)); 776554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply); 777554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 778554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 779554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 780554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 781554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 782554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 783554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 784559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten *handle = (audio_patch_handle_t)reply.readInt32(); 785554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 786554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 787554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 788559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten virtual status_t stopAudioSource(audio_patch_handle_t handle) 789554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 790554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 791554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 792554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInt32(handle); 793554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply); 794554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 795554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 796554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 797554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 798554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 799554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 8002ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 8012ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t setMasterMono(bool mono) 8022ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 8032ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 8042ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 8052ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInt32(static_cast<int32_t>(mono)); 8062ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(SET_MASTER_MONO, data, &reply); 8072ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 8082ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8092ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8102ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return static_cast<status_t>(reply.readInt32()); 8112ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8122ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 8132ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t getMasterMono(bool *mono) 8142ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 8152ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (mono == nullptr) { 8162ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return BAD_VALUE; 8172ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8182ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 8192ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 8202ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 8212ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(GET_MASTER_MONO, data, &reply); 8222ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 8232ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8242ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8252ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status = static_cast<status_t>(reply.readInt32()); 8262ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 8272ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung *mono = static_cast<bool>(reply.readInt32()); 8282ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8292ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8302ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 831ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent 832ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device) 833ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent { 834ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent Parcel data, reply; 835ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 836ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeInt32(static_cast <int32_t>(stream)); 837ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeInt32(static_cast <int32_t>(index)); 838ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent data.writeUint32(static_cast <uint32_t>(device)); 839ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply); 840ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent if (status != NO_ERROR) { 841ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent return NAN; 842ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent } 843ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent return reply.readFloat(); 844ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent } 845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 848c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 852c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 855e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 858fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 859fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 860fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 861fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 863e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name = data.readCString(); 864c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr || device_name == nullptr) { 865c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device); 866c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 867c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 868c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 869c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov state, 870c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address, 871c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_name))); 872c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 877c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 878fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 879fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 881c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr) { 882c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device); 883c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE)); 884c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 885c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 886c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address))); 887c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 891f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov case HANDLE_DEVICE_CONFIG_CHANGE: { 892f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov CHECK_INTERFACE(IAudioPolicyService, data, reply); 893f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov audio_devices_t device = 894f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov static_cast <audio_devices_t>(data.readInt32()); 895f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_address = data.readCString(); 896f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_name = data.readCString(); 897c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr || device_name == nullptr) { 898c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device); 899c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 900c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 901c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device, 902c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address, 903c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_name))); 904c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 905f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov return NO_ERROR; 906f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov } break; 907f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov 908c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 909c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 91085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 91185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 914c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 91785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 91885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 919fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 920fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 923c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 924c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 925c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 926c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 92785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 92885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 929c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 930c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 931c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 932c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 933c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 934c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 935fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 936fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 937c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 93858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 939254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 9400ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 9410ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 942b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 9439bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung audio_offload_info_t offloadInfo = {}; 944b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 945b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 946b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 948c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 949c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 950254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 951b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 952b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 953fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 954c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 955c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 956c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 9575bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 9585bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 9599bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung audio_attributes_t attr = {}; 960e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 961e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 962e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 9639c8bf056282f7094405414a3f0765aac85579506Kevin Rocard sanetizeAudioAttributes(&attr); 964e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 965e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 966e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 967e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 968e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 969e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 970e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 9718c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 97220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_config_t config; 97320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent memset(&config, 0, sizeof(audio_config_t)); 97420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.read(&config, sizeof(audio_config_t)); 9755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 9765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 977aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId = data.readInt32(); 97820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId = (audio_port_handle_t)data.readInt32(); 979a946d844a77906072f5eb7093d41db465d6514bbRobert Shih audio_io_handle_t output = 0; 980e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 9818c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent &output, session, &stream, uid, 98220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent &config, 9839ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent flags, &selectedDeviceId, &portId); 984e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 985e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 986e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 9879ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent reply->writeInt32(selectedDeviceId); 98820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent reply->writeInt32(portId); 9895bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 9905bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 9915bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 992c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 993c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 994fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 995ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 996ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 997e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 998de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 999ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 1000de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1002c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1003c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1004c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 1005c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1006fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 1007ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 1008ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 1009e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1010de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 1011ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 1012de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 1013c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1014c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1015c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1016c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 1017c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1018fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 1019e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 1020e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1021e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 1022c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1023c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1024c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1025caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent case GET_INPUT_FOR_ATTR: { 1026c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 10279bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung audio_attributes_t attr = {}; 1028caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.read(&attr, sizeof(audio_attributes_t)); 10299c8bf056282f7094405414a3f0765aac85579506Kevin Rocard sanetizeAudioAttributes(&attr); 1030a54f1283fdd9adbd64ecca4e14af56aaa0e8c825Eric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1031caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1032b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid = (pid_t)data.readInt32(); 10338c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 103420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_config_base_t config; 103520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent memset(&config, 0, sizeof(audio_config_base_t)); 103620b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.read(&config, sizeof(audio_config_base_t)); 1037b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1038466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32(); 103920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId = (audio_port_handle_t)data.readInt32(); 1040b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent status_t status = getInputForAttr(&attr, &input, session, pid, uid, 104120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent &config, 10429ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent flags, &selectedDeviceId, &portId); 1043caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(status); 1044caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status == NO_ERROR) { 1045caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(input); 10469ae8c597d9a0c8cedc4047fc4716d7361453f6abEric Laurent reply->writeInt32(selectedDeviceId); 104720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent reply->writeInt32(portId); 1048caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 1049c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1050c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1051c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1052c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 1053c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1054fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 10554dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 10564dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 1057c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1058c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1059c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1060c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 1061c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1062fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 10634dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 10644dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 1065c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1066c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1067c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1068c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 1069c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1070fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 10714dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 10724dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 1073c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1074c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1075c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1076c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 1077c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1078fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1079fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1080c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 1081c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 1082c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 1083c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1084c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1085c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1088fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1089fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1090c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 109183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 109283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 109383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 109483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 1095c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1096c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1097c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1098c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 1099c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1100fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1101fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 110283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1103892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih int index = 0; 110483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 1105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 1106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 1107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1110de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 1111de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1112fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1113fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1114de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 1115de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1116de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1117de070137f11d346fba77605bd76a44c040a618fcEric Laurent 11186b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 11196b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 1120fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1121fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 11226b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 11236b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 11246b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 11256b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 1126de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 1127de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 11289bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung effect_descriptor_t desc = {}; 11299bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung if (data.read(&desc, sizeof(desc)) != NO_ERROR) { 11309bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung android_errorWriteLog(0x534e4554, "73126106"); 11319bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung } 11329bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung (void)sanitizeEffectDescriptor(&desc); 1133de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 1134de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 1135de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1136de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1137de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1138de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 1139de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 11409bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung effect_descriptor_t desc = {}; 11419bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung if (data.read(&desc, sizeof(desc)) != NO_ERROR) { 11429bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung android_errorWriteLog(0x534e4554, "73126106"); 11439bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung } 11449bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung (void)sanitizeEffectDescriptor(&desc); 11457c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 1146de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 1147d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 1148de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1149de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 11507c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 1151de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 1152de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 1153de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 1154de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1155de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1156de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1157de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 1158de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1159de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1160de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 1161de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1162de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1163de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1164db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 1165db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1166db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 1167db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 1168db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 1169db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 1170db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 1171db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 1172eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 1173eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1174fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1175eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 1176ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 1177eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 1178eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 1179eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 1180272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 1181272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1182272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1183272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 1184ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 1185272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 1186272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 1187272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 1188d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 1189d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1190d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 1191d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 1192d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 1193d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 1194d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 119557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 119657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1197d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 119857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 119974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 120074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 120174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 120257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 12039bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung effect_descriptor_t *descriptors = new effect_descriptor_t[count]{}; 120457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 120557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 120657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 120757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 120857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 120957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 121074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 121157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 121257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 121357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 121457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 121557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 121657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 121757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 121857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 121957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 1220b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 1221b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 12229bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung audio_offload_info_t info = {}; 1223b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 1224b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 1225b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 1226b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 1227b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1228b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1229203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1230203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1231203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1232203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1233203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 12341d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 12351d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 12361d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1237203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1238203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1239203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 12401d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (ports == NULL) { 12411d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 12421d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 12431d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 12441d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 12451d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1246203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1247203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1248203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1249203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1250203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1251203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1252203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1253203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1254203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1255203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1256203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1257203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1258203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1259203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1260203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1261203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1262203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1263e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1264e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1265e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1266e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1267203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1268203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1269203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1270203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1271203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1272203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1273203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1274203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1275203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1276203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 12779bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung struct audio_patch patch = {}; 1278203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1279a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1280e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1281e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1282e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1283203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1284203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1285203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1286203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1287203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1288203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1289203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1290203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1291203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1292203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 12939bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1294203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1295203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1296203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1297203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1298203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1299203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1300203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1301203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1302203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 13031d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 13041d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 13051d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1306203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1307203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1308203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1309203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 13101d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (patches == NULL) { 13111d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 13121d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 13131d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 13141d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 13151d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1316203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1317203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1318203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1319203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1320203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1321203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1322203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1323203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1324203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1325203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1326203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1327203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1328203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1329203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1330203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1331203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 13329bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung struct audio_port_config config = {}; 1333203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 13349bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung (void)sanitizeAudioPortConfig(&config); 1335203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1336203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1337203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1338203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1339df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1340b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1341b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1342b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1343b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1344b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1345b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1346b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1347203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1348e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent case SET_AUDIO_PORT_CALLBACK_ENABLED: { 1349e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1350e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent setAudioPortCallbacksEnabled(data.readInt32() == 1); 1351e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent return NO_ERROR; 1352e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } break; 1353e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 1354df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1355df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1356df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1357df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1358a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_session_t session = AUDIO_SESSION_NONE; 1359a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE; 1360a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_devices_t device = AUDIO_DEVICE_NONE; 1361df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1362df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1363df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1364df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1365df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1366df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1367df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1368df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1369df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1370df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1371df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1372df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1373df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1374df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1375df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1376df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1377df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1378df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1379df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1380df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1381bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1382bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1383bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1384bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1385bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1386bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1387baac183f3808d7b68f184647a97bd381620415feEric Laurent case REGISTER_POLICY_MIXES: { 1388baac183f3808d7b68f184647a97bd381620415feEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1389baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration = data.readInt32() == 1; 1390baac183f3808d7b68f184647a97bd381620415feEric Laurent Vector<AudioMix> mixes; 1391baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = (size_t)data.readInt32(); 1392baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 1393baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 1394baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1395baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 1396baac183f3808d7b68f184647a97bd381620415feEric Laurent AudioMix mix; 1397baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { 1398baac183f3808d7b68f184647a97bd381620415feEric Laurent mixes.add(mix); 1399baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1400baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1401baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = registerPolicyMixes(mixes, registration); 1402baac183f3808d7b68f184647a97bd381620415feEric Laurent reply->writeInt32(status); 1403baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_ERROR; 1404baac183f3808d7b68f184647a97bd381620415feEric Laurent } break; 1405baac183f3808d7b68f184647a97bd381620415feEric Laurent 1406554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case START_AUDIO_SOURCE: { 1407554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 14089bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung struct audio_port_config source = {}; 1409554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&source, sizeof(struct audio_port_config)); 14109bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung (void)sanitizeAudioPortConfig(&source); 14119bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung audio_attributes_t attributes = {}; 1412554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&attributes, sizeof(audio_attributes_t)); 14139c8bf056282f7094405414a3f0765aac85579506Kevin Rocard sanetizeAudioAttributes(&attributes); 1414559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1415554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = startAudioSource(&source, &attributes, &handle); 1416554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1417554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(handle); 1418554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1419554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1420554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1421554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case STOP_AUDIO_SOURCE: { 1422554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1423559d439c6fe8679e3c52f1cf265d46d7d2e65b68Glenn Kasten audio_patch_handle_t handle = (audio_patch_handle_t) data.readInt32(); 1424554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = stopAudioSource(handle); 1425554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1426554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1427554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1428554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 14292ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case SET_MASTER_MONO: { 14302ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 14312ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono = static_cast<bool>(data.readInt32()); 14322ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = setMasterMono(mono); 14332ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 14342ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 14352ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 14362ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 14372ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case GET_MASTER_MONO: { 14382ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 14392ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono; 14402ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = getMasterMono(&mono); 14412ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 14422ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 14432ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(static_cast<int32_t>(mono)); 14442ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 14452ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 14462ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 14472ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 1448ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent case GET_STREAM_VOLUME_DB: { 1449ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1450ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent audio_stream_type_t stream = 1451ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 1452ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent int index = static_cast <int>(data.readInt32()); 1453ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent audio_devices_t device = 1454ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent static_cast <audio_devices_t>(data.readUint32()); 1455ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent reply->writeFloat(getStreamVolumeDB(stream, index, device)); 1456ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent return NO_ERROR; 1457ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent } 1458ac9cef5f3288df6e65cb4488e2615cc3c07b70d0Eric Laurent 1459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1462c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1463c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 14649bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung/** returns true if string overflow was prevented by zero termination */ 14659bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hungtemplate <size_t size> 14669bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hungstatic bool preventStringOverflow(char (&s)[size]) { 14679bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung if (strnlen(s, size) < size) return false; 14689bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung s[size - 1] = '\0'; 14699bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung return true; 14709bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung} 14719bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung 14729c8bf056282f7094405414a3f0765aac85579506Kevin Rocardvoid BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr) 14739c8bf056282f7094405414a3f0765aac85579506Kevin Rocard{ 14749c8bf056282f7094405414a3f0765aac85579506Kevin Rocard const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE; 14759c8bf056282f7094405414a3f0765aac85579506Kevin Rocard if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) { 14769c8bf056282f7094405414a3f0765aac85579506Kevin Rocard android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging 14779c8bf056282f7094405414a3f0765aac85579506Kevin Rocard } 14789c8bf056282f7094405414a3f0765aac85579506Kevin Rocard attr->tags[tagsMaxSize - 1] = '\0'; 14799c8bf056282f7094405414a3f0765aac85579506Kevin Rocard} 14809c8bf056282f7094405414a3f0765aac85579506Kevin Rocard 14819bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung/** returns BAD_VALUE if sanitization was required. */ 14829bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hungstatus_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc) 14839bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung{ 14849bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung if (preventStringOverflow(desc->name) 14859bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung | /* always */ preventStringOverflow(desc->implementor)) { 14869bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging 14879bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung return BAD_VALUE; 14889bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung } 14899bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung return NO_ERROR; 14909bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung} 14919bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung 14929bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung/** returns BAD_VALUE if sanitization was required. */ 14939bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hungstatus_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config) 14949bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung{ 14959bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung if (config->type == AUDIO_PORT_TYPE_DEVICE && 14969bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung preventStringOverflow(config->ext.device.address)) { 14979bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung return BAD_VALUE; 14989bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung } 14999bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung return NO_ERROR; 15009bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung} 15019bb909f379694ff4eca4b3aefc6a5ce60e7a0e8aAndy Hung 1502c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1503c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 150440bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1505