IAudioPolicyService.cpp revision c694ff449bef4ca1e45a6506f34e66c613757311
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> 22c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <sys/types.h> 23c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 24c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <binder/Parcel.h> 25c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2674adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent#include <media/AudioEffect.h> 27c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h> 28c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2964760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 30fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android { 32c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 33c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum { 34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION, 35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_DEVICE_CONNECTION_STATE, 36f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov HANDLE_DEVICE_CONFIG_CHANGE, 37c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PHONE_STATE, 380b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten SET_RINGER_MODE, // reserved, no longer used 39c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_FORCE_USE, 40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_FORCE_USE, 41c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_OUTPUT, 42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_OUTPUT, 43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_OUTPUT, 44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_OUTPUT, 45caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent GET_INPUT_FOR_ATTR, 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_INPUT, 47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_INPUT, 48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_INPUT, 49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent INIT_STREAM_VOLUME, 50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_STREAM_VOLUME, 51de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STREAM_VOLUME, 52de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STRATEGY_FOR_STREAM, 53de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_OUTPUT_FOR_EFFECT, 54de070137f11d346fba77605bd76a44c040a618fcEric Laurent REGISTER_EFFECT, 55eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent UNREGISTER_EFFECT, 566b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten IS_STREAM_ACTIVE, 57d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi IS_SOURCE_ACTIVE, 586b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten GET_DEVICES_FOR_STREAM, 59db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent QUERY_DEFAULT_PRE_PROCESSING, 60272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi SET_EFFECT_ENABLED, 61ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald IS_STREAM_ACTIVE_REMOTELY, 62203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent IS_OFFLOAD_SUPPORTED, 63203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PORTS, 64203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent GET_AUDIO_PORT, 65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CREATE_AUDIO_PATCH, 66203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent RELEASE_AUDIO_PATCH, 67203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PATCHES, 68b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent SET_AUDIO_PORT_CONFIG, 695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi REGISTER_CLIENT, 70df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent GET_OUTPUT_FOR_ATTR, 71df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent ACQUIRE_SOUNDTRIGGER_SESSION, 72bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent RELEASE_SOUNDTRIGGER_SESSION, 73baac183f3808d7b68f184647a97bd381620415feEric Laurent GET_PHONE_STATE, 74baac183f3808d7b68f184647a97bd381620415feEric Laurent REGISTER_POLICY_MIXES, 75554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent START_AUDIO_SOURCE, 76e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent STOP_AUDIO_SOURCE, 77e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent SET_AUDIO_PORT_CALLBACK_ENABLED, 782ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung SET_MASTER_MONO, 792ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung GET_MASTER_MONO, 80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 821d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024 831d670b11313250442455a22f1056ad649d607fb2Eric Laurent 84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 87090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioPolicyService(const sp<IBinder>& impl) 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 93fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 94fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 95e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 96e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 103e743a47f445f02a0612018fa5640301304844fbfPaul McLean data.writeCString(device_name); 104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 108fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 109fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 117fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 120f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov virtual status_t handleDeviceConfigChange(audio_devices_t device, 121f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_address, 122f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_name) 123f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov { 124f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov Parcel data, reply; 125f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 126f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeInt32(static_cast <uint32_t>(device)); 127f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeCString(device_address); 128f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov data.writeCString(device_name); 129f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply); 130f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov return static_cast <status_t> (reply.readInt32()); 131f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov } 132f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov 133f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 142fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 152fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 158fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getOutput( 162fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 163c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 16458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 165254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 166ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 167ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 173c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 174254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(flags)); 1762301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // hasOffloadInfo 177b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 178b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 179b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 180b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 181b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 182b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 183c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 184fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 185c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 186c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 1918c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 196aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId, 197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 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 } 215e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr == NULL) { 216e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 217e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 218e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 219e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.write(attr, sizeof(audio_attributes_t)); 220e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 221e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(session); 222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 223e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 224e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(*stream); 2275bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2288c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 2295bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(samplingRate); 2305bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(format)); 2315bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(channelMask); 2325bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 233aa9811945f575614b3482d09e4d969792701cebbPaul McLean data.writeInt32(selectedDeviceId); 2345bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi // hasOffloadInfo 2355bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (offloadInfo == NULL) { 2365bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(0); 2375bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } else { 2385bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(1); 2395bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.write(offloadInfo, sizeof(audio_offload_info_t)); 2405bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 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(); 250e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream != NULL) { 251e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *stream = (audio_stream_type_t)reply.readInt32(); 252e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 253e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 2545bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2555bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 256de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 257fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 258e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 260c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 261c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 262fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 263fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 264d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 267c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 269de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 270fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 271e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 275fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 276fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 277d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 280c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 281c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 282e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 283e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 284e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 285c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 288fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 289e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)stream); 290e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 295caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 297b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid, 2988c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 300caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 301caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 302466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 303466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId) 304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 307caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr == NULL) { 308caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL attr - shouldn't happen"); 309caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 310caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 311caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (input == NULL) { 312caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL input - shouldn't happen"); 313caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 314caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 315caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.write(attr, sizeof(audio_attributes_t)); 316caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.writeInt32(session); 317b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent data.writeInt32(pid); 3188c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 321254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 322b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 323466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean data.writeInt32(selectedDeviceId); 324caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 325caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 326caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 327caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 328caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status = reply.readInt32(); 329caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 330caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 331caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 332caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent *input = (audio_io_handle_t)reply.readInt32(); 333caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3364dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 3374dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 341fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3424dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3474dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 3484dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 352fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3534dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3584dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 3594dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 363fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3644dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 368fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 38183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 38283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 38383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 38983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 39583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 39683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 40183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 40283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 408de070137f11d346fba77605bd76a44c040a618fcEric Laurent 409fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 410de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 411de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 412de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 413de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 414de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 415de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 416de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 417de070137f11d346fba77605bd76a44c040a618fcEric Laurent 4186374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 4196b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 4206b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 4216b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 4226b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 4236b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 4246374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 4256b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 4266b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 42758e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 428de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 429de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 430de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 431de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 432de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 433de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 434de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 435de070137f11d346fba77605bd76a44c040a618fcEric Laurent 43658e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 4377c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 438de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 439d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session, 440de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 441de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 442de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 443de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 444de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 4457c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 446de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 447de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 448de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 449de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 450de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 451de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 452de070137f11d346fba77605bd76a44c040a618fcEric Laurent 453de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 454de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 455de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 456de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 457de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 458de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 459de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 460de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 461de070137f11d346fba77605bd76a44c040a618fcEric Laurent 462db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 463db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 464db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 465db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 466db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 467db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 468db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 469db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 470db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 471db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 472fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 473eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 474eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 475eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 476fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 477eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 478eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 479eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 480eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 48157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 482272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 483272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 484272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 485272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 486272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 487272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 488272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 489272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 490272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 491272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 492d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 493d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 494d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 495d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 496d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 497d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 498d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 499d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 500d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 501d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t queryDefaultPreProcessing(audio_session_t audioSession, 50257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 50357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 50457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 50557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 50657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 50757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 50857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 50957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 51057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 51157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 51257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 51357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 51457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 51557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 51657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 51757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 51857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 51957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 52057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 52157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 52257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 52357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 52457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 525ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 526ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 527ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 528b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 529b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 530b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 531b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 640203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 641203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 642203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 643203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 644203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 645203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 646203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 647203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 648203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 649203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 650203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 651203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 652203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 653203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 654203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 655203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 656203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 657203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 658203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 660b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 661b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 662b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 663b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 664f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 665b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 666b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 668e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent virtual void setAudioPortCallbacksEnabled(bool enabled) 669e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent { 670e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent Parcel data, reply; 671e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 672e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInt32(enabled ? 1 : 0); 673e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply); 674e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } 675e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 676df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 678df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 682df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 683df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 684df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 685df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 686df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 687df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 688df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 689df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 690df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 691df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 692df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 693df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 694df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 695df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 696df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 697df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 698df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 699df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 700df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 701df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 702df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 703df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 704df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 705df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 706df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 707df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 708df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 709bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 710bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 711bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 712bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 713bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 714bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 715bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 716bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 717bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 718bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 719bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 720baac183f3808d7b68f184647a97bd381620415feEric Laurent 72136d0ca16024820df9a12903d2ac443fabcc180bcChih-Hung Hsieh virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) 722baac183f3808d7b68f184647a97bd381620415feEric Laurent { 723baac183f3808d7b68f184647a97bd381620415feEric Laurent Parcel data, reply; 724baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 725baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(registration ? 1 : 0); 726baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = mixes.size(); 727baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 728baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 729baac183f3808d7b68f184647a97bd381620415feEric Laurent } 730baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t sizePosition = data.dataPosition(); 731baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(size); 732baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t finalSize = size; 733baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 734baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 735baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mixes[i].writeToParcel(&data) != NO_ERROR) { 736baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 737baac183f3808d7b68f184647a97bd381620415feEric Laurent finalSize--; 738baac183f3808d7b68f184647a97bd381620415feEric Laurent } 739baac183f3808d7b68f184647a97bd381620415feEric Laurent } 740baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size != finalSize) { 741baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 742baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(sizePosition); 743baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(finalSize); 744baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 745baac183f3808d7b68f184647a97bd381620415feEric Laurent } 746baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); 747baac183f3808d7b68f184647a97bd381620415feEric Laurent if (status == NO_ERROR) { 748baac183f3808d7b68f184647a97bd381620415feEric Laurent status = (status_t)reply.readInt32(); 749baac183f3808d7b68f184647a97bd381620415feEric Laurent } 750baac183f3808d7b68f184647a97bd381620415feEric Laurent return status; 751baac183f3808d7b68f184647a97bd381620415feEric Laurent } 752554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t startAudioSource(const struct audio_port_config *source, 754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 755554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 756554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 757554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 758554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 759554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (source == NULL || attributes == NULL || handle == NULL) { 760554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return BAD_VALUE; 761554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 762554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(source, sizeof(struct audio_port_config)); 763554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(attributes, sizeof(audio_attributes_t)); 764554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply); 765554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 766554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 767554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 768554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 769554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 770554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 771554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 772554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent *handle = (audio_io_handle_t)reply.readInt32(); 773554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 774554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 775554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 776554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t stopAudioSource(audio_io_handle_t handle) 777554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 778554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 779554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 780554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInt32(handle); 781554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply); 782554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 783554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 784554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 785554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 786554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 787554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 7882ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 7892ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t setMasterMono(bool mono) 7902ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 7912ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 7922ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 7932ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInt32(static_cast<int32_t>(mono)); 7942ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(SET_MASTER_MONO, data, &reply); 7952ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 7962ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 7972ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7982ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return static_cast<status_t>(reply.readInt32()); 7992ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8002ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 8012ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t getMasterMono(bool *mono) 8022ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 8032ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (mono == nullptr) { 8042ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return BAD_VALUE; 8052ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8062ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 8072ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 8082ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 8092ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(GET_MASTER_MONO, data, &reply); 8102ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 8112ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8122ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8132ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status = static_cast<status_t>(reply.readInt32()); 8142ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 8152ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung *mono = static_cast<bool>(reply.readInt32()); 8162ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8172ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8182ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 819c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 822c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 823c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 824c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 825c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 826c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 829e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 830c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 832fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 833fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 834fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 835fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 836c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 837e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name = data.readCString(); 838c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr || device_name == nullptr) { 839c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device); 840c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 841c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 842c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 843c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov state, 844c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address, 845c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_name))); 846c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 848c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 852fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 853fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 855c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr) { 856c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device); 857c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE)); 858c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 859c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 860c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address))); 861c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 865f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov case HANDLE_DEVICE_CONFIG_CHANGE: { 866f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov CHECK_INTERFACE(IAudioPolicyService, data, reply); 867f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov audio_devices_t device = 868f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov static_cast <audio_devices_t>(data.readInt32()); 869f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_address = data.readCString(); 870f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov const char *device_name = data.readCString(); 871c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov if (device_address == nullptr || device_name == nullptr) { 872c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device); 873c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 874c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } else { 875c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device, 876c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_address, 877c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov device_name))); 878c694ff449bef4ca1e45a6506f34e66c613757311Pavlin Radoslavov } 879f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov return NO_ERROR; 880f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov } break; 881f862bc6a7a35054e38cb50fa16ae7a07f683ee01Pavlin Radoslavov 882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 88485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 88585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 89185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 89285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 893fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 894fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 899c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 900c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 90185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 90285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 906c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 907c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 908c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 909fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 910fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 911c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 91258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 913254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 9140ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 9150ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 916b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 917b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 918b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 919b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 920b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 923c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 924254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 925b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 926b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 927fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 928c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 929c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 930c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 9315bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 9325bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 93385f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten audio_attributes_t attr; 934e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 935e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 936e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 937e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 938e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 939e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 940e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 941e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 942e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 943e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 9448c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 9455bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate = data.readInt32(); 9465bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format = (audio_format_t) data.readInt32(); 9475bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask = data.readInt32(); 9485bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 9495bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 950aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId = data.readInt32(); 9515bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi bool hasOffloadInfo = data.readInt32() != 0; 9525bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_offload_info_t offloadInfo; 9535bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (hasOffloadInfo) { 9545bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(&offloadInfo, sizeof(audio_offload_info_t)); 9555bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 956a946d844a77906072f5eb7093d41db465d6514bbRobert Shih audio_io_handle_t output = 0; 957e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 9588c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent &output, session, &stream, uid, 959e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent samplingRate, format, channelMask, 960aa9811945f575614b3482d09e4d969792701cebbPaul McLean flags, selectedDeviceId, hasOffloadInfo ? &offloadInfo : NULL); 961e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 962e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 963e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 9645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 9655bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 9665bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 967c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 968c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 969fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 970ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 971ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 972e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 973de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 974ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 975de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 976c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 977c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 978c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 979c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 980c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 981fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 982ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 983ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 984e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 985de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 986ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 987de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 988c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 989c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 990c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 991c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 992c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 993fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 994e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 995e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 996e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 997c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 998c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1000caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent case GET_INPUT_FOR_ATTR: { 1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1002caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_attributes_t attr; 1003caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.read(&attr, sizeof(audio_attributes_t)); 1004caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1005b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid = (pid_t)data.readInt32(); 10068c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 1007c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 100858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1009254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1010b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1011466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32(); 1012a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_io_handle_t input = AUDIO_IO_HANDLE_NONE; 1013b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent status_t status = getInputForAttr(&attr, &input, session, pid, uid, 1014caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent samplingRate, format, channelMask, 1015466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean flags, selectedDeviceId); 1016caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(status); 1017caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status == NO_ERROR) { 1018caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(input); 1019caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 1020c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1021c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1022c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1023c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 1024c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1025fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 10264dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 10274dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 1028c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1029c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1030c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1031c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 1032c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1033fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 10344dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 10354dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 1036c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1039c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 1040c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1041fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 10424dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 10434dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 1044c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1045c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1046c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1047c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 1048c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1049fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1050fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1051c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 1052c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 1053c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 1054c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1055c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1056c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1057c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 1058c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1059fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1060fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1061c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 106283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 106383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 106483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 106583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 1066c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1067c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1068c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1069c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 1070c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1071fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1072fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 107383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1074892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih int index = 0; 107583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 1076c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 1077c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 1078c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1079c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1080c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1081de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 1082de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1083fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1084fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1085de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 1086de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1087de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1088de070137f11d346fba77605bd76a44c040a618fcEric Laurent 10896b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 10906b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 1091fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1092fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 10936b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 10946b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 10956b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 10966b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 1097de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 1098de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1099de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1100de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1101de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 1102de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 1103de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1104de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1105de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1106de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 1107de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1108de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1109de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 11107c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 1111de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 1112d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 1113de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1114de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 11157c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 1116de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 1117de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 1118de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 1119de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1120de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1121de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1122de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 1123de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1124de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1125de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 1126de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1127de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1128de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1129db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 1130db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1131db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 1132db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 1133db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 1134db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 1135db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 1136db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 1137eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 1138eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1139fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1140eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 1141ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 1142eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 1143eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 1144eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 1145272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 1146272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1147272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1148272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 1149ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 1150272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 1151272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 1152272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 1153d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 1154d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1155d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 1156d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 1157d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 1158d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 1159d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 116057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 116157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1162d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 116357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 116474adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 116574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 116674adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 116757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 116874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent effect_descriptor_t *descriptors = new effect_descriptor_t[count]; 116957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 117057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 117157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 117257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 117357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 117457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 117574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 117657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 117757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 117857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 117957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 118057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 118157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 118257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 118357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 118457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 1185b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 1186b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 1187b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t info; 1188b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 1189b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 1190b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 1191b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 1192b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1193b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1194203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1195203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1196203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1197203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1198203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 11991d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 12001d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 12011d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1202203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1203203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1204203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 12051d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (ports == NULL) { 12061d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 12071d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 12081d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 12091d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 12101d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1211203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1212203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1213203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1214203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1215203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1216203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1217203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1218203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1219203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1220203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1221203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1222203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1223203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1224203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1225203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1226203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1227203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1228e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1229e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1230e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1231e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1232203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1233203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1234203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1235203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1236203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1237203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1238203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1239203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1240203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1241203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1242203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch patch; 1243203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1244a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1245e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1246e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1247e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1248203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1249203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1250203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1251203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1252203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1253203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1254203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1255203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1256203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1257203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1258203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1259203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1260203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1261203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1262203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1263203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1264203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1265203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1266203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1267203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 12681d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 12691d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 12701d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1271203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1272203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1273203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1274203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 12751d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (patches == NULL) { 12761d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 12771d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 12781d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 12791d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 12801d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1281203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1282203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1283203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1284203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1285203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1286203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1287203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1288203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1289203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1290203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1291203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1292203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1293203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1294203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1295203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1296203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1297203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port_config config; 1298203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 1299203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1300203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1301203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1302203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1303df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1304b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1305b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1306b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1307b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1308b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1309b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1310b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1311203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1312e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent case SET_AUDIO_PORT_CALLBACK_ENABLED: { 1313e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1314e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent setAudioPortCallbacksEnabled(data.readInt32() == 1); 1315e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent return NO_ERROR; 1316e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } break; 1317e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 1318df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1319df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1320df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1321df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1322a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_session_t session = AUDIO_SESSION_NONE; 1323a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE; 1324a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_devices_t device = AUDIO_DEVICE_NONE; 1325df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1326df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1327df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1328df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1329df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1330df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1331df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1332df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1333df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1334df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1335df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1336df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1337df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1338df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1339df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1340df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1341df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1342df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1343df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1344df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1345bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1346bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1347bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1348bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1349bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1350bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1351baac183f3808d7b68f184647a97bd381620415feEric Laurent case REGISTER_POLICY_MIXES: { 1352baac183f3808d7b68f184647a97bd381620415feEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1353baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration = data.readInt32() == 1; 1354baac183f3808d7b68f184647a97bd381620415feEric Laurent Vector<AudioMix> mixes; 1355baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = (size_t)data.readInt32(); 1356baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 1357baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 1358baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1359baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 1360baac183f3808d7b68f184647a97bd381620415feEric Laurent AudioMix mix; 1361baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { 1362baac183f3808d7b68f184647a97bd381620415feEric Laurent mixes.add(mix); 1363baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1364baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1365baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = registerPolicyMixes(mixes, registration); 1366baac183f3808d7b68f184647a97bd381620415feEric Laurent reply->writeInt32(status); 1367baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_ERROR; 1368baac183f3808d7b68f184647a97bd381620415feEric Laurent } break; 1369baac183f3808d7b68f184647a97bd381620415feEric Laurent 1370554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case START_AUDIO_SOURCE: { 1371554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1372554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent struct audio_port_config source; 1373554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&source, sizeof(struct audio_port_config)); 1374554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_attributes_t attributes; 1375554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&attributes, sizeof(audio_attributes_t)); 1376e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_io_handle_t handle = {}; 1377554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = startAudioSource(&source, &attributes, &handle); 1378554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1379554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(handle); 1380554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1381554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1382554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1383554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case STOP_AUDIO_SOURCE: { 1384554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1385554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t handle = (audio_io_handle_t)data.readInt32(); 1386554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = stopAudioSource(handle); 1387554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1388554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1389554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1390554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 13912ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case SET_MASTER_MONO: { 13922ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 13932ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono = static_cast<bool>(data.readInt32()); 13942ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = setMasterMono(mono); 13952ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 13962ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 13972ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 13982ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 13992ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case GET_MASTER_MONO: { 14002ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 14012ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono; 14022ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = getMasterMono(&mono); 14032ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 14042ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 14052ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(static_cast<int32_t>(mono)); 14062ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 14072ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 14082ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 14092ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 1410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1415c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 141740bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1418