IAudioPolicyService.cpp revision e83b55dc29ca16092ba02f36f55fa6e0e37fd78c
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, 44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_INPUT, 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 266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getInput( 267eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten audio_source_t inputSource, 268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 26958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 270254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 271e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t audioSession, 272b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags) 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 276eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten data.writeInt32((int32_t) inputSource); 277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 279254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 280e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.writeInt32((int32_t)audioSession); 281b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 282c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUT, data, &reply); 283fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 284c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 285c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2864dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 2874dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 289c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 290c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 291fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 2924dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 294c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2974dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 2984dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 302fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3034dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 3084dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 3094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 313fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 3144dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 318fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 33183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 33283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 33383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 33983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 34483844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 34583844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 34683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 35183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 35283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 358de070137f11d346fba77605bd76a44c040a618fcEric Laurent 359fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 360de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 361de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 362de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 363de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 364de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 365de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 366de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 367de070137f11d346fba77605bd76a44c040a618fcEric Laurent 3686374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 3696b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 3706b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 3716b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 3726b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 3736b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 3746374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 3756b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 3766b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 37758e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 378de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 379de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 380de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 381de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 382de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 383de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 384de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 385de070137f11d346fba77605bd76a44c040a618fcEric Laurent 38658e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 3877c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 388de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 389de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session, 390de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 391de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 392de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 393de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 394de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 3957c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 396de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 397de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 398de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 399de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 400de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 401de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 402de070137f11d346fba77605bd76a44c040a618fcEric Laurent 403de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 404de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 405de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 406de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 407de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 408de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 409de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 410de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 411de070137f11d346fba77605bd76a44c040a618fcEric Laurent 412db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 413db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 414db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 415db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 416db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 417db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 418db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 419db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 420db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 421db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 422fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 423eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 424eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 425eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 426fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 427eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 428eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 429eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 430eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 43157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 432272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 433272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 434272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 435272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 436272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 437272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 438272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 439272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 440272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 441272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 442d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 443d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 444d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 445d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 446d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 447d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 448d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 449d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 450d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 45157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent virtual status_t queryDefaultPreProcessing(int audioSession, 45257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 45357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 45457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 45557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 45657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 45757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 45857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 45957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 46057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 46157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 46257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 46357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 46457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 46557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 46657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 46757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 46857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 46957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 47057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 47157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 47257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 47357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 47457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 475ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 476ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 477ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 478b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 479b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 480b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 481b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 482203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 483203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 484203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 485203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 486203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 487203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 488203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 489203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 490203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 491203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 492203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 493203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 494203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 495203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 496203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 497203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 498203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 499203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 500203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 501203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 502203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 503203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 504203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 505203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 506203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 507203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 508203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 509203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 510203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 511203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 512203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 566203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 567203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 569203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 570203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 572203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 573203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 574203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 575203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 576203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 577203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 580203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 582203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 583203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 584203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 585203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 586203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 587203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 590203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 591203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 593203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 594203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 595203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 596203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 597203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 598203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 601203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 604203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 606203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 607203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 608203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 609df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 610b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 611b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 612b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 613b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 614b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeStrongBinder(client->asBinder()); 615b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 616b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 617df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 618df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t acquireSoundTriggerSession(audio_session_t *session, 619df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 620df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 621df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 622df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (session == NULL || ioHandle == NULL || device == NULL) { 623df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return BAD_VALUE; 624df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 625df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 626df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 627df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 628df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 629df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 630df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 631df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status = (status_t)reply.readInt32(); 632df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 633df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *session = (audio_session_t)reply.readInt32(); 634df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *ioHandle = (audio_io_handle_t)reply.readInt32(); 635df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent *device = (audio_devices_t)reply.readInt32(); 636df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 637df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 638df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 639df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 640df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent virtual status_t releaseSoundTriggerSession(audio_session_t session) 641df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent { 642df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent Parcel data, reply; 643df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 644df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.writeInt32(session); 645df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 646df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status != NO_ERROR) { 647df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return status; 648df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return (status_t)reply.readInt32(); 650df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 651bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 652bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent virtual audio_mode_t getPhoneState() 653bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent { 654bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Parcel data, reply; 655bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 656bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 657bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent if (status != NO_ERROR) { 658bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return AUDIO_MODE_INVALID; 659bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 660bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return (audio_mode_t)reply.readInt32(); 661bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } 662c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 663c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 664c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 665c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 666c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 667c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 668c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 669c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 670c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 671c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 672e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 673c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 674c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 675fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 676fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 677fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 678fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 679c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 680de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 681de070137f11d346fba77605bd76a44c040a618fcEric Laurent state, 682de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 683c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 684c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 685c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 686c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 687c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 688fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 689fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 691de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 692de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 693c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 694c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 695c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 696c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 697c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 69885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 69985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 700c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 701c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 704c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 70585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 70685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 707fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 708fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 711c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 713c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 714c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 71585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 71685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 717c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 718c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 722c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 723fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 724fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 72658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 727254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 7280ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 7290ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 730b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 731b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 732b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 733b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 734b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 735c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 736c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 737c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 738254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 739b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 740b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 741fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 742c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 743c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 744c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 7455bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 7465bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 74785f480e7fd7c5e70c91d2f205b5c49488a84eb4dGlenn Kasten audio_attributes_t attr; 748e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasAttributes = data.readInt32() != 0; 749e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasAttributes) { 750e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent data.read(&attr, sizeof(audio_attributes_t)); 751e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 752e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 753e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 754e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent bool hasStream = data.readInt32() != 0; 755e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (hasStream) { 756e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent stream = (audio_stream_type_t)data.readInt32(); 757e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 7585bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate = data.readInt32(); 7595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format = (audio_format_t) data.readInt32(); 7605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask = data.readInt32(); 7615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 7625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 7635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi bool hasOffloadInfo = data.readInt32() != 0; 7645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_offload_info_t offloadInfo; 7655bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (hasOffloadInfo) { 7665bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(&offloadInfo, sizeof(audio_offload_info_t)); 7675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 768e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t output; 769e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent status_t status = getOutputForAttr(hasAttributes ? &attr : NULL, 770e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent &output, session, &stream, 771e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent samplingRate, format, channelMask, 772e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent flags, hasOffloadInfo ? &offloadInfo : NULL); 773e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(status); 774e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(output); 775e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent reply->writeInt32(stream); 7765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 7775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 7785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 779c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 780c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 781fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 782ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 783ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 784e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 785de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 786ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 787de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 788c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 789c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 790c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 791c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 792c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 793fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 794ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 795ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 796e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 797de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 798ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 799de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 800c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 801c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 802c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 803c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 805fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 806e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream = (audio_stream_type_t)data.readInt32(); 807e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 808e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent releaseOutput(output, stream, session); 809c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 810c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 811c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_INPUT: { 813c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 814eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten audio_source_t inputSource = (audio_source_t) data.readInt32(); 815c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 81658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 817254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 818e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t audioSession = (audio_session_t)data.readInt32(); 819b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t input = getInput(inputSource, 821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 822c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 823254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 824b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audioSession, 825b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten flags); 826fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(input)); 827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 830c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 832fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 8334dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 8344dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 836c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 839c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 840fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 8414dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 8424dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 843c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 844c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 847c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 848fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 8494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 8504dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 852c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 856fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 857fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 858c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 859c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 860c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 865c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 866fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 867fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 86983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 87083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 87183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 87283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 877c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 878fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 879fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 88083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index; 88283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 884c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 888de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 889de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 890fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 891fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 892de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 893de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 894de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 895de070137f11d346fba77605bd76a44c040a618fcEric Laurent 8966b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 8976b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 898fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 899fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 9006b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 9016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 9026b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 9036b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 904de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 905de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 906de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 907de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 908de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 909de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 910de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 911de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 912de070137f11d346fba77605bd76a44c040a618fcEric Laurent 913de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 914de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 915de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 916de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 9177c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 918de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 919de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 920de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 921de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 9227c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 923de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 924de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 925de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 926de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 927de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 928de070137f11d346fba77605bd76a44c040a618fcEric Laurent 929de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 930de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 931de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 932de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 933de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 934de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 935de070137f11d346fba77605bd76a44c040a618fcEric Laurent 936db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 937db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 938db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 939db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 940db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 941db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 942db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 943db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 944eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 945eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 946fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 947eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 948ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 949eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 950eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 951eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 952272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 953272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 954272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 955272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 956ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 957272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 958272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 959272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 960d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 961d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 962d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 963d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 964d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 965d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 966d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 96757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 96857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 96957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent int audioSession = data.readInt32(); 97057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 97174adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (count > AudioEffect::kMaxPreProcessing) { 97274adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent count = AudioEffect::kMaxPreProcessing; 97374adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent } 97457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 97574adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent effect_descriptor_t *descriptors = new effect_descriptor_t[count]; 97657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 97757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 97857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 97957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 98057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 98157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 98274adca9ad30b7f8a70d40c5237bade0d16c4ea58Eric Laurent if (retCount != 0) { 98357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 98457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 98557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 98657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 98757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 98857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 98957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 99057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 99157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 992b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 993b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 994b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t info; 995b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 996b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 997b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 998b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 999b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 1000b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 1001203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 1002203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1003203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1004203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1005203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 1006203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 1007203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int generation; 1008203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 1009203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 1010203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1011203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1012203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 1013203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1014203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1015203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 1016203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 1017203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1018203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1019203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1020203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1021203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 1022203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1023203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1024203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1025203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 1026203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1027203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port port; 1028203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&port, sizeof(struct audio_port)); 1029203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 1030203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1031203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1032203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 1033203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1034203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1035203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1036203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1037203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 1038203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1039203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch patch; 1040203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1041203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1042203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1043203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 1044203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1045203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1046203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 1047203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1048203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1049203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1050203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1051203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 1052203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1053203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 1054203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 1055203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 1056203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1057203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1058203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1059203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1060203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 1061203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1062203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 1063203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 1064203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int generation; 1065203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 1066203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 1067203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 1068203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 1069203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1070203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 1071203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 1072203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 1073203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 1074203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1075203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1076203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 1077203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1078203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 1079203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1080203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1081203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1082203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 1083203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1084203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port_config config; 1085203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 1086203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 1087203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 1088203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 1089203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 1090df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1091b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 1092b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1093b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1094b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 1095b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 1096b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 1097b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 1098203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 1099df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case ACQUIRE_SOUNDTRIGGER_SESSION: { 1100df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1101df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1102df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1103df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session; 1104df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t ioHandle; 1105df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t device; 1106df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1107df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1108df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (status == NO_ERROR) { 1109df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(session); 1110df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(ioHandle); 1111df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(device); 1112df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 1113df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1114df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1115df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1116df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent case RELEASE_SOUNDTRIGGER_SESSION: { 1117df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1118df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1119df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent data.readStrongBinder()); 1120df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_session_t session = (audio_session_t)data.readInt32(); 1121df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent status_t status = releaseSoundTriggerSession(session); 1122df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent reply->writeInt32(status); 1123df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_ERROR; 1124df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } break; 1125df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 1126bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent case GET_PHONE_STATE: { 1127bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 1128bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent reply->writeInt32((int32_t)getPhoneState()); 1129bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return NO_ERROR; 1130bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent } break; 1131bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 1132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; // namespace android 1140