IAudioPolicyService.cpp revision 090ef604f81447eab4aa0a5b45d6307482573560
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, 36c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PHONE_STATE, 370b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten SET_RINGER_MODE, // reserved, no longer used 38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_FORCE_USE, 39c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_FORCE_USE, 40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_OUTPUT, 41c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_OUTPUT, 42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_OUTPUT, 43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_OUTPUT, 44caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent GET_INPUT_FOR_ATTR, 45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_INPUT, 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_INPUT, 47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_INPUT, 48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent INIT_STREAM_VOLUME, 49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_STREAM_VOLUME, 50de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STREAM_VOLUME, 51de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STRATEGY_FOR_STREAM, 52de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_OUTPUT_FOR_EFFECT, 53de070137f11d346fba77605bd76a44c040a618fcEric Laurent REGISTER_EFFECT, 54eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent UNREGISTER_EFFECT, 556b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten IS_STREAM_ACTIVE, 56d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi IS_SOURCE_ACTIVE, 576b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten GET_DEVICES_FOR_STREAM, 58db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent QUERY_DEFAULT_PRE_PROCESSING, 59272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi SET_EFFECT_ENABLED, 60ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald IS_STREAM_ACTIVE_REMOTELY, 61203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent IS_OFFLOAD_SUPPORTED, 62203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PORTS, 63203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent GET_AUDIO_PORT, 64203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CREATE_AUDIO_PATCH, 65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent RELEASE_AUDIO_PATCH, 66203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PATCHES, 67b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent SET_AUDIO_PORT_CONFIG, 685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi REGISTER_CLIENT, 69df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent GET_OUTPUT_FOR_ATTR, 70df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent ACQUIRE_SOUNDTRIGGER_SESSION, 71bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent RELEASE_SOUNDTRIGGER_SESSION, 72baac183f3808d7b68f184647a97bd381620415feEric Laurent GET_PHONE_STATE, 73baac183f3808d7b68f184647a97bd381620415feEric Laurent REGISTER_POLICY_MIXES, 74554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent START_AUDIO_SOURCE, 75e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent STOP_AUDIO_SOURCE, 76e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent SET_AUDIO_PORT_CALLBACK_ENABLED, 77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 791d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024 801d670b11313250442455a22f1056ad649d607fb2Eric Laurent 81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 84090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioPolicyService(const sp<IBinder>& impl) 85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 90fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 91fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 92e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 93e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 100e743a47f445f02a0612018fa5640301304844fbfPaul McLean data.writeCString(device_name); 101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 105fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 106fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 114fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 117f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 126fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 136fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 142fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getOutput( 146fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 14858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 149254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 150ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 151ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 158254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(flags)); 1602301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // hasOffloadInfo 161b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 162b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 163b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 164b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 165b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 166b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 167c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 168fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 171e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 172e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 173e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 174e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 1758c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 180aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId, 181e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 1825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi { 1835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Parcel data, reply; 1845bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1855bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (attr == NULL) { 186e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr(): NULL audio attributes and stream type"); 188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr unspecified stream type"); 192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (output == NULL) { 196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr NULL output - shouldn't happen"); 197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr == NULL) { 200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 203e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.write(attr, sizeof(audio_attributes_t)); 204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 205e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(session); 206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 207e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 208e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 209e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 210e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(*stream); 2115bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2128c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 2135bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(samplingRate); 2145bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(format)); 2155bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(channelMask); 2165bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 217aa9811945f575614b3482d09e4d969792701cebbPaul McLean data.writeInt32(selectedDeviceId); 2185bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi // hasOffloadInfo 2195bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (offloadInfo == NULL) { 2205bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(0); 2215bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } else { 2225bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(1); 2235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.write(offloadInfo, sizeof(audio_offload_info_t)); 2245bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 228e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 229e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status = (status_t)reply.readInt32(); 230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream != NULL) { 235e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *stream = (audio_stream_type_t)reply.readInt32(); 236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 237e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 2385bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2395bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 240de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 241fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 242e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 243c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 244c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 246fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 247fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 248e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 249c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 253de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 254fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 255e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 256c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 259fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 260fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 261e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 266e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 267e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 268e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 269c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 272fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 273e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)stream); 274e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 276c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 279caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 280caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 2818c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 282caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 285466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 286466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId) 287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 289c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 290caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr == NULL) { 291caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL attr - shouldn't happen"); 292caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 293caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (input == NULL) { 295caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL input - shouldn't happen"); 296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.write(attr, sizeof(audio_attributes_t)); 299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.writeInt32(session); 3008c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 302c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 303254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 304b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 305466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean data.writeInt32(selectedDeviceId); 306caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 307caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 308caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 309caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 310caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status = reply.readInt32(); 311caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 312caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 313caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 314caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent *input = (audio_io_handle_t)reply.readInt32(); 315caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3184dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 3194dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 323fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3244dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3294dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 3304dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 334fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3354dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3404dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 3414dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 345fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3464dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 350fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 36383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 36483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 36583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 37183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 37683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 37783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 37883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 38383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 38483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 390de070137f11d346fba77605bd76a44c040a618fcEric Laurent 391fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 392de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 393de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 394de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 395de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 396de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 397de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 398de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 399de070137f11d346fba77605bd76a44c040a618fcEric Laurent 4006374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 4016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 4026b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 4036b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 4046b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 4056b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 4066374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 4076b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 4086b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 40958e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 410de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 411de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 412de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 413de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 414de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 415de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 416de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 417de070137f11d346fba77605bd76a44c040a618fcEric Laurent 41858e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 4197c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 420de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 421de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session, 422de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 423de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 424de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 425de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 426de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 4277c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 428de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 429de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 430de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 431de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 432de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 433de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 434de070137f11d346fba77605bd76a44c040a618fcEric Laurent 435de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 436de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 437de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 438de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 439de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 440de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 441de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 442de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 443de070137f11d346fba77605bd76a44c040a618fcEric Laurent 444db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 445db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 446db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 447db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 448db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 449db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 450db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 451db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 452db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 453db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 454fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 455eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 456eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 457eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 458fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 459eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 460eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 461eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 462eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 46357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 464272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 465272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 466272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 467272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 468272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 469272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 470272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 471272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 472272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 473272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 474d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 475d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 476d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 477d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 478d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 479d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 480d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 481d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 482d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 48357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent virtual status_t queryDefaultPreProcessing(int audioSession, 48457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 48557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 48657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 48757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 49157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 49257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 49357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 49457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 49557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 49657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 49757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 49857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 49957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 50057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 50157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 50257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 50357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 50457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 50557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 50657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 507ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 508ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 509ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 510b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 511b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 512b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 513b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 640203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 641df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 642b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 643b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 644b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 645b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 646f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 647b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 648b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 650e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent virtual void setAudioPortCallbacksEnabled(bool enabled) 651e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent { 652e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent Parcel data, reply; 653e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 654e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInt32(enabled ? 1 : 0); 655e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply); 656e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } 657e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 669df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 670df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 672df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 673df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 674df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 675df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 676df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 678df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 682df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 683df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 684df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 685df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 686df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 687df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 688df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 689df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 690df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 691bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 692bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 693bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 694bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 695bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 696bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 697bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 698bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 699bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 700bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 701bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 702baac183f3808d7b68f184647a97bd381620415feEric Laurent 703baac183f3808d7b68f184647a97bd381620415feEric Laurent virtual status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration) 704baac183f3808d7b68f184647a97bd381620415feEric Laurent { 705baac183f3808d7b68f184647a97bd381620415feEric Laurent Parcel data, reply; 706baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 707baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(registration ? 1 : 0); 708baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = mixes.size(); 709baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 710baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 711baac183f3808d7b68f184647a97bd381620415feEric Laurent } 712baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t sizePosition = data.dataPosition(); 713baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(size); 714baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t finalSize = size; 715baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 716baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 717baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mixes[i].writeToParcel(&data) != NO_ERROR) { 718baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 719baac183f3808d7b68f184647a97bd381620415feEric Laurent finalSize--; 720baac183f3808d7b68f184647a97bd381620415feEric Laurent } 721baac183f3808d7b68f184647a97bd381620415feEric Laurent } 722baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size != finalSize) { 723baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 724baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(sizePosition); 725baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(finalSize); 726baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 727baac183f3808d7b68f184647a97bd381620415feEric Laurent } 728baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); 729baac183f3808d7b68f184647a97bd381620415feEric Laurent if (status == NO_ERROR) { 730baac183f3808d7b68f184647a97bd381620415feEric Laurent status = (status_t)reply.readInt32(); 731baac183f3808d7b68f184647a97bd381620415feEric Laurent } 732baac183f3808d7b68f184647a97bd381620415feEric Laurent return status; 733baac183f3808d7b68f184647a97bd381620415feEric Laurent } 734554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 735554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t startAudioSource(const struct audio_port_config *source, 736554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 737554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 738554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 739554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 740554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 741554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (source == NULL || attributes == NULL || handle == NULL) { 742554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return BAD_VALUE; 743554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 744554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(source, sizeof(struct audio_port_config)); 745554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(attributes, sizeof(audio_attributes_t)); 746554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply); 747554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 748554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 749554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 750554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 751554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 752554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent *handle = (audio_io_handle_t)reply.readInt32(); 755554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 756554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 757554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 758554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t stopAudioSource(audio_io_handle_t handle) 759554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 760554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 761554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 762554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInt32(handle); 763554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply); 764554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 765554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 766554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 767554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 768554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 769554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 770c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 771c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 772c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 773c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 774c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 775c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 776c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 777c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 778c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 779c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 780e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 781c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 782c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 783fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 784fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 785fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 786fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 787c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 788e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name = data.readCString(); 789de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 790de070137f11d346fba77605bd76a44c040a618fcEric Laurent state, 791e743a47f445f02a0612018fa5640301304844fbfPaul McLean device_address, 792e743a47f445f02a0612018fa5640301304844fbfPaul McLean device_name))); 793c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 794c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 795c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 796c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 797c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 798fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 799fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 800c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 801de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 802de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 803c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 805c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 806c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 80885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 80985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 810c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 811c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 813c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 814c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 81585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 81685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 817fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 818fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 819c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 822c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 823c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 824c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 82585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 82685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 830c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 832c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 833fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 834fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 83658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 837254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 8380ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 8390ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 840b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 841b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 842b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 843b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 844b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 848254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 849b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 850b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 851fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 852c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 8555bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 8565bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 85785f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten audio_attributes_t attr; 858e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 859e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 860e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 861e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 862e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 863e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 864e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 865e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 866e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 867e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 8688c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 8695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate = data.readInt32(); 8705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format = (audio_format_t) data.readInt32(); 8715bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask = data.readInt32(); 8725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 8735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 874aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId = data.readInt32(); 8755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi bool hasOffloadInfo = data.readInt32() != 0; 8765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_offload_info_t offloadInfo; 8775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (hasOffloadInfo) { 8785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(&offloadInfo, sizeof(audio_offload_info_t)); 8795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 880a946d844a77906072f5eb7093d41db465d6514bbRobert Shih audio_io_handle_t output = 0; 881e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 8828c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent &output, session, &stream, uid, 883e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent samplingRate, format, channelMask, 884aa9811945f575614b3482d09e4d969792701cebbPaul McLean flags, selectedDeviceId, hasOffloadInfo ? &offloadInfo : NULL); 885e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 886e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 887e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 8885bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 8895bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 8905bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 893fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 894ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 895ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 896e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 897de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 898ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 899de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 900c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 901c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 902c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 905fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 906ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 907ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 908e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 909de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 910ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 911de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 914c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 917fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 918e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 919e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 920e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 923c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 924caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent case GET_INPUT_FOR_ATTR: { 925c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 926caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_attributes_t attr; 927caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.read(&attr, sizeof(audio_attributes_t)); 928caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 9298c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 930c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 93158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 932254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 933b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 934466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32(); 935983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia audio_io_handle_t input = {}; 9368c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent status_t status = getInputForAttr(&attr, &input, session, uid, 937caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent samplingRate, format, channelMask, 938466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean flags, selectedDeviceId); 939caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(status); 940caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status == NO_ERROR) { 941caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(input); 942caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 944c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 945c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 946c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 948fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9504dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 952c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 953c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 954c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 955c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 956fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9574dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9584dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 959c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 960c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 961c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 962c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 963c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 964fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9654dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9664dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 967c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 968c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 969c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 970c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 971c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 972fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 973fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 974c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 975c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 976c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 977c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 978c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 979c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 980c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 981c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 982fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 983fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 984c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 98583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 98683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 98783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 98883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 989c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 990c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 991c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 992c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 993c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 994fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 995fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 99683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 997892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih int index = 0; 99883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 1000c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1002c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1003c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1004de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 1005de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1006fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1007fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1008de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 1009de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1010de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1011de070137f11d346fba77605bd76a44c040a618fcEric Laurent 10126b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 10136b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 1014fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1015fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 10166b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 10176b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 10186b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 10196b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 1020de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 1021de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1022de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1023de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1024de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 1025de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 1026de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1027de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1028de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1029de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 1030de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1031de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1032de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 10337c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 1034de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 1035de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 1036de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1037de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 10387c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 1039de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 1040de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 1041de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 1042de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1043de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1044de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1045de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 1046de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1047de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1048de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 1049de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1050de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1051de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1052db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 1053db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1054db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 1055db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 1056db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 1057db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 1058db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 1059db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 1060eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 1061eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1062fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1063eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 1064ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 1065eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 1066eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 1067eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 1068272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 1069272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1070272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1071272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 1072ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 1073272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 1074272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 1075272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 1076d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 1077d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1078d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 1079d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 1080d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 1081d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 1082d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 108357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 108457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 108557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent int audioSession = data.readInt32(); 108657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 108774adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 108874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 108974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 109057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 109174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent effect_descriptor_t *descriptors = new effect_descriptor_t[count]; 109257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 109357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 109457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 109557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 109657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 109757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 109874adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 109957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 110057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 110157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 110257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 110357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 110457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 110557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 110657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 110757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 1108b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 1109b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 1110b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t info; 1111b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 1112b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 1113b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 1114b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 1115b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1116b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1117203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1118203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1119203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1120203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1121203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 11221d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 11231d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 11241d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1125203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1126203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1127203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 11281d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (ports == NULL) { 11291d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 11301d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 11311d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 11321d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 11331d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1134203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1135203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1136203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1137203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1138203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1139203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1140203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1141203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1142203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1143203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1144203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1145203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1146203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1147203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1148203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1149203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1150203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1151e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1152e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1153e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1154e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1155203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1156203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1157203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1158203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1159203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1160203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1161203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1162203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1163203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1164203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1165203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch patch; 1166203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1167e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_patch_handle_t handle = {}; 1168e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1169e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1170e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1171203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1172203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1173203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1174203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1175203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1176203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1177203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1178203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1179203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1180203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1181203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1182203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1183203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1184203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1185203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1186203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1187203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1188203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1189203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1190203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 11911d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 11921d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 11931d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1194203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1195203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1196203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1197203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 11981d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (patches == NULL) { 11991d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 12001d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 12011d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 12021d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 12031d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1204203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1205203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1206203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1207203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1208203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1209203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1210203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1211203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1212203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1213203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1214203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1215203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1216203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1217203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1218203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1219203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1220203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port_config config; 1221203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 1222203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1223203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1224203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1225203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1226df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1227b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1228b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1229b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1230b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1231b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1232b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1233b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1234203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1235e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent case SET_AUDIO_PORT_CALLBACK_ENABLED: { 1236e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1237e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent setAudioPortCallbacksEnabled(data.readInt32() == 1); 1238e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent return NO_ERROR; 1239e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } break; 1240e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 1241df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1242df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1243df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1244df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1245983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia audio_session_t session = {}; 1246983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia audio_io_handle_t ioHandle = {}; 1247983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia audio_devices_t device = {}; 1248df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1249df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1250df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1251df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1252df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1253df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1254df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1255df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1256df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1257df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1258df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1259df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1260df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1261df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1262df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1263df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1264df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1265df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1266df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1267df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1268bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1269bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1270bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1271bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1272bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1273bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1274baac183f3808d7b68f184647a97bd381620415feEric Laurent case REGISTER_POLICY_MIXES: { 1275baac183f3808d7b68f184647a97bd381620415feEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1276baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration = data.readInt32() == 1; 1277baac183f3808d7b68f184647a97bd381620415feEric Laurent Vector<AudioMix> mixes; 1278baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = (size_t)data.readInt32(); 1279baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 1280baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 1281baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1282baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 1283baac183f3808d7b68f184647a97bd381620415feEric Laurent AudioMix mix; 1284baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { 1285baac183f3808d7b68f184647a97bd381620415feEric Laurent mixes.add(mix); 1286baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1287baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1288baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = registerPolicyMixes(mixes, registration); 1289baac183f3808d7b68f184647a97bd381620415feEric Laurent reply->writeInt32(status); 1290baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_ERROR; 1291baac183f3808d7b68f184647a97bd381620415feEric Laurent } break; 1292baac183f3808d7b68f184647a97bd381620415feEric Laurent 1293554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case START_AUDIO_SOURCE: { 1294554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1295554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent struct audio_port_config source; 1296554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&source, sizeof(struct audio_port_config)); 1297554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_attributes_t attributes; 1298554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&attributes, sizeof(audio_attributes_t)); 1299e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_io_handle_t handle = {}; 1300554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = startAudioSource(&source, &attributes, &handle); 1301554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1302554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(handle); 1303554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1304554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1305554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1306554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case STOP_AUDIO_SOURCE: { 1307554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1308554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t handle = (audio_io_handle_t)data.readInt32(); 1309554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = stopAudioSource(handle); 1310554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1311554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1312554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1313554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 132140bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1322