IAudioPolicyService.cpp revision 554a277d4e42a3d3df3d90ba0e7dfa2d31690e32
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, 75554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent STOP_AUDIO_SOURCE 76c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 781d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024 791d670b11313250442455a22f1056ad649d607fb2Eric Laurent 80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent BpAudioPolicyService(const sp<IBinder>& impl) 84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 89fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 90fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 91e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 92e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 93c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 99e743a47f445f02a0612018fa5640301304844fbfPaul McLean data.writeCString(device_name); 100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 104fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 105fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 113fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 116f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 125fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 135fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 141fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getOutput( 145fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 14758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 148254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 149ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 150ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 157254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(flags)); 1592301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // hasOffloadInfo 160b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 161b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 162b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 163b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 164b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 165b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 166c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 167fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 170e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 171e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 172e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 173e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 174e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 175e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 178aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId, 179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 1805bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi { 1815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Parcel data, reply; 1825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (attr == NULL) { 184e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 185e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr(): NULL audio attributes and stream type"); 186e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr unspecified stream type"); 190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (output == NULL) { 194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr NULL output - shouldn't happen"); 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr == NULL) { 198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.write(attr, sizeof(audio_attributes_t)); 202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 203e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(session); 204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 205e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 207e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 208e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(*stream); 2095bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2105bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(samplingRate); 2115bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(format)); 2125bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(channelMask); 2135bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 214aa9811945f575614b3482d09e4d969792701cebbPaul McLean data.writeInt32(selectedDeviceId); 2155bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi // hasOffloadInfo 2165bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (offloadInfo == NULL) { 2175bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(0); 2185bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } else { 2195bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(1); 2205bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.write(offloadInfo, sizeof(audio_offload_info_t)); 2215bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 223e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 224e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status = (status_t)reply.readInt32(); 227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 228e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 229e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream != NULL) { 232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *stream = (audio_stream_type_t)reply.readInt32(); 233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 2355bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2365bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 237de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 238fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 239e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 240c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 241c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 242c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 243fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 244fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 245e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 247c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 248c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 249c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 250de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 251fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 252e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 254c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 255c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 256fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 257fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 258e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 260c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 261c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 263e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 264e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 265e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 267c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 269fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 270e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)stream); 271e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 275caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 276caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 277caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 279caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 280caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 281caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_input_flags_t flags) 282c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 284c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 285caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr == NULL) { 286caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL attr - shouldn't happen"); 287caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 288caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 289caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (input == NULL) { 290caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL input - shouldn't happen"); 291caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 292caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 293caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.write(attr, sizeof(audio_attributes_t)); 294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.writeInt32(session); 295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 297254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 298b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 300caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 301caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 302caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 303caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status = reply.readInt32(); 304caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 305caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 306caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 307caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent *input = (audio_io_handle_t)reply.readInt32(); 308caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 309c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3114dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 3124dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 316fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3174dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3224dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 3234dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 327fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3284dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3334dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 3344dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 338fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3394dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 343fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 35683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 35783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 35883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 36483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 36983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 37083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 37183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 37683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 37783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 383de070137f11d346fba77605bd76a44c040a618fcEric Laurent 384fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 385de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 386de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 387de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 388de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 389de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 390de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 391de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 392de070137f11d346fba77605bd76a44c040a618fcEric Laurent 3936374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 3946b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 3956b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 3966b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 3976b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 3986b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 3996374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 4006b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 4016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 40258e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 403de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 404de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 405de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 406de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 407de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 408de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 409de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 410de070137f11d346fba77605bd76a44c040a618fcEric Laurent 41158e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 4127c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 413de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 414de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session, 415de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 416de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 417de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 418de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 419de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 4207c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 421de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 422de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 423de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 424de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 425de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 426de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 427de070137f11d346fba77605bd76a44c040a618fcEric Laurent 428de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 429de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 430de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 431de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 432de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 433de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 434de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 435de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 436de070137f11d346fba77605bd76a44c040a618fcEric Laurent 437db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 438db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 439db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 440db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 441db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 442db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 443db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 444db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 445db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 446db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 447fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 448eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 449eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 450eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 451fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 452eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 453eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 454eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 455eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 45657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 457272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 458272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 459272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 460272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 461272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 462272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 463272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 464272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 465272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 466272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 467d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 468d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 469d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 470d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 471d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 472d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 473d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 474d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 475d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 47657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent virtual status_t queryDefaultPreProcessing(int audioSession, 47757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 47857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 47957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 48057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 48157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 48257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 48357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 48457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 48557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 48657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 48757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 49157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 49257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 49357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 49457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 49557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 49657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 49757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 49857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 49957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 500ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 501ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 502ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 503b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 504b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 505b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 506b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 507203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 508203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 509203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 510203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 511203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 512203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 634df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 635b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 636b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 637b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 638b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 639f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 640b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 641b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 642df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 643df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 644df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 645df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 646df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 647df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 648df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 650df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 651df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 652df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 653df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 654df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 655df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 656df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 657df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 669df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 670df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 672df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 673df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 674df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 675df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 676bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 677bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 678bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 679bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 680bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 681bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 682bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 683bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 684bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 685bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 686bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 687baac183f3808d7b68f184647a97bd381620415feEric Laurent 688baac183f3808d7b68f184647a97bd381620415feEric Laurent virtual status_t registerPolicyMixes(Vector<AudioMix> mixes, bool registration) 689baac183f3808d7b68f184647a97bd381620415feEric Laurent { 690baac183f3808d7b68f184647a97bd381620415feEric Laurent Parcel data, reply; 691baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 692baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(registration ? 1 : 0); 693baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = mixes.size(); 694baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 695baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 696baac183f3808d7b68f184647a97bd381620415feEric Laurent } 697baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t sizePosition = data.dataPosition(); 698baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(size); 699baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t finalSize = size; 700baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 701baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 702baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mixes[i].writeToParcel(&data) != NO_ERROR) { 703baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 704baac183f3808d7b68f184647a97bd381620415feEric Laurent finalSize--; 705baac183f3808d7b68f184647a97bd381620415feEric Laurent } 706baac183f3808d7b68f184647a97bd381620415feEric Laurent } 707baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size != finalSize) { 708baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 709baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(sizePosition); 710baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(finalSize); 711baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 712baac183f3808d7b68f184647a97bd381620415feEric Laurent } 713baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); 714baac183f3808d7b68f184647a97bd381620415feEric Laurent if (status == NO_ERROR) { 715baac183f3808d7b68f184647a97bd381620415feEric Laurent status = (status_t)reply.readInt32(); 716baac183f3808d7b68f184647a97bd381620415feEric Laurent } 717baac183f3808d7b68f184647a97bd381620415feEric Laurent return status; 718baac183f3808d7b68f184647a97bd381620415feEric Laurent } 719554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 720554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t startAudioSource(const struct audio_port_config *source, 721554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 722554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 723554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 724554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 725554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 726554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (source == NULL || attributes == NULL || handle == NULL) { 727554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return BAD_VALUE; 728554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 729554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(source, sizeof(struct audio_port_config)); 730554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(attributes, sizeof(audio_attributes_t)); 731554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply); 732554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 733554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 734554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 735554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 736554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 737554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 738554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 739554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent *handle = (audio_io_handle_t)reply.readInt32(); 740554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 741554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 742554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 743554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t stopAudioSource(audio_io_handle_t handle) 744554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 745554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 746554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 747554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInt32(handle); 748554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply); 749554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 750554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 751554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 752554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 755c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 756c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 757c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 758c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 759c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 760c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 761c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 762c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 763c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 764c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 765e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 766c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 767c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 768fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 769fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 770fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 771fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 772c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 773e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name = data.readCString(); 774de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 775de070137f11d346fba77605bd76a44c040a618fcEric Laurent state, 776e743a47f445f02a0612018fa5640301304844fbfPaul McLean device_address, 777e743a47f445f02a0612018fa5640301304844fbfPaul McLean device_name))); 778c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 779c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 780c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 781c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_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()); 785c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 786de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 787de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 788c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 789c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 790c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 791c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 792c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 79385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 79485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 795c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 796c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 797c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 798c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 799c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 80085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 80185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 802fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 803fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 805c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 806c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 808c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 809c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 81085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 81185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 813c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 814c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 815c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 816c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 817c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 818fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 819fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 82158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 822254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 8230ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 8240ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 825b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 826b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 827b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 828b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 829b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 830c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 832c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 833254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 834b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 835b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 836fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 839c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 8405bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 8415bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 84285f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten audio_attributes_t attr; 843e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 844e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 845e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 846e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 847e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 848e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 849e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 850e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 851e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 852e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 8535bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate = data.readInt32(); 8545bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format = (audio_format_t) data.readInt32(); 8555bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask = data.readInt32(); 8565bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 8575bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 858aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId = data.readInt32(); 8595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi bool hasOffloadInfo = data.readInt32() != 0; 8605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_offload_info_t offloadInfo; 8615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (hasOffloadInfo) { 8625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(&offloadInfo, sizeof(audio_offload_info_t)); 8635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 864e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t output; 865e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 866e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent &output, session, &stream, 867e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent samplingRate, format, channelMask, 868aa9811945f575614b3482d09e4d969792701cebbPaul McLean flags, selectedDeviceId, hasOffloadInfo ? &offloadInfo : NULL); 869e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 870e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 871e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 8725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 8735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 8745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 877fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 878ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 879ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 880e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 881de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 882ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 883de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 884c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 889fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 890ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 891ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 892e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 893de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 894ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 895de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 899c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 900c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 901fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 902e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 903e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 904e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 906c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 907c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 908caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent case GET_INPUT_FOR_ATTR: { 909c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 910caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_attributes_t attr; 911caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.read(&attr, sizeof(audio_attributes_t)); 912caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 91458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 915254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 916b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 917caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t input; 918caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = getInputForAttr(&attr, &input, session, 919caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent samplingRate, format, channelMask, 920caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent flags); 921caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(status); 922caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status == NO_ERROR) { 923caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(input); 924caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 925c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 926c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 927c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 928c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 929c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 930fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9314dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9324dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 933c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 934c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 935c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 936c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 937c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 938fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9394dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9404dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 941c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 942c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 944c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 945c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 946fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9474dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9484dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 949c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 950c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 952c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 953c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 954fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 955fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 956c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 957c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 958c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 959c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 960c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 961c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 962c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 963c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 964fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 965fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 966c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 96783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 96883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 96983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 97083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 971c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 972c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 973c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 974c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 975c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 976fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 977fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 97883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 979c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index; 98083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 981c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 982c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 983c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 984c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 985c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 986de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 987de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 988fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 989fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 990de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 991de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 992de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 993de070137f11d346fba77605bd76a44c040a618fcEric Laurent 9946b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 9956b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 996fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 997fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 9986b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 9996b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 10006b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 10016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 1002de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 1003de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1004de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1005de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1006de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 1007de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 1008de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1009de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1010de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1011de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 1012de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1013de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1014de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 10157c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 1016de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 1017de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 1018de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1019de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 10207c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 1021de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 1022de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 1023de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 1024de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1025de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1026de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1027de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 1028de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1029de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1030de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 1031de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1032de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1033de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1034db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 1035db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1036db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 1037db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 1038db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 1039db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 1040db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 1041db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 1042eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 1043eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1044fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1045eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 1046ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 1047eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 1048eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 1049eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 1050272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 1051272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1052272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1053272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 1054ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 1055272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 1056272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 1057272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 1058d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 1059d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1060d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 1061d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 1062d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 1063d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 1064d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 106557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 106657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 106757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent int audioSession = data.readInt32(); 106857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 106974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 107074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 107174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 107257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 107374adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent effect_descriptor_t *descriptors = new effect_descriptor_t[count]; 107457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 107557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 107657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 107757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 107857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 107957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 108074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 108157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 108257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 108357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 108457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 108557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 108657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 108757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 108857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 108957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 1090b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 1091b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 1092b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t info; 1093b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 1094b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 1095b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 1096b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 1097b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1098b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1099203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1100203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1101203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1102203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1103203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 11041d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 11051d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 11061d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1107203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1108203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1109203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 11101d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (ports == NULL) { 11111d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 11121d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 11131d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 11141d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 11151d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1116203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1117203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1118203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1119203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1120203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1121203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1122203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1123203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1124203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1125203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1126203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1127203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1128203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1129203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1130203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1131203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1132203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1133203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port port; 1134203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&port, sizeof(struct audio_port)); 1135203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1136203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1137203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1138203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1139203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1140203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1141203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1142203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1143203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1144203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1145203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch patch; 1146203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1147203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1148203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1149203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1150203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1151203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1152203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1153203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1154203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1155203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1156203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1157203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1158203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1159203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1160203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1161203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1162203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1163203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1164203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1165203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1166203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1167203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1168203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 11691d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 11701d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 11711d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1172203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1173203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1174203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1175203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 11761d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (patches == NULL) { 11771d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 11781d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 11791d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 11801d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 11811d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1182203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1183203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1184203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1185203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1186203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1187203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1188203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1189203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1190203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1191203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1192203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1193203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1194203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1195203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1196203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1197203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1198203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port_config config; 1199203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 1200203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1201203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1202203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1203203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1204df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1205b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1206b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1207b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1208b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1209b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1210b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1211b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1212203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1213df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1214df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1215df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1216df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1217df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session; 1218df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t ioHandle; 1219df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t device; 1220df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1221df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1222df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1223df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1224df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1225df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1226df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1227df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1228df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1229df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1230df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1231df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1232df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1233df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1234df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1235df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1236df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1237df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1238df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1239df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1240bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1241bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1242bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1243bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1244bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1245bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1246baac183f3808d7b68f184647a97bd381620415feEric Laurent case REGISTER_POLICY_MIXES: { 1247baac183f3808d7b68f184647a97bd381620415feEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1248baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration = data.readInt32() == 1; 1249baac183f3808d7b68f184647a97bd381620415feEric Laurent Vector<AudioMix> mixes; 1250baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = (size_t)data.readInt32(); 1251baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 1252baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 1253baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1254baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 1255baac183f3808d7b68f184647a97bd381620415feEric Laurent AudioMix mix; 1256baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { 1257baac183f3808d7b68f184647a97bd381620415feEric Laurent mixes.add(mix); 1258baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1259baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1260baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = registerPolicyMixes(mixes, registration); 1261baac183f3808d7b68f184647a97bd381620415feEric Laurent reply->writeInt32(status); 1262baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_ERROR; 1263baac183f3808d7b68f184647a97bd381620415feEric Laurent } break; 1264baac183f3808d7b68f184647a97bd381620415feEric Laurent 1265554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case START_AUDIO_SOURCE: { 1266554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1267554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent struct audio_port_config source; 1268554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&source, sizeof(struct audio_port_config)); 1269554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_attributes_t attributes; 1270554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&attributes, sizeof(audio_attributes_t)); 1271554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t handle; 1272554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = startAudioSource(&source, &attributes, &handle); 1273554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1274554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(handle); 1275554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1276554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1277554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1278554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case STOP_AUDIO_SOURCE: { 1279554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1280554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t handle = (audio_io_handle_t)data.readInt32(); 1281554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = stopAudioSource(handle); 1282554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1283554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1284554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1285554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1289c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1290c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 129340bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1294