IAudioPolicyService.cpp revision 4dc680607181e6a76f4e91a39366c4f5dfb7b03e
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 26c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent#include <media/IAudioPolicyService.h> 27c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2864760240f931714858a59c1579f07264d7182ba2Dima Zavin#include <system/audio.h> 29fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 30c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentnamespace android { 31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 32c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentenum { 33c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION, 34c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_DEVICE_CONNECTION_STATE, 35c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PHONE_STATE, 360b07b8085d7b837b4dd5f09e0c8c39408f6bdbf7Glenn Kasten SET_RINGER_MODE, // reserved, no longer used 37c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_FORCE_USE, 38c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_FORCE_USE, 39c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_OUTPUT, 40c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_OUTPUT, 41c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_OUTPUT, 42c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_OUTPUT, 43c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_INPUT, 44c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent START_INPUT, 45c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent STOP_INPUT, 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RELEASE_INPUT, 47c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent INIT_STREAM_VOLUME, 48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_STREAM_VOLUME, 49de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STREAM_VOLUME, 50de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_STRATEGY_FOR_STREAM, 51de070137f11d346fba77605bd76a44c040a618fcEric Laurent GET_OUTPUT_FOR_EFFECT, 52de070137f11d346fba77605bd76a44c040a618fcEric Laurent REGISTER_EFFECT, 53eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent UNREGISTER_EFFECT, 546b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten IS_STREAM_ACTIVE, 55d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi IS_SOURCE_ACTIVE, 566b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten GET_DEVICES_FOR_STREAM, 57db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent QUERY_DEFAULT_PRE_PROCESSING, 58272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi SET_EFFECT_ENABLED, 59ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald IS_STREAM_ACTIVE_REMOTELY, 60203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent IS_OFFLOAD_SUPPORTED, 61203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PORTS, 62203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent GET_AUDIO_PORT, 63203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CREATE_AUDIO_PATCH, 64203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent RELEASE_AUDIO_PATCH, 65203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent LIST_AUDIO_PATCHES, 66b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent SET_AUDIO_PORT_CONFIG, 675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi REGISTER_CLIENT, 685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi GET_OUTPUT_FOR_ATTR 69c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 70c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 71c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass BpAudioPolicyService : public BpInterface<IAudioPolicyService> 72c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 73c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentpublic: 74c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent BpAudioPolicyService(const sp<IBinder>& impl) 75c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent : BpInterface<IAudioPolicyService>(impl) 76c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setDeviceConnectionState( 80fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 81fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state, 82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(state)); 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 91c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 92c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 93fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_dev_state_t getDeviceConnectionState( 94fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device, 95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address) 96c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 97c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 98c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 99c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(device)); 100c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeCString(device_address); 101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 102fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 105f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setPhoneState(audio_mode_t state) 106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PHONE_STATE, data, &reply); 111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 112c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 114fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 119c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(config)); 120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_FORCE_USE, data, &reply); 121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 124fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(usage)); 129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_FORCE_USE, data, &reply); 130fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getOutput( 134fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 13658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 137254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 138ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 139ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 146254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(flags)); 1482301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // hasOffloadInfo 149b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 150b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 151b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 152b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 153b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 154b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_OUTPUT, data, &reply); 156fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi virtual audio_io_handle_t getOutputForAttr( 1605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi const audio_attributes_t *attr, 1615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate, 1625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format, 1635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask, 1645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags, 1655bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi const audio_offload_info_t *offloadInfo) 1665bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi { 1675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Parcel data, reply; 1685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (attr == NULL) { 1705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi ALOGE("Writing NULL audio attributes - shouldn't happen"); 1715bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return (audio_io_handle_t) 0; 1725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 1735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.write(attr, sizeof(audio_attributes_t)); 1745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(samplingRate); 1755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(format)); 1765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(channelMask); 1775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(static_cast <uint32_t>(flags)); 1785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi // hasOffloadInfo 1795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (offloadInfo == NULL) { 1805bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(0); 1815bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } else { 1825bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.writeInt32(1); 1835bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.write(offloadInfo, sizeof(audio_offload_info_t)); 1845bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 1855bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 1865bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return static_cast <audio_io_handle_t> (reply.readInt32()); 1875bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 1885bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 189de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t startOutput(audio_io_handle_t output, 190fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 191de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session) 192c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 193c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 194c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 195fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 196fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 197de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 198c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_OUTPUT, data, &reply); 199c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 200c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 201c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 202de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t stopOutput(audio_io_handle_t output, 203fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream, 204de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session) 205c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 206c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 207c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 208fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 209fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 210de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 211c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_OUTPUT, data, &reply); 212c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 213c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 214c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 215c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void releaseOutput(audio_io_handle_t output) 216c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 217c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 218c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 219fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 220c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_OUTPUT, data, &reply); 221c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 222c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 223c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual audio_io_handle_t getInput( 224eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten audio_source_t inputSource, 225c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate, 22658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 227254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask, 228b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten int audioSession, 229b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags) 230c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 231c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 232c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 233eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten data.writeInt32((int32_t) inputSource); 234c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 235c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(format)); 236254af180475346b6186b49c297f340c9c4817511Glenn Kasten data.writeInt32(channelMask); 2377c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(audioSession); 238b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten data.writeInt32(flags); 239c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUT, data, &reply); 240fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 241c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 242c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2434dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t startInput(audio_io_handle_t input, 2444dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 245c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 246c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 247c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 248fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 2494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 250c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(START_INPUT, data, &reply); 251c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 252c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2544dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual status_t stopInput(audio_io_handle_t input, 2554dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 256c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 257c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 259fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 2604dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 261c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STOP_INPUT, data, &reply); 262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 263c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 264c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 2654dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent virtual void releaseInput(audio_io_handle_t input, 2664dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 267c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 268c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 269c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 270fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 2714dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent data.writeInt32(session); 272c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RELEASE_INPUT, data, &reply); 273c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 275fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual status_t initStreamVolume(audio_stream_type_t stream, 276c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin, 277c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax) 278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 280c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 281c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 282c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMin); 283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(indexMax); 284c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(INIT_STREAM_VOLUME, data, &reply); 285c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 286c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 28883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 28983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int index, 29083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 294c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(index); 29683844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 298c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 30183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 30283844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent int *index, 30383844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device) 304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 30883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent data.writeInt32(static_cast <uint32_t>(device)); 30983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent 310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_STREAM_VOLUME, data, &reply); 311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int lIndex = reply.readInt32(); 312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (index) *index = lIndex; 313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return static_cast <status_t> (reply.readInt32()); 314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 315de070137f11d346fba77605bd76a44c040a618fcEric Laurent 316fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 317de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 318de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 319de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 320de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(static_cast <uint32_t>(stream)); 321de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 322de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 323de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 324de070137f11d346fba77605bd76a44c040a618fcEric Laurent 3256374252107fd6539397598195ea6defd5870fafbEric Laurent virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 3266b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten { 3276b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten Parcel data, reply; 3286b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 3296b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten data.writeInt32(static_cast <uint32_t>(stream)); 3306b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 3316374252107fd6539397598195ea6defd5870fafbEric Laurent return (audio_devices_t) reply.readInt32(); 3326b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } 3336b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 33458e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 335de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 336de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 337de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 338de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 339de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 340de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <audio_io_handle_t> (reply.readInt32()); 341de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 342de070137f11d346fba77605bd76a44c040a618fcEric Laurent 34358e5aa34f01d663654d8bafad65db1dda42161ffGlenn Kasten virtual status_t registerEffect(const effect_descriptor_t *desc, 3447c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io, 345de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy, 346de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session, 347de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id) 348de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 349de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 350de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 351de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.write(desc, sizeof(effect_descriptor_t)); 3527c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent data.writeInt32(io); 353de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(strategy); 354de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 355de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 356de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(REGISTER_EFFECT, data, &reply); 357de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 358de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 359de070137f11d346fba77605bd76a44c040a618fcEric Laurent 360de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t unregisterEffect(int id) 361de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 362de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 363de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 364de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(id); 365de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(UNREGISTER_EFFECT, data, &reply); 366de070137f11d346fba77605bd76a44c040a618fcEric Laurent return static_cast <status_t> (reply.readInt32()); 367de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 368de070137f11d346fba77605bd76a44c040a618fcEric Laurent 369db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent virtual status_t setEffectEnabled(int id, bool enabled) 370db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent { 371db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent Parcel data, reply; 372db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 373db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(id); 374db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent data.writeInt32(enabled); 375db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent remote()->transact(SET_EFFECT_ENABLED, data, &reply); 376db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return static_cast <status_t> (reply.readInt32()); 377db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } 378db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 379fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 380eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent { 381eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent Parcel data, reply; 382eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 383fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 384eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent data.writeInt32(inPastMs); 385eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 386eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return reply.readInt32(); 387eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } 38857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 389272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 390272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi { 391272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi Parcel data, reply; 392272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 393272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32((int32_t) stream); 394272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi data.writeInt32(inPastMs); 395272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 396272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return reply.readInt32(); 397272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } 398272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 399d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi virtual bool isSourceActive(audio_source_t source) const 400d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi { 401d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi Parcel data, reply; 402d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 403d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi data.writeInt32((int32_t) source); 404d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 405d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return reply.readInt32(); 406d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 407d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 40857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent virtual status_t queryDefaultPreProcessing(int audioSession, 40957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors, 41057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t *count) 41157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent { 41257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (descriptors == NULL || count == NULL) { 41357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return BAD_VALUE; 41457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 41557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent Parcel data, reply; 41657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 41757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(audioSession); 41857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent data.writeInt32(*count); 41957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 42057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR) { 42157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 42257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 42357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status = static_cast <status_t> (reply.readInt32()); 42457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = reply.readInt32(); 42557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount != 0) { 42657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t numDesc = (retCount < *count) ? retCount : *count; 42757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 42857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 42957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent *count = retCount; 43057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 43157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 432ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald 433ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald virtual bool isOffloadSupported(const audio_offload_info_t& info) 434ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald { 435b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald Parcel data, reply; 436b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 437b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(&info, sizeof(audio_offload_info_t)); 438b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 439203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return reply.readInt32(); 440203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 441203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 442203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPorts(audio_port_role_t role, 443203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type, 444203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 445203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports, 446203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 447203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 448203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 449203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 450203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 451203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 452203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 453203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 454203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 455203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(role); 456203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(type); 457203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPortsReq); 458203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 459203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 460203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 461203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_ports = (unsigned int)reply.readInt32(); 462203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 463203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 464203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > *num_ports) { 465203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = *num_ports; 466203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 467203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > 0) { 468203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(ports, numPortsReq * sizeof(struct audio_port)); 469203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 470203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 471203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 472203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 473203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 474203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 475203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t getAudioPort(struct audio_port *port) 476203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 477203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (port == NULL) { 478203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 479203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 480203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 481203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 482203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(port, sizeof(struct audio_port)); 483203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 484203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 485203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 486203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 487203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 488203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(port, sizeof(struct audio_port)); 489203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 490203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 491203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 492203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 493203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t *handle) 494203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 495203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (patch == NULL || handle == NULL) { 496203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 497203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 498203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 499203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 500203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(patch, sizeof(struct audio_patch)); 501203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 502203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 503203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR || 504203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 505203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 506203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 507203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 508203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 509203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 510203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 511203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 512203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 513203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 514203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 515203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 516203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 517203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 518203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 519203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 520203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 521203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 522203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 523203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 524203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches, 525203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *generation) 526203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 527203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 528203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent generation == NULL) { 529203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 530203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 531203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 532203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 533203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 534203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInt32(numPatchesReq); 535203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 536203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 537203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 538203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *num_patches = (unsigned int)reply.readInt32(); 539203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 540203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 541203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > *num_patches) { 542203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = *num_patches; 543203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 544203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > 0) { 545203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 546203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 547203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent *generation = reply.readInt32(); 548203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 549203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 550203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 551203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 552203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 553203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent { 554203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (config == NULL) { 555203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return BAD_VALUE; 556203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 557203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent Parcel data, reply; 558203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 559203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.write(config, sizeof(struct audio_port_config)); 560203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 561203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status != NO_ERROR) { 562203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status = (status_t)reply.readInt32(); 563203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 564203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return status; 565203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 566b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 567b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent { 568b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent Parcel data, reply; 569b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 570b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.writeStrongBinder(client->asBinder()); 571b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 572b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } 573c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; 574c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 575c2f1f07084818942352c6bbfb36af9b6b330eb4eEric LaurentIMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 576c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 577c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------- 578c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 579c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 580c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentstatus_t BnAudioPolicyService::onTransact( 581c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 582c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent{ 583e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 584c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_DEVICE_CONNECTION_STATE: { 585c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 586fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 587fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_devices_t>(data.readInt32()); 588fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_dev_state_t state = 589fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_dev_state_t>(data.readInt32()); 590c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 591de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 592de070137f11d346fba77605bd76a44c040a618fcEric Laurent state, 593de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 594c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 595c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 596c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 597c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_DEVICE_CONNECTION_STATE: { 598c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 599fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_devices_t device = 600fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast<audio_devices_t> (data.readInt32()); 601c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent const char *device_address = data.readCString(); 602de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 603de070137f11d346fba77605bd76a44c040a618fcEric Laurent device_address))); 604c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 605c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 606c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 607c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PHONE_STATE: { 608c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 60985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten reply->writeInt32(static_cast <uint32_t>(setPhoneState( 61085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten (audio_mode_t) data.readInt32()))); 611c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 612c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 613c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 614c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_FORCE_USE: { 615c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 61685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 61785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 618fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_policy_forced_cfg_t config = 619fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 620c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 621c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 622c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 623c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 624c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_FORCE_USE: { 625c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 62685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 62785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readInt32()); 628c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 629c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 630c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 631c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 632c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_OUTPUT: { 633c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 634fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 635fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 636c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 63758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 638254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 6390ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = 6400ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent static_cast <audio_output_flags_t>(data.readInt32()); 641b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 642b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 643b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 644b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 645b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 646c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output = getOutput(stream, 647c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 648c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 649254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 650b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 651b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 652fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(output)); 653c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 654c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 655c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 6565bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi case GET_OUTPUT_FOR_ATTR: { 6575bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 6585bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_attributes_t *attr = (audio_attributes_t *) calloc(1, sizeof(audio_attributes_t)); 6595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(attr, sizeof(audio_attributes_t)); 6605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi uint32_t samplingRate = data.readInt32(); 6615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_format_t format = (audio_format_t) data.readInt32(); 6625bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_channel_mask_t channelMask = data.readInt32(); 6635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_output_flags_t flags = 6645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi static_cast <audio_output_flags_t>(data.readInt32()); 6655bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi bool hasOffloadInfo = data.readInt32() != 0; 6665bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_offload_info_t offloadInfo; 6675bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (hasOffloadInfo) { 6685bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi data.read(&offloadInfo, sizeof(audio_offload_info_t)); 6695bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 6705bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi audio_io_handle_t output = getOutputForAttr(attr, 6715bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi samplingRate, 6725bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi format, 6735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi channelMask, 6745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi flags, 6755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi hasOffloadInfo ? &offloadInfo : NULL); 6765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi reply->writeInt32(static_cast <int>(output)); 6775bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi return NO_ERROR; 6785bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } break; 6795bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_OUTPUT: { 681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 682fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 683ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 684ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 685de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 686de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(startOutput(output, 687ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 688de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 691c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 692c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_OUTPUT: { 693c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 694fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 695ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent audio_stream_type_t stream = 696ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent static_cast <audio_stream_type_t>(data.readInt32()); 697de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 698de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 699ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent stream, 700de070137f11d346fba77605bd76a44c040a618fcEric Laurent session))); 701c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 704c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_OUTPUT: { 705c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 706fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 707c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent releaseOutput(output); 708c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 711c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_INPUT: { 712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 713eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten audio_source_t inputSource = (audio_source_t) data.readInt32(); 714c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 71558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 716254af180475346b6186b49c297f340c9c4817511Glenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 7177c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent int audioSession = data.readInt32(); 718b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t input = getInput(inputSource, 720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate, 721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format, 722254af180475346b6186b49c297f340c9c4817511Glenn Kasten channelMask, 723b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten audioSession, 724b3b1660ecb67f61f9da54efced8677fa3a6f4863Glenn Kasten flags); 725fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(static_cast <int>(input)); 726c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 727c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case START_INPUT: { 730c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 731fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 7324dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 7334dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(startInput(input, session))); 734c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 735c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 736c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 737c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case STOP_INPUT: { 738c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 739fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 7404dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 7414dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent reply->writeInt32(static_cast <uint32_t>(stopInput(input, session))); 742c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 743c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 744c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 745c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RELEASE_INPUT: { 746c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 747fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 7484dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session = static_cast <audio_session_t>(data.readInt32()); 7494dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent releaseInput(input, session); 750c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 751c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 752c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 753c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case INIT_STREAM_VOLUME: { 754c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 755fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 756fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 757c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMin = data.readInt32(); 758c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int indexMax = data.readInt32(); 759c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 760c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 761c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 762c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 763c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_VOLUME: { 764c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 765fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 766fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 767c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index = data.readInt32(); 76883844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 76983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 77083844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent index, 77183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent device))); 772c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 773c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 774c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 775c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_STREAM_VOLUME: { 776c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 777fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 778fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 77983844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 780c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int index; 78183844cc2f95dc279015b47fd1e18c7cb4eabe9a1Eric Laurent status_t status = getStreamVolumeIndex(stream, &index, device); 782c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(index); 783c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(static_cast <uint32_t>(status)); 784c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 785c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 786c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 787de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_STRATEGY_FOR_STREAM: { 788de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 789fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 790fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 791de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(getStrategyForStream(stream)); 792de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 793de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 794de070137f11d346fba77605bd76a44c040a618fcEric Laurent 7956b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten case GET_DEVICES_FOR_STREAM: { 7966b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten CHECK_INTERFACE(IAudioPolicyService, data, reply); 797fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin audio_stream_type_t stream = 798fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin static_cast <audio_stream_type_t>(data.readInt32()); 7996b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 8006b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten return NO_ERROR; 8016b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten } break; 8026b2718c67aa7b1a8e3b0f25a73a0d5f72c59ffc3Glenn Kasten 803de070137f11d346fba77605bd76a44c040a618fcEric Laurent case GET_OUTPUT_FOR_EFFECT: { 804de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 805de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 806de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 807de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t output = getOutputForEffect(&desc); 808de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int>(output)); 809de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 810de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 811de070137f11d346fba77605bd76a44c040a618fcEric Laurent 812de070137f11d346fba77605bd76a44c040a618fcEric Laurent case REGISTER_EFFECT: { 813de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 814de070137f11d346fba77605bd76a44c040a618fcEric Laurent effect_descriptor_t desc; 815de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 8167c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent audio_io_handle_t io = data.readInt32(); 817de070137f11d346fba77605bd76a44c040a618fcEric Laurent uint32_t strategy = data.readInt32(); 818de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 819de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 820de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 8217c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent io, 822de070137f11d346fba77605bd76a44c040a618fcEric Laurent strategy, 823de070137f11d346fba77605bd76a44c040a618fcEric Laurent session, 824de070137f11d346fba77605bd76a44c040a618fcEric Laurent id))); 825de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 826de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 827de070137f11d346fba77605bd76a44c040a618fcEric Laurent 828de070137f11d346fba77605bd76a44c040a618fcEric Laurent case UNREGISTER_EFFECT: { 829de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 830de070137f11d346fba77605bd76a44c040a618fcEric Laurent int id = data.readInt32(); 831de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 832de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 833de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 834de070137f11d346fba77605bd76a44c040a618fcEric Laurent 835db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent case SET_EFFECT_ENABLED: { 836db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 837db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent int id = data.readInt32(); 838db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent bool enabled = static_cast <bool>(data.readInt32()); 839db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 840db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent return NO_ERROR; 841db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent } break; 842db7c079f284f6e91266f6653ae0ec198b1c5006eEric Laurent 843eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent case IS_STREAM_ACTIVE: { 844eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 845fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 846eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent uint32_t inPastMs = (uint32_t)data.readInt32(); 847ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActive(stream, inPastMs) ); 848eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent return NO_ERROR; 849eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent } break; 850eda6c364c253ba97ee45a3adeb8c2b45db1f81dbEric Laurent 851272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi case IS_STREAM_ACTIVE_REMOTELY: { 852272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 853272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 854272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi uint32_t inPastMs = (uint32_t)data.readInt32(); 855ebcb254adb7402ab89ae97c4d9d16d886790dcb3Eric Laurent reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 856272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi return NO_ERROR; 857272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi } break; 858272ab546940054ad7991bef4b3a36f15175721cdJean-Michel Trivi 859d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi case IS_SOURCE_ACTIVE: { 860d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi CHECK_INTERFACE(IAudioPolicyService, data, reply); 861d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi audio_source_t source = (audio_source_t) data.readInt32(); 862d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi reply->writeInt32( isSourceActive(source)); 863d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi return NO_ERROR; 864d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi } 865d7086030fcf731e4bcef6c033cc6418cd04e6b91Jean-Michel Trivi 86657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent case QUERY_DEFAULT_PRE_PROCESSING: { 86757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 86857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent int audioSession = data.readInt32(); 86957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t count = data.readInt32(); 87057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent uint32_t retCount = count; 87157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent effect_descriptor_t *descriptors = 87257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)]; 87357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 87457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(status); 87557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (status != NO_ERROR && status != NO_MEMORY) { 87657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent retCount = 0; 87757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 87857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->writeInt32(retCount); 87957dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount) { 88057dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent if (retCount < count) { 88157dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent count = retCount; 88257dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 88357dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent reply->write(descriptors, sizeof(effect_descriptor_t) * count); 88457dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 88557dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent delete[] descriptors; 88657dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent return status; 88757dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent } 88857dae99c9fcd6becd2b5ed0c53f277ba4d7dbcfcEric Laurent 889b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald case IS_OFFLOAD_SUPPORTED: { 890b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald CHECK_INTERFACE(IAudioPolicyService, data, reply); 891b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t info; 892b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&info, sizeof(audio_offload_info_t)); 893b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool isSupported = isOffloadSupported(info); 894b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald reply->writeInt32(isSupported); 895b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald return NO_ERROR; 896b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 897b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald 898203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PORTS: { 899203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 900203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_role_t role = (audio_port_role_t)data.readInt32(); 901203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_port_type_t type = (audio_port_type_t)data.readInt32(); 902203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPortsReq = data.readInt32(); 903203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPorts = numPortsReq; 904203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int generation; 905203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port *ports = 906203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 907203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 908203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 909203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPorts); 910203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 911203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 912203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPortsReq > numPorts) { 913203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPortsReq = numPorts; 914203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 915203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 916203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 917203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 918203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(ports); 919203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 920203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 921203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 922203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case GET_AUDIO_PORT: { 923203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 924203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port port; 925203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&port, sizeof(struct audio_port)); 926203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = getAudioPort(&port); 927203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 928203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 929203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&port, sizeof(struct audio_port)); 930203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 931203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 932203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 933203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 934203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case CREATE_AUDIO_PATCH: { 935203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 936203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch patch; 937203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&patch, sizeof(struct audio_patch)); 938203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 939203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 940203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = createAudioPatch(&patch, &handle); 941203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 942203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 943203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 944203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 945203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 946203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 947203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 948203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case RELEASE_AUDIO_PATCH: { 949203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 950203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent audio_patch_handle_t handle; 951203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 952203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = releaseAudioPatch(handle); 953203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 954203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 955203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 956203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 957203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case LIST_AUDIO_PATCHES: { 958203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 959203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatchesReq = data.readInt32(); 960203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int numPatches = numPatchesReq; 961203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int generation; 962203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_patch *patches = 963203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent (struct audio_patch *)calloc(numPatchesReq, 964203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent sizeof(struct audio_patch)); 965203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = listAudioPatches(&numPatches, patches, &generation); 966203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 967203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(numPatches); 968203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (status == NO_ERROR) { 969203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent if (numPatchesReq > numPatches) { 970203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent numPatchesReq = numPatches; 971203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 972203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 973203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(generation); 974203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 975203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent free(patches); 976203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 977203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 978203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 979203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent case SET_AUDIO_PORT_CONFIG: { 980203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 981203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent struct audio_port_config config; 982203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent data.read(&config, sizeof(struct audio_port_config)); 983203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent status_t status = setAudioPortConfig(&config); 984203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent reply->writeInt32(status); 985203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent return NO_ERROR; 986203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent } 987b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent case REGISTER_CLIENT: { 988b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent CHECK_INTERFACE(IAudioPolicyService, data, reply); 989b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 990b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent data.readStrongBinder()); 991b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent registerClient(client); 992b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent return NO_ERROR; 993b52c152d553556b2d227ffc943489de0c60b4b02Eric Laurent } break; 994203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 995c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent default: 996c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BBinder::onTransact(code, data, reply, flags); 997c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 998c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent} 999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1000c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent// ---------------------------------------------------------------------------- 1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1002c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}; // namespace android 1003