IAudioPolicyService.cpp revision caf7f48a0ef558689d39aafd187c1571ff4128b4
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, 72bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent GET_PHONE_STATE 73c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 74c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 75c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 76c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent BpAudioPolicyService(const sp<IBinder>& impl) 79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 84fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 85fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 93c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 94c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 97fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 98fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 106fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 109f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 118fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 128fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 134fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getOutput( 138fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 14058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 141254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 142ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 143ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 150254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(flags)); 1522301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // hasOffloadInfo 153b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 154b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 155b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 156b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 157b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 158b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 160fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 163e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual status_t getOutputForAttr(const audio_attributes_t *attr, 164e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 165e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 166e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 167e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 168e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 169e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 170e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 171e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 1725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi { 1735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Parcel data, reply; 1745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (attr == NULL) { 176e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr(): NULL audio attributes and stream type"); 178e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 180e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 181e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr unspecified stream type"); 182e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 183e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 184e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 185e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (output == NULL) { 186e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent ALOGE("getOutputForAttr NULL output - shouldn't happen"); 187e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 188e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 189e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr == NULL) { 190e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 191e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 192e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 193e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.write(attr, sizeof(audio_attributes_t)); 194e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(session); 196e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream == NULL) { 197e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(0); 198e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 199e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(1); 200e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32(*stream); 2015bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2025bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(samplingRate); 2035bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(format)); 2045bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(channelMask); 2055bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 2065bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi // hasOffloadInfo 2075bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (offloadInfo == NULL) { 2085bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(0); 2095bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } else { 2105bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(1); 2115bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.write(offloadInfo, sizeof(audio_offload_info_t)); 2125bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 213e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 214e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 215e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 216e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 217e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status = (status_t)reply.readInt32(); 218e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (status != NO_ERROR) { 219e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 220e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 221e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (stream != NULL) { 223e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *stream = (audio_stream_type_t)reply.readInt32(); 224e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return status; 2265bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 2275bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 228de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 229fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 230e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 231c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 232c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 233c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 234fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 235fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 236e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 237c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 238c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 239c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 240c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 241de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 242fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 243e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 244c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 247fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 248fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 249e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 254e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent virtual void releaseOutput(audio_io_handle_t output, 255e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 256e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 259c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 260fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 261e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)stream); 262e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)session); 263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 266caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent virtual status_t getInputForAttr(const audio_attributes_t *attr, 267caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 268caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 269caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 270caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 271caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 272caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_input_flags_t flags) 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 276caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr == NULL) { 277caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL attr - shouldn't happen"); 278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 279caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 280caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (input == NULL) { 281caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGE("getInputForAttr NULL input - shouldn't happen"); 282caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.write(attr, sizeof(audio_attributes_t)); 285caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.writeInt32(session); 286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 288254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 289b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 290caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 291caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 292caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 293caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 294caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status = reply.readInt32(); 295caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status != NO_ERROR) { 296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return status; 297caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 298caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent *input = (audio_io_handle_t)reply.readInt32(); 299caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3024dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 3034dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 307fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3084dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 309c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3134dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 3144dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 318fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3194dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3244dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 3254dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 329fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3304dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 334fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 34783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 34883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 34983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 35583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 36083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 36183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 36283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 36783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 36883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 374de070137f11d346fba77605bd76a44c040a618fcEric Laurent 375fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 376de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 377de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 378de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 379de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 380de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 381de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 382de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 383de070137f11d346fba77605bd76a44c040a618fcEric Laurent 3846374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 3856b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 3866b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 3876b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 3886b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 3896b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 3906374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 3916b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 3926b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 39358e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 394de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 395de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 396de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 397de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 398de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 399de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 400de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 401de070137f11d346fba77605bd76a44c040a618fcEric Laurent 40258e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 4037c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 404de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 405de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session, 406de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 407de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 408de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 409de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 410de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 4117c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 412de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 413de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 414de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 415de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 416de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 417de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 418de070137f11d346fba77605bd76a44c040a618fcEric Laurent 419de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 420de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 421de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 422de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 423de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 424de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 425de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 426de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 427de070137f11d346fba77605bd76a44c040a618fcEric Laurent 428db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 429db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 430db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 431db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 432db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 433db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 434db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 435db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 436db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 437db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 438fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 439eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 440eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 441eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 442fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 443eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 444eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 445eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 446eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 44757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 448272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 449272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 450272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 451272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 452272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 453272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 454272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 455272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 456272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 457272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 458d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 459d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 460d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 461d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 462d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 463d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 464d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 465d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 466d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 46757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent virtual status_t queryDefaultPreProcessing(int audioSession, 46857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 46957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 47057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 47157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 47257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 47357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 47457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 47557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 47657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 47757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 47857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 47957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 48057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 48157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 48257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 48357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 48457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 48557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 48657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 48757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 48857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 48957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 49057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 491ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 492ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 493ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 494b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 495b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 496b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 497b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 498203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 499203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 500203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 501203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 502203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 503203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 504203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 505203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 506203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 507203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 508203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 509203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 510203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 511203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 512203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 611203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 612203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 614203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 615203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 619203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 620203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 622203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 625df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 626b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 627b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 628b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 629b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 630b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeStrongBinder(client->asBinder()); 631b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 632b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 633df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 634df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 635df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 636df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 637df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 638df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 639df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 640df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 641df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 642df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 643df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 644df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 645df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 646df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 647df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 648df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 650df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 651df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 652df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 653df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 654df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 655df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 656df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 657df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 663df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 667bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 668bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 669bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 670bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 671bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 672bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 673bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 674bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 675bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 676bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 677bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 678c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 679c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 682c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 683c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 684c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 685c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 686c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 687c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 688e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 691fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 692fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 693fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 694fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 695c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 696de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 697de070137f11d346fba77605bd76a44c040a618fcEric Laurent state, 698de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 699c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 700c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 701c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 704fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 705fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 706c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 707de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 708de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 711c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 713c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 71485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 71585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 716c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 717c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 718c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 72185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 72285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 723fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 724fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 726c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 727c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 730c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 73185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 73285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 733c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 734c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 735c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 736c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 737c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 738c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 739fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 740fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 741c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 74258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 743254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 7440ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 7450ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 746b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 747b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 748b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 749b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 750b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 751c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 752c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 753c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 754254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 755b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 756b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 757fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 758c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 759c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 760c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 7615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 7625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 76385f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten audio_attributes_t attr; 764e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 765e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 766e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 767e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 768e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 769e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 770e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 771e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 772e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 773e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 7745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate = data.readInt32(); 7755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format = (audio_format_t) data.readInt32(); 7765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask = data.readInt32(); 7775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 7785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 7795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi bool hasOffloadInfo = data.readInt32() != 0; 7805bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_offload_info_t offloadInfo; 7815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (hasOffloadInfo) { 7825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(&offloadInfo, sizeof(audio_offload_info_t)); 7835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 784e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t output; 785e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 786e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent &output, session, &stream, 787e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent samplingRate, format, channelMask, 788e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent flags, hasOffloadInfo ? &offloadInfo : NULL); 789e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 790e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 791e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 7925bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 7935bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 7945bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 795c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 796c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 797fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 798ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 799ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 800e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 801de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 802ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 803de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 805c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 806c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 808c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 809fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 810ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 811ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 812e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 813de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 814ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 815de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 816c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 817c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 818c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 819c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 821fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 822e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 823e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 824e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 825c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 826c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 828caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent case GET_INPUT_FOR_ATTR: { 829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 830caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_attributes_t attr; 831caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent data.read(&attr, sizeof(audio_attributes_t)); 832caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 83458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 835254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 836b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 837caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t input; 838caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = getInputForAttr(&attr, &input, session, 839caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent samplingRate, format, channelMask, 840caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent flags); 841caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(status); 842caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (status == NO_ERROR) { 843caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent reply->writeInt32(input); 844caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent } 845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 848c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 850fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 8514dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 8524dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 858fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 8594dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 8604dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 865c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 866fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 8674dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 8684dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 870c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 871c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 874fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 875fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 877c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 878c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 879c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 884fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 885fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 88783844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 88883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 88983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 89083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 894c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 896fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 897fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 89883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 899c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index; 90083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 901c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 902c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 906de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 907de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 908fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 909fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 910de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 911de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 912de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 913de070137f11d346fba77605bd76a44c040a618fcEric Laurent 9146b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 9156b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 916fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 917fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 9186b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 9196b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 9206b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 9216b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 922de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 923de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 924de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 925de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 926de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 927de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 928de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 929de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 930de070137f11d346fba77605bd76a44c040a618fcEric Laurent 931de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 932de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 933de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 934de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 9357c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 936de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 937de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 938de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 939de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 9407c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 941de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 942de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 943de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 944de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 945de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 946de070137f11d346fba77605bd76a44c040a618fcEric Laurent 947de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 948de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 949de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 950de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 951de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 952de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 953de070137f11d346fba77605bd76a44c040a618fcEric Laurent 954db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 955db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 956db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 957db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 958db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 959db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 960db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 961db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 962eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 963eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 964fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 965eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 966ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 967eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 968eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 969eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 970272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 971272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 972272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 973272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 974ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 975272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 976272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 977272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 978d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 979d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 980d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 981d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 982d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 983d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 984d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 98557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 98657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 98757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent int audioSession = data.readInt32(); 98857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 98974adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 99074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 99174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 99257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 99374adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent effect_descriptor_t *descriptors = new effect_descriptor_t[count]; 99457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 99557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 99657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 99757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 99857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 99957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 100074adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 100157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 100257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 100357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 100457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 100557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 100657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 100757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 100857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 100957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 1010b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 1011b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 1012b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t info; 1013b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 1014b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 1015b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 1016b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 1017b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1018b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1019203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1020203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1021203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1022203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1023203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 1024203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1025203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int generation; 1026203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1027203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 1028203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1029203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1030203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1031203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1032203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1033203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1034203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1035203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1036203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1037203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1038203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1039203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1040203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1041203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1042203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1043203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1044203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1045203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port port; 1046203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&port, sizeof(struct audio_port)); 1047203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1048203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1049203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1050203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1051203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1052203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1053203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1054203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1055203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1056203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1057203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch patch; 1058203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1059203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1060203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1061203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1062203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1063203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1064203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1065203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1066203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1067203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1068203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1069203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1070203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1071203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1072203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1073203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1074203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1075203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1076203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1077203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1078203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1079203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1080203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 1081203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1082203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int generation; 1083203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1084203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1085203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 1086203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1087203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1088203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1089203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1090203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1091203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1092203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1093203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1094203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1095203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1096203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1097203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1098203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1099203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1100203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1101203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1102203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port_config config; 1103203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 1104203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1105203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1106203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1107203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1108df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1109b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1110b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1111b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1112b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1113b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1114b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1115b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1116203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1117df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1118df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1119df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1120df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1121df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session; 1122df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t ioHandle; 1123df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t device; 1124df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1125df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1126df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1127df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1128df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1129df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1130df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1131df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1132df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1133df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1134df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1135df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1136df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1137df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1138df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1139df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1140df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1141df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1142df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1143df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1144bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1145bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1146bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1147bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1148bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1149bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; // namespace android 1158