IAudioPolicyService.cpp revision e964d4e421e2d1ca937227a580c0c837091a11e3
1c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent/* 2c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 3c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Copyright 2009, The Android Open Source Project 4c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 5c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Licensed under the Apache License, Version 2.0 (the "License"); 6c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** you may not use this file except in compliance with the License. 7c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** You may obtain a copy of the License at 8c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 9c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** http://www.apache.org/licenses/LICENSE-2.0 10c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** 11c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** Unless required by applicable law or agreed to in writing, software 12c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** distributed under the License is distributed on an "AS IS" BASIS, 13c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** See the License for the specific language governing permissions and 15c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent** limitations under the License. 16c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent*/ 17c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 18c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#define LOG_TAG "IAudioPolicyService" 19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <utils/Log.h> 20c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 21c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <stdint.h> 22c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <sys/types.h> 23c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 24c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <binder/Parcel.h> 25c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2674adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent#include <media/AudioEffect.h> 27c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h> 28c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2964760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 30fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android { 32c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 33c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum { 34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION, 35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_DEVICE_CONNECTION_STATE, 36c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PHONE_STATE, 370b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten SET_RINGER_MODE, // reserved, no longer used 38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_FORCE_USE, 39c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_FORCE_USE, 40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_OUTPUT, 41c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_OUTPUT, 42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_OUTPUT, 43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_OUTPUT, 44caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent GET_INPUT_FOR_ATTR, 45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_INPUT, 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_INPUT, 47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_INPUT, 48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent INIT_STREAM_VOLUME, 49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_STREAM_VOLUME, 50de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STREAM_VOLUME, 51de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STRATEGY_FOR_STREAM, 52de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_OUTPUT_FOR_EFFECT, 53de070137f11d346fba77605bd76a44c040a618fcEric Laurent REGISTER_EFFECT, 54eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent UNREGISTER_EFFECT, 556b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten IS_STREAM_ACTIVE, 56d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi IS_SOURCE_ACTIVE, 576b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten GET_DEVICES_FOR_STREAM, 58db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent QUERY_DEFAULT_PRE_PROCESSING, 59272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi SET_EFFECT_ENABLED, 60ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald IS_STREAM_ACTIVE_REMOTELY, 61203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent IS_OFFLOAD_SUPPORTED, 62203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PORTS, 63203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent GET_AUDIO_PORT, 64203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CREATE_AUDIO_PATCH, 65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent RELEASE_AUDIO_PATCH, 66203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PATCHES, 67b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent SET_AUDIO_PORT_CONFIG, 685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi REGISTER_CLIENT, 69df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent GET_OUTPUT_FOR_ATTR, 70df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent ACQUIRE_SOUNDTRIGGER_SESSION, 71bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent RELEASE_SOUNDTRIGGER_SESSION, 72baac183f3808d7b68f184647a97bd381620415feEric Laurent GET_PHONE_STATE, 73baac183f3808d7b68f184647a97bd381620415feEric Laurent REGISTER_POLICY_MIXES, 74554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent START_AUDIO_SOURCE, 75e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent STOP_AUDIO_SOURCE, 76e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent SET_AUDIO_PORT_CALLBACK_ENABLED, 772ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung SET_MASTER_MONO, 782ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung GET_MASTER_MONO, 79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 811d670b11313250442455a22f1056ad649d607fb2Eric Laurent#define MAX_ITEMS_PER_LIST 1024 821d670b11313250442455a22f1056ad649d607fb2Eric Laurent 83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 86090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioPolicyService(const sp<IBinder>& impl) 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 92fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 93fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 94e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 95e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 102e743a47f445f02a0612018fa5640301304844fbfPaul McLean data.writeCString(device_name); 103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 107fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 108fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 116fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 119f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 128fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 138fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 144fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getOutput( 148fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 15058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 151254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 152ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 153ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 160254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(flags)); 1622301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // hasOffloadInfo 163b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 164b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 165b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 166b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 167b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 168b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 170fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 173e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 174e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 175e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 1778c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 180e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 181e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 182aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId, 183e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 1845bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi { 1855bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Parcel data, reply; 1865bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1875bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (attr == NULL) { 188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr(): NULL audio attributes and stream type"); 190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr unspecified stream type"); 194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (output == NULL) { 198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr NULL output - shouldn't happen"); 199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 201e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr == NULL) { 202e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 203e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 205e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.write(attr, sizeof(audio_attributes_t)); 206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 207e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(session); 208e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 209e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 210e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 211e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 212e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(*stream); 2135bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2148c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 2155bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(samplingRate); 2165bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(format)); 2175bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(channelMask); 2185bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 219aa9811945f575614b3482d09e4d969792701cebbPaul McLean data.writeInt32(selectedDeviceId); 2205bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi // hasOffloadInfo 2215bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (offloadInfo == NULL) { 2225bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(0); 2235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } else { 2245bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(1); 2255bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.write(offloadInfo, sizeof(audio_offload_info_t)); 2265bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 228e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 229e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 231e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status = (status_t)reply.readInt32(); 232e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 233e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 234e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 235e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream != NULL) { 237e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *stream = (audio_stream_type_t)reply.readInt32(); 238e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 239e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 2405bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2415bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 242de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 243fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 244e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 247c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 248fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 249fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 250d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 254c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 255de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 256fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 257e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 260c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 261fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 262fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 263d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten data.writeInt32((int32_t) session); 264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 267c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 268e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 269e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 270e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 274fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 275e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)stream); 276e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 280caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 281caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 282caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 283b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid, 2848c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 285caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 286caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 287caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 288466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 289466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId) 290c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 293caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr == NULL) { 294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL attr - shouldn't happen"); 295caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (input == NULL) { 298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL input - shouldn't happen"); 299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 300caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 301caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.write(attr, sizeof(audio_attributes_t)); 302caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.writeInt32(session); 303b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent data.writeInt32(pid); 3048c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent data.writeInt32(uid); 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 307254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 308b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 309466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean data.writeInt32(selectedDeviceId); 310caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 311caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 312caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 313caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 314caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status = reply.readInt32(); 315caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 316caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 317caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 318caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent *input = (audio_io_handle_t)reply.readInt32(); 319caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3224dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(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(START_INPUT, data, &reply); 330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3334dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(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(STOP_INPUT, data, &reply); 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3444dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 3454dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 349fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3504dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 354fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 36783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 36883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 36983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 37583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 38083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 38183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 38283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 38783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 38883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 394de070137f11d346fba77605bd76a44c040a618fcEric Laurent 395fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 396de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 397de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 398de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 399de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 400de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 401de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 402de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 403de070137f11d346fba77605bd76a44c040a618fcEric Laurent 4046374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 4056b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 4066b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 4076b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 4086b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 4096b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 4106374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 4116b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 4126b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 41358e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 414de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 415de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 416de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 417de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 418de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 419de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 420de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 421de070137f11d346fba77605bd76a44c040a618fcEric Laurent 42258e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 4237c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 424de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 425d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session, 426de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 427de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 428de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 429de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 430de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 4317c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 432de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 433de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 434de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 435de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 436de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 437de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 438de070137f11d346fba77605bd76a44c040a618fcEric Laurent 439de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 440de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 441de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 442de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 443de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 444de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 445de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 446de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 447de070137f11d346fba77605bd76a44c040a618fcEric Laurent 448db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 449db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 450db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 451db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 452db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 453db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 454db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 455db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 456db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 457db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 458fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 459eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 460eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 461eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 462fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 463eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 464eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 465eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 466eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 46757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 468272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 469272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 470272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 471272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 472272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 473272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 474272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 475272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 476272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 477272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 478d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 479d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 480d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 481d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 482d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 483d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 484d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 485d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 486d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 487d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t queryDefaultPreProcessing(audio_session_t audioSession, 48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 49157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 49257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 49357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 49457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 49557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 49657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 49757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 49857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 49957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 50057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 50157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 50257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 50357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 50457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 50557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 50657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 50757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 50857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 50957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 51057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 511ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 512ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 513ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 514b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 515b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 516b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 517b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 625203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 627203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 630203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 632203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 633203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 634203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 635203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 636203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 640203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 641203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 642203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 643203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 644203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 645df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 646b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 647b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 648b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 649b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 650f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 651b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 652b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 653df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 654e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent virtual void setAudioPortCallbacksEnabled(bool enabled) 655e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent { 656e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent Parcel data, reply; 657e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 658e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent data.writeInt32(enabled ? 1 : 0); 659e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply); 660e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } 661e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 668df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 669df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 670df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 672df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 673df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 674df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 675df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 676df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 678df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 682df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 683df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 684df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 685df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 686df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 687df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 688df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 689df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 690df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 691df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 692df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 693df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 694df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 695bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 696bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 697bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 698bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 699bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 700bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 701bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 702bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 703bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 704bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 705bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 706baac183f3808d7b68f184647a97bd381620415feEric Laurent 707e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) 708baac183f3808d7b68f184647a97bd381620415feEric Laurent { 709baac183f3808d7b68f184647a97bd381620415feEric Laurent Parcel data, reply; 710baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 711baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(registration ? 1 : 0); 712baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = mixes.size(); 713baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 714baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 715baac183f3808d7b68f184647a97bd381620415feEric Laurent } 716baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t sizePosition = data.dataPosition(); 717baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(size); 718baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t finalSize = size; 719baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 720baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 721baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mixes[i].writeToParcel(&data) != NO_ERROR) { 722baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 723baac183f3808d7b68f184647a97bd381620415feEric Laurent finalSize--; 724baac183f3808d7b68f184647a97bd381620415feEric Laurent } 725baac183f3808d7b68f184647a97bd381620415feEric Laurent } 726baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size != finalSize) { 727baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t position = data.dataPosition(); 728baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(sizePosition); 729baac183f3808d7b68f184647a97bd381620415feEric Laurent data.writeInt32(finalSize); 730baac183f3808d7b68f184647a97bd381620415feEric Laurent data.setDataPosition(position); 731baac183f3808d7b68f184647a97bd381620415feEric Laurent } 732baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); 733baac183f3808d7b68f184647a97bd381620415feEric Laurent if (status == NO_ERROR) { 734baac183f3808d7b68f184647a97bd381620415feEric Laurent status = (status_t)reply.readInt32(); 735baac183f3808d7b68f184647a97bd381620415feEric Laurent } 736baac183f3808d7b68f184647a97bd381620415feEric Laurent return status; 737baac183f3808d7b68f184647a97bd381620415feEric Laurent } 738554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 739554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t startAudioSource(const struct audio_port_config *source, 740554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 741554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 742554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 743554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 744554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 745554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (source == NULL || attributes == NULL || handle == NULL) { 746554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return BAD_VALUE; 747554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 748554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(source, sizeof(struct audio_port_config)); 749554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.write(attributes, sizeof(audio_attributes_t)); 750554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply); 751554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 752554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 753554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 754554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 755554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 756554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 757554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 758554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent *handle = (audio_io_handle_t)reply.readInt32(); 759554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 760554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 761554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 762554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent virtual status_t stopAudioSource(audio_io_handle_t handle) 763554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent { 764554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Parcel data, reply; 765554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 766554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.writeInt32(handle); 767554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply); 768554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (status != NO_ERROR) { 769554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 770554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 771554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status = (status_t)reply.readInt32(); 772554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return status; 773554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 7742ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 7752ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t setMasterMono(bool mono) 7762ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 7772ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 7782ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 7792ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInt32(static_cast<int32_t>(mono)); 7802ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(SET_MASTER_MONO, data, &reply); 7812ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 7822ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 7832ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7842ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return static_cast<status_t>(reply.readInt32()); 7852ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7862ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 7872ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung virtual status_t getMasterMono(bool *mono) 7882ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung { 7892ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (mono == nullptr) { 7902ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return BAD_VALUE; 7912ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7922ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Parcel data, reply; 7932ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 7942ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 7952ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = remote()->transact(GET_MASTER_MONO, data, &reply); 7962ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status != NO_ERROR) { 7972ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 7982ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7992ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status = static_cast<status_t>(reply.readInt32()); 8002ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 8012ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung *mono = static_cast<bool>(reply.readInt32()); 8022ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 8032ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return status; 8042ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 805c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 806c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 808c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 809c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 810c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 811c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 813c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 814c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 815e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 816c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 817c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 818fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 819fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 820fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 821fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 822c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 823e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name = data.readCString(); 824de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 825de070137f11d346fba77605bd76a44c040a618fcEric Laurent state, 826e743a47f445f02a0612018fa5640301304844fbfPaul McLean device_address, 827e743a47f445f02a0612018fa5640301304844fbfPaul McLean device_name))); 828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 830c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 832c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 833fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 834fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 836de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 837de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 839c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 840c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 841c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 842c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 84385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 84485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 848c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 85085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 85185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 852fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 853fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 858c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 859c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 86085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 86185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 865c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 866c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 867c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 868fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 869fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 870c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 87158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 872254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 8730ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 8740ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 875b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 876b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 877b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 878b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 879b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 883254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 884b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 885b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 886fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 8905bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 8915bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 89285f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten audio_attributes_t attr; 893e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 894e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 895e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 896e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 897e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 898e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 899e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 900e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 901e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 902e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 9038c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 9045bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate = data.readInt32(); 9055bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format = (audio_format_t) data.readInt32(); 9065bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask = data.readInt32(); 9075bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 9085bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 909aa9811945f575614b3482d09e4d969792701cebbPaul McLean audio_port_handle_t selectedDeviceId = data.readInt32(); 9105bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi bool hasOffloadInfo = data.readInt32() != 0; 9115bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_offload_info_t offloadInfo; 9125bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (hasOffloadInfo) { 9135bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(&offloadInfo, sizeof(audio_offload_info_t)); 9145bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 915a946d844a77906072f5eb7093d41db465d6514bbRobert Shih audio_io_handle_t output = 0; 916e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 9178c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent &output, session, &stream, uid, 918e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent samplingRate, format, channelMask, 919aa9811945f575614b3482d09e4d969792701cebbPaul McLean flags, selectedDeviceId, hasOffloadInfo ? &offloadInfo : NULL); 920e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 921e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 922e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 9235bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 9245bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 9255bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 926c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 927c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 928fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 929ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 930ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 931e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 932de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 933ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 934de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 935c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 936c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 937c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 938c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 939c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 940fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 941ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 942ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 943e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 944de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 945ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 946de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 948c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 949c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 950c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 952fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 953e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 954e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 955e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 956c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 957c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 958c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 959caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent case GET_INPUT_FOR_ATTR: { 960c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 961caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_attributes_t attr; 962caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.read(&attr, sizeof(audio_attributes_t)); 963caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 964b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid = (pid_t)data.readInt32(); 9658c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid = (uid_t)data.readInt32(); 966c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 96758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 968254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 969b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 970466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32(); 971a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_io_handle_t input = AUDIO_IO_HANDLE_NONE; 972b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent status_t status = getInputForAttr(&attr, &input, session, pid, uid, 973caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent samplingRate, format, channelMask, 974466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean flags, selectedDeviceId); 975caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(status); 976caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status == NO_ERROR) { 977caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(input); 978caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 979c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 980c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 981c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 982c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 983c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 984fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9854dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9864dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 987c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 988c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 989c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 990c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 991c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 992fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 9934dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 9944dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 995c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 996c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 997c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 998c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1000fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 10014dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 10024dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 1003c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1004c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1005c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1006c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 1007c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1008fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1009fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1010c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 1011c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 1012c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 1013c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1014c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1015c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1016c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 1017c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1018fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1019fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1020c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 102183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 102283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 102383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 102483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 1025c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1026c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1027c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1028c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 1029c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1030fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1031fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 103283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1033892354335d49f0b9fcd10e20e0c13e3cd0f1f1cbRobert Shih int index = 0; 103483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 1035c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 1036c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1039c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1040de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 1041de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1042fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1043fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 1044de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 1045de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1046de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1047de070137f11d346fba77605bd76a44c040a618fcEric Laurent 10486b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 10496b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 1050fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 1051fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 10526b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 10536b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 10546b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 10556b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 1056de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 1057de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1058de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1059de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1060de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 1061de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 1062de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1063de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1064de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1065de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 1066de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1067de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 1068de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 10697c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 1070de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 1071d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 1072de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1073de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 10747c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 1075de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 1076de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 1077de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 1078de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1079de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1080de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1081de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 1082de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1083de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 1084de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 1085de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1086de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1087de070137f11d346fba77605bd76a44c040a618fcEric Laurent 1088db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 1089db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1090db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 1091db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 1092db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 1093db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 1094db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 1095db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 1096eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 1097eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1098fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1099eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 1100ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 1101eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 1102eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 1103eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 1104272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 1105272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1106272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1107272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 1108ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 1109272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 1110272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 1111272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 1112d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 1113d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 1114d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 1115d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 1116d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 1117d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 1118d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 111957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 112057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1121d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 112257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 112374adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 112474adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 112574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 112657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 112774adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent effect_descriptor_t *descriptors = new effect_descriptor_t[count]; 112857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 112957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 113057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 113157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 113257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 113357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 113474adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 113557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 113657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 113757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 113857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 113957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 114057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 114157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 114257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 114357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 1144b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 1145b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 1146b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t info; 1147b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 1148b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 1149b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 1150b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 1151b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1152b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1153203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1154203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1155203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1156203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1157203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 11581d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 11591d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 11601d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1161203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1162203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1163203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 11641d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (ports == NULL) { 11651d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 11661d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 11671d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 11681d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 11691d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1170203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1171203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1172203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1173203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1174203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1175203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1176203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1177203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1178203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1179203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1180203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1181203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1182203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1183203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1184203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1185203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1186203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1187e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1188e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1189e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1190e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1191203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1192203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1193203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1194203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1195203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1196203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1197203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1198203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1199203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1200203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1201203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch patch; 1202203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1203a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1204e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1205e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23912202"); 1206e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1207203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1208203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1209203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1210203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1211203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1212203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1213203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1214203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1215203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1216203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1217203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1218203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1219203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1220203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1221203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1222203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1223203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1224203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1225203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1226203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 12271d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 12281d670b11313250442455a22f1056ad649d607fb2Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 12291d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 1230203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1231203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1232203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1233203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 12341d670b11313250442455a22f1056ad649d607fb2Eric Laurent if (patches == NULL) { 12351d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(NO_MEMORY); 12361d670b11313250442455a22f1056ad649d607fb2Eric Laurent reply->writeInt32(0); 12371d670b11313250442455a22f1056ad649d607fb2Eric Laurent return NO_ERROR; 12381d670b11313250442455a22f1056ad649d607fb2Eric Laurent } 12391d670b11313250442455a22f1056ad649d607fb2Eric Laurent unsigned int generation; 1240203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1241203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1242203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1243203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1244203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1245203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1246203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1247203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1248203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1249203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1250203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1251203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1252203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1253203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1254203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1255203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1256203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port_config config; 1257203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 1258203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1259203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1260203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1261203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1262df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1263b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1264b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1265b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1266b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1267b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1268b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1269b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1270203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1271e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent case SET_AUDIO_PORT_CALLBACK_ENABLED: { 1272e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1273e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent setAudioPortCallbacksEnabled(data.readInt32() == 1); 1274e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent return NO_ERROR; 1275e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent } break; 1276e8726fea8a53bf3474aa3c6deaf2f6c1f565e694Eric Laurent 1277df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1278df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1279df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1280df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1281a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_session_t session = AUDIO_SESSION_NONE; 1282a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE; 1283a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_devices_t device = AUDIO_DEVICE_NONE; 1284df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1285df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1286df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1287df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1288df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1289df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1290df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1291df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1292df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1293df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1294df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1295df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1296df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1297df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1298df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1299df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1300df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1301df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1302df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1303df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1304bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1305bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1306bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1307bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1308bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1309bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1310baac183f3808d7b68f184647a97bd381620415feEric Laurent case REGISTER_POLICY_MIXES: { 1311baac183f3808d7b68f184647a97bd381620415feEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1312baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration = data.readInt32() == 1; 1313baac183f3808d7b68f184647a97bd381620415feEric Laurent Vector<AudioMix> mixes; 1314baac183f3808d7b68f184647a97bd381620415feEric Laurent size_t size = (size_t)data.readInt32(); 1315baac183f3808d7b68f184647a97bd381620415feEric Laurent if (size > MAX_MIXES_PER_POLICY) { 1316baac183f3808d7b68f184647a97bd381620415feEric Laurent size = MAX_MIXES_PER_POLICY; 1317baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1318baac183f3808d7b68f184647a97bd381620415feEric Laurent for (size_t i = 0; i < size; i++) { 1319baac183f3808d7b68f184647a97bd381620415feEric Laurent AudioMix mix; 1320baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { 1321baac183f3808d7b68f184647a97bd381620415feEric Laurent mixes.add(mix); 1322baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1323baac183f3808d7b68f184647a97bd381620415feEric Laurent } 1324baac183f3808d7b68f184647a97bd381620415feEric Laurent status_t status = registerPolicyMixes(mixes, registration); 1325baac183f3808d7b68f184647a97bd381620415feEric Laurent reply->writeInt32(status); 1326baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_ERROR; 1327baac183f3808d7b68f184647a97bd381620415feEric Laurent } break; 1328baac183f3808d7b68f184647a97bd381620415feEric Laurent 1329554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case START_AUDIO_SOURCE: { 1330554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1331554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent struct audio_port_config source; 1332554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&source, sizeof(struct audio_port_config)); 1333554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_attributes_t attributes; 1334554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent data.read(&attributes, sizeof(audio_attributes_t)); 1335e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_io_handle_t handle = {}; 1336554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = startAudioSource(&source, &attributes, &handle); 1337554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1338554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(handle); 1339554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1340554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1341554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 1342554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent case STOP_AUDIO_SOURCE: { 1343554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1344554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t handle = (audio_io_handle_t)data.readInt32(); 1345554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent status_t status = stopAudioSource(handle); 1346554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent reply->writeInt32(status); 1347554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_ERROR; 1348554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } break; 1349554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 13502ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case SET_MASTER_MONO: { 13512ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 13522ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono = static_cast<bool>(data.readInt32()); 13532ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = setMasterMono(mono); 13542ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 13552ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 13562ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 13572ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 13582ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung case GET_MASTER_MONO: { 13592ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung CHECK_INTERFACE(IAudioPolicyService, data, reply); 13602ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung bool mono; 13612ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung status_t status = getMasterMono(&mono); 13622ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(status); 13632ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (status == NO_ERROR) { 13642ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung reply->writeInt32(static_cast<int32_t>(mono)); 13652ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 13662ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_ERROR; 13672ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } break; 13682ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 1369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 137640bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1377