13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License. 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License. 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/ 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger" 19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent#include <binder/IPCThreadState.h> 267562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h> 27f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent#include <cutils/multiuser.h> 283528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent#include <media/TimeCheck.h> 294980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent#include <private/android_filesystem_config.h> 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3125a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "IAudioFlinger.h" 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 37f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CREATE_RECORD, 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SAMPLE_RATE, 395876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten RESERVED, // obsolete, was CHANNEL_COUNT 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FORMAT, 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FRAME_COUNT, 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LATENCY, 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_VOLUME, 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_MUTE, 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_VOLUME, 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_MUTE, 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_VOLUME, 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_MUTE, 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_VOLUME, 5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_MUTE, 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MODE, 5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MIC_MUTE, 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_MIC_MUTE, 54f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov SET_RECORD_SILENCED, 55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PARAMETERS, 56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_PARAMETERS, 5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project REGISTER_CLIENT, 5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_INPUTBUFFERSIZE, 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_OUTPUT, 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_DUPLICATE_OUTPUT, 61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_OUTPUT, 62c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SUSPEND_OUTPUT, 63c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RESTORE_OUTPUT, 64c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_INPUT, 65c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_INPUT, 66d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten INVALIDATE_STREAM, 67342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent SET_VOICE_VOLUME, 6805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_RENDER_POSITION, 69be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_INPUT_FRAMES_LOST, 709eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten NEW_AUDIO_UNIQUE_ID, 713a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen ACQUIRE_AUDIO_SESSION_ID, 723a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen RELEASE_AUDIO_SESSION_ID, 73be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent QUERY_NUM_EFFECTS, 74ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent QUERY_EFFECT, 75be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_EFFECT_DESCRIPTOR, 76de070137f11d346fba77605bd76a44c040a618fcEric Laurent CREATE_EFFECT, 77a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent MOVE_EFFECTS, 78cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten LOAD_HW_MODULE, 79cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_SAMPLING_RATE, 80cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_FRAME_COUNT, 814182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten SET_LOW_RAM_DEVICE, 824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PORTS, 834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent GET_AUDIO_PORT, 844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CREATE_AUDIO_PATCH, 854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent RELEASE_AUDIO_PATCH, 864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PATCHES, 8793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent SET_AUDIO_PORT_CONFIG, 889eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten GET_AUDIO_HW_SYNC_FOR_SESSION, 894a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten SYSTEM_READY, 904a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten FRAME_COUNT_HAL, 919ff780e58ff96ff98acaae4166bb218880bf9e73jiabin GET_MICROPHONES, 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 94f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024 95f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 99090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioFlinger(const sp<IBinder>& impl) 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input, 10521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackOutput& output, 10621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent status_t *status) 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1095841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 11121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (status == nullptr) { 11321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 11521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent input.writeToParcel(&data); 11721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 12021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack transaction error %d", lStatus); 12121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = DEAD_OBJECT; 12221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 12321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 12421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = reply.readInt32(); 12521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (*status != NO_ERROR) { 12621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack returned error %d", *status); 12721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 12821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 12921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 13021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (track == 0) { 13121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack returned an NULL IAudioTrack with status OK"); 13221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = DEAD_OBJECT; 13321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 13421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 13521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output.readFromParcel(&reply); 1365841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 139f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input, 140f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordOutput& output, 141f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t *status) 14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 144ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano sp<media::IAudioRecord> record; 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 146f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 147f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (status == nullptr) { 148f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 149f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 150f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 151f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent input.writeToParcel(&data); 152f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 153f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply); 1545841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 155f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord transaction error %d", lStatus); 156f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = DEAD_OBJECT; 157f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 159f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = reply.readInt32(); 160f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (*status != NO_ERROR) { 161f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord returned error %d", *status); 162f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 1633e1acc0c58b337dec4054d78c28b48b2e77e0784Eric Laurent } 164f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 165f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent record = interface_cast<media::IAudioRecord>(reply.readStrongBinder()); 166f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (record == 0) { 167f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord returned a NULL IAudioRecord with status OK"); 168f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = DEAD_OBJECT; 169f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 170f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 171f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output.readFromParcel(&reply); 1725841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1752c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1792c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1844a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 1854a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 18672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 19072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 19258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1952c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual size_t frameCount(audio_io_handle_t ioHandle) const 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1992c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 201e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 20872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 24872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 252fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 25472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 259fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 263fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 273fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 27472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 279fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 283fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 288f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 302c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 314f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov virtual void setRecordSilenced(uid_t uid, bool silenced) 315f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov { 316f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov Parcel data, reply; 317f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 318f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.writeInt32(uid); 319f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.writeInt32(silenced ? 1 : 0); 320f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov remote()->transact(SET_RECORD_SILENCED, data, &reply); 321f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov } 322f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov 32372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 33772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 34706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 351dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 352dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 358dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 360e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 363cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openOutput(audio_module_handle_t module, 364cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *output, 365cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 366cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 367cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 368cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t *latencyMs, 369cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_output_flags_t flags) 37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 371cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 372cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 373cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 376a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 377cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 378cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*devices); 379cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 38018868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 381cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 382cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 383cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 384cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 385507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 386cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 387cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 388cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 389cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 390507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 391cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 392cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent ALOGV("openOutput() returned output, %d", *output); 393cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 394cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *devices = (audio_devices_t)reply.readInt32(); 395cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *latencyMs = reply.readInt32(); 396cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 40072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 40772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 41072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 41472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 415c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 41972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 42372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 42872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 43272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 437cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openInput(audio_module_handle_t module, 438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *input, 439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *device, 441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 442cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source, 443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_input_flags_t flags) 44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (input == NULL || config == NULL || device == NULL) { 446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 447cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 450a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*input); 452cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*device); 454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(source); 456ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten data.writeInt32(flags); 457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_INPUT, data, &reply); 458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 461507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 466507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 467cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = (audio_io_handle_t)reply.readInt32(); 468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 469cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *device = (audio_devices_t)reply.readInt32(); 470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 472c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 473fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 477fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 478c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 479c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 482d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten virtual status_t invalidateStream(audio_stream_type_t stream) 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 486fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 487d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten remote()->transact(INVALIDATE_STREAM, data, &reply); 488c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 490f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 491f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 492f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 493f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 494f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 495f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 496f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 497f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 498f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 500377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 50172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 50572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 510507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 512342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 514507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 515342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 516342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 517342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 518342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 519342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 52005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 5215f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 52205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 52305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 52405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 52572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 5265f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 5275f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 5285f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 5295f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 5305f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 53105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 533eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) 534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 535be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 536be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 537eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten data.writeInt32((int32_t) use); 5389eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply); 5399eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE; 540be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 542be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 543be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 544be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 545be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 546d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void acquireAudioSessionId(audio_session_t audioSession, int pid) 5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 551d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 5523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 5533a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5543a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 555d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void releaseAudioSessionId(audio_session_t audioSession, int pid) 5563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5573a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5583a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 560d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 5613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 5623a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5633a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 564f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 5769d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 582f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 589ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 590ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6025e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 603f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6238d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 62772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 628d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId, 629be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName, 630b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid, 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 639e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 640507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 641e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 642e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 643e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 64706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 64972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 651be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov data.writeString16(opPackageName); 652b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent data.writeInt32((int32_t) pid); 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 65629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 660507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 664a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 670507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 676de070137f11d346fba77605bd76a44c040a618fcEric Laurent 677d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput, 67872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 679de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 680de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 681de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 682de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 68372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 68472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 685de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 686de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 687de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 688a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 689a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 690a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 691a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 692a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 693a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 694a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 695a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 696a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 697cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 6983b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 699cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 700cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 701cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 702cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 703cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 704cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 705cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 706e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 707cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 708cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 709cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 710cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 711e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 712cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 713cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7146f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override 7154182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 7164182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 7176f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung 7186f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung static_assert(NO_ERROR == 0, "NO_ERROR must be 0"); 7196f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()) 7206f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: data.writeInt32((int) isLowRamDevice) 7216f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: data.writeInt64(totalMemory) 7226f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply) 7236f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: reply.readInt32(); 7244182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 7256f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung 7264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPorts(unsigned int *num_ports, 7274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports) 7284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 7304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_ports); 7354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 7364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_ports = (unsigned int)reply.readInt32(); 7414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(ports, *num_ports * sizeof(struct audio_port)); 7424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t getAudioPort(struct audio_port *port) 7454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (port == NULL) { 7474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(port, sizeof(struct audio_port)); 7524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 7534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(port, sizeof(struct audio_port)); 7584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 7614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t *handle) 7624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (patch == NULL || handle == NULL) { 7644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(patch, sizeof(struct audio_patch)); 7694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 7704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 7714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 7764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 7794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 7834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 7844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 7854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 7864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 7904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches) 7914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_patches); 7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_patches = (unsigned int)reply.readInt32(); 8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(patches, *num_patches * sizeof(struct audio_patch)); 8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (config == NULL) { 8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(config, sizeof(struct audio_port_config)); 8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 82193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 82293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent { 82393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent Parcel data, reply; 82493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 82593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInt32(sessionId); 8269eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply); 82793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent if (status != NO_ERROR) { 82893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return AUDIO_HW_SYNC_INVALID; 82993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 83093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return (audio_hw_sync_t)reply.readInt32(); 83193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 83272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent virtual status_t systemReady() 83372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent { 83472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent Parcel data, reply; 83572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 83672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 83772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } 8384a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const 8394a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten { 8404a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten Parcel data, reply; 8414a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8424a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInt32((int32_t) ioHandle); 8434a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); 8444a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten if (status != NO_ERROR) { 8454a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return 0; 8464a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 8474a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return reply.readInt64(); 8484a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 84946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) 85046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin { 85146a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin Parcel data, reply; 85246a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8539ff780e58ff96ff98acaae4166bb218880bf9e73jiabin status_t status = remote()->transact(GET_MICROPHONES, data, &reply); 85446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin if (status != NO_ERROR || 85546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin (status = (status_t)reply.readInt32()) != NO_ERROR) { 85646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin return status; 85746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 85846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin status = reply.readParcelableVector(microphones); 85946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin return status; 86046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 870b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent // make sure transactions reserved to AudioPolicyManager do not come from other processes 871b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent switch (code) { 872b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_STREAM_VOLUME: 873b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_STREAM_MUTE: 874b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_OUTPUT: 875b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_DUPLICATE_OUTPUT: 876b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CLOSE_OUTPUT: 877b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SUSPEND_OUTPUT: 878b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RESTORE_OUTPUT: 879b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_INPUT: 880b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CLOSE_INPUT: 881b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case INVALIDATE_STREAM: 882b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_VOICE_VOLUME: 883b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case MOVE_EFFECTS: 884b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LOAD_HW_MODULE: 885b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LIST_AUDIO_PORTS: 886b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case GET_AUDIO_PORT: 887b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CREATE_AUDIO_PATCH: 888b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RELEASE_AUDIO_PATCH: 889b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LIST_AUDIO_PATCHES: 890b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_AUDIO_PORT_CONFIG: 891f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov case SET_RECORD_SILENCED: 892b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent ALOGW("%s: transaction %d received from PID %d", 893b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent __func__, code, IPCThreadState::self()->getCallingPid()); 894ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent // return status only for non void methods 895ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent switch (code) { 896ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent case SET_RECORD_SILENCED: 897ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent break; 898ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent default: 899ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 900ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent break; 901ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent } 902ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent return OK; 903b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent default: 904b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent break; 905b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent } 906b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent 9074980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent // make sure the following transactions come from system components 9084980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent switch (code) { 9094980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MASTER_VOLUME: 9104980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MASTER_MUTE: 9114980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MODE: 9124980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MIC_MUTE: 9134980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_LOW_RAM_DEVICE: 91496c7eed596077ff84e75b7b1c6f20c3a29219bd1Eric Laurent case SYSTEM_READY: { 915f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent if (multiuser_get_app_id(IPCThreadState::self()->getCallingUid()) >= AID_APP_START) { 9164980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", 9174980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent __func__, code, IPCThreadState::self()->getCallingPid(), 9184980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent IPCThreadState::self()->getCallingUid()); 919ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent // return status only for non void methods 920ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent switch (code) { 921ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent case SYSTEM_READY: 922ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent break; 923ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent default: 924ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 925ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent break; 926ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent } 927ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent return OK; 9284980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent } 92996c7eed596077ff84e75b7b1c6f20c3a29219bd1Eric Laurent } break; 9304980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent default: 9314980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent break; 9324980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent } 9334980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent 934dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Whitelist of relevant events to trigger log merging. 935dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Log merging should activate during audio activity of any kind. This are considered the 936dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // most relevant events. 937dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // TODO should select more wisely the items from the list 938dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet switch (code) { 939dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_TRACK: 940f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent case CREATE_RECORD: 941dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_VOLUME: 942dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_MUTE: 943dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MIC_MUTE: 944dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_PARAMETERS: 945dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_EFFECT: 946dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SYSTEM_READY: { 947dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet requestLogMerge(); 948dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 949dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 950dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet default: 951dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 952dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 953b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent 9543528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent TimeCheck check("IAudioFlinger"); 9553528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent 956e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 95921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 96021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackInput input; 96121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 96221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent reply->writeInt32(DEAD_OBJECT); 96321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return NO_ERROR; 9643d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 96521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 96621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent status_t status; 96721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackOutput output; 96821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 96921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent sp<IAudioTrack> track= createTrack(input, 97021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output, 97121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent &status); 97221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 97321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 97521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (status != NO_ERROR) { 97621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return NO_ERROR; 97721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 97806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(track)); 97921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output.writeToParcel(reply); 98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 982f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent case CREATE_RECORD: { 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 984f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 985f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordInput input; 986f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 987f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent reply->writeInt32(DEAD_OBJECT); 988f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return NO_ERROR; 989f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 990f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 991f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t status; 992f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordOutput output; 993f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 994f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent sp<media::IAudioRecord> record = createRecord(input, 995f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output, 996f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent &status); 997f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 998e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 1000f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (status != NO_ERROR) { 1001f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return NO_ERROR; 1002f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 100306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(record)); 1004f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output.writeToParcel(reply); 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 100972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 10124a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 10134a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 10144a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1022e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1030e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 103589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1053c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 105472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1055fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1061fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1067fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 1068fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1074fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1079f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1094f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov case SET_RECORD_SILENCED: { 1095f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov CHECK_INTERFACE(IAudioFlinger, data, reply); 1096f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov uid_t uid = data.readInt32(); 1097f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov audio_source_t source; 1098f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.read(&source, sizeof(audio_source_t)); 1099f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov bool silenced = data.readInt32() == 1; 1100f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov setRecordSilenced(uid, silenced); 1101f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov return NO_ERROR; 1102f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov } break; 1103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 110572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 1107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 1109e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 1111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 111272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 1114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 1115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1116e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 111889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 111989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 112085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 112185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 112489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 112589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 112689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 112858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1129dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1130e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1135a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1136e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1137e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1138e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1139e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1140a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1141cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 11420ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1143983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t latencyMs = 0; 11444cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; 1145cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openOutput(module, &output, &config, 1146cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &devices, address, &latencyMs, flags); 11477074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten ALOGV("OPEN_OUTPUT output, %d", output); 1148cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)status); 1149cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1150cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)output); 1151cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1152cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(devices); 1153cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(latencyMs); 1154cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 1158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 115972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 116072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 116172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1163c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1164c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 1165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 116672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1167c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 1170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 117172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1173c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1174c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 1175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 117672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1177c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1178c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1179c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 1180c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1181a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1182cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1183e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1184e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1185e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1186e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1187cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t device = (audio_devices_t)data.readInt32(); 1188cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 1189cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source = (audio_source_t)data.readInt32(); 1190ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1191c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1192cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openInput(module, &input, &config, 1193cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &device, address, source, flags); 1194cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) status); 1195cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1196cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) input); 1197cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1198cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(device); 1199cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1200c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1201c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1202c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 120389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 120472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 120589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 120689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1207d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten case INVALIDATE_STREAM: { 120889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1209d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1210d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten reply->writeInt32(invalidateStream(stream)); 121189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 121289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1213f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1214f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1215f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1216f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1217f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1218f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1219342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1220342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 122172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1222983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t halFrames = 0; 1223983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t dspFrames = 0; 1224342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1225342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1226342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1227342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1228342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1229342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1230342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1231342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 123205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 123305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 123472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 12355f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 123605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 123705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 12389eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten case NEW_AUDIO_UNIQUE_ID: { 1239be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1240eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32())); 1241be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 12433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 12443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1245d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1246d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1247d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen acquireAudioSessionId(audioSession, pid); 12483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 12503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 12513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1252d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1253d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1254d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen releaseAudioSessionId(audioSession, pid); 12553a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1259983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t numEffects = 0; 1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1261be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1262be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1263be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1264be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1265be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1267ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1268be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1269983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1270ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1271be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1272be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1273be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1274be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1275be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1276be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1277be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1278be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1279be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1280be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1281983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1282be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1283be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1284be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1285be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1286be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1287be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1288be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1289be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1290be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1291e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia effect_descriptor_t desc = {}; 1292e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1293e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1294e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1295be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1296be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 129772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1298d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId = (audio_session_t) data.readInt32(); 1299be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 opPackageName = data.readString16(); 1300b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid = (pid_t)data.readInt32(); 1301b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent 1302983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia status_t status = NO_ERROR; 1303983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int id = 0; 1304983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int enabled = 0; 130505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 13068d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1307b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent opPackageName, pid, &status, &id, &enabled); 1308be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1309be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1310be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 131106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(effect)); 1312be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1313be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1314be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1315de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1316de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1317d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 131872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 131972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1320de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1321de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1322de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1323a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1324a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1325a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1326a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1327a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1328cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1329cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1330cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1331cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1332cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1333cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1334cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1335e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64(getPrimaryOutputFrameCount()); 1336cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1337cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 13384182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 13394182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 13406f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung int32_t isLowRamDevice; 13416f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung int64_t totalMemory; 13426f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung const status_t status = 13436f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung data.readInt32(&isLowRamDevice) ?: 13446f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung data.readInt64(&totalMemory) ?: 13456f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung setLowRamDevice(isLowRamDevice != 0, totalMemory); 13466f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung (void)reply->writeInt32(status); 13474182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 13484182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PORTS: { 13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1351f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPortsReq = data.readInt32(); 1352f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 1353f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 1354f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1355f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPorts = numPortsReq; 13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports = 1357f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_port *)calloc(numPortsReq, 13584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_port)); 1359f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (ports == NULL) { 1360f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1361f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1362f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1363f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1364f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPorts(&numPorts, ports); 13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1366f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPorts); 13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1368f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > numPorts) { 1369f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = numPorts; 1370f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1371f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(ports); 13744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case GET_AUDIO_PORT: { 13774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1378e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1379e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1380e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1381e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = getAudioPort(&port); 13834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&port, sizeof(struct audio_port)); 13864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case CREATE_AUDIO_PATCH: { 13904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch patch; 13924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1393a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1394e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1395e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1396e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = createAudioPatch(&patch, &handle); 13984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 14004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 14024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case RELEASE_AUDIO_PATCH: { 14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t handle; 14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = releaseAudioPatch(handle); 14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PATCHES: { 14134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1414f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatchesReq = data.readInt32(); 1415f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1416f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 1417f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1418f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatches = numPatchesReq; 14194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches = 1420f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_patch *)calloc(numPatchesReq, 14214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_patch)); 1422f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (patches == NULL) { 1423f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1424f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1425f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1426f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1427f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPatches(&numPatches, patches); 14284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1429f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPatches); 14304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1431f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > numPatches) { 1432f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = numPatches; 1433f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1434f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 14354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 14364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(patches); 14374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case SET_AUDIO_PORT_CONFIG: { 14404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 14414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port_config config; 14424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&config, sizeof(struct audio_port_config)); 14434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = setAudioPortConfig(&config); 14444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14479eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten case GET_AUDIO_HW_SYNC_FOR_SESSION: { 144893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1449d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32())); 145093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return NO_ERROR; 145193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } break; 145272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent case SYSTEM_READY: { 145372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 145472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent systemReady(); 145572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return NO_ERROR; 145672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } break; 14574a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten case FRAME_COUNT_HAL: { 14584a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 14594a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); 14604a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return NO_ERROR; 14614a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } break; 14629ff780e58ff96ff98acaae4166bb218880bf9e73jiabin case GET_MICROPHONES: { 146346a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin CHECK_INTERFACE(IAudioFlinger, data, reply); 146446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin std::vector<media::MicrophoneInfo> microphones; 146546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin status_t status = getMicrophones(µphones); 146646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin reply->writeInt32(status); 146746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin if (status == NO_ERROR) { 146846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin reply->writeParcelableVector(microphones); 146946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 147046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin return NO_ERROR; 147146a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 147289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 147389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 147489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 147589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 147689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 147789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 147889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 147940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1480