IAudioFlinger.cpp revision 46a76fa5ffb88dbde2c67335dbc5cf20b75b10b6
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 17bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian 18bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian#define LOG_TAG "IAudioFlinger" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 24b4d5a72691846bce5779cc3db056f09a5031d7ccMathias Agopian 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <binder/IPCThreadState.h> 26ac31a3b8b09aba1c5ebc73f0cf65cac2210aa6b7Mathias Agopian#include <binder/Parcel.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "IAudioFlinger.h" 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_RECORD, 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SAMPLE_RATE, 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESERVED, // obsolete, was CHANNEL_COUNT 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FORMAT, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FRAME_COUNT, 39dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian LATENCY, 40738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian SET_MASTER_VOLUME, 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MASTER_MUTE, 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MASTER_VOLUME, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MASTER_MUTE, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_VOLUME, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_MUTE, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STREAM_VOLUME, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STREAM_MUTE, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MODE, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MIC_MUTE, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_MIC_MUTE, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_RECORD_SILENCED, 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_PARAMETERS, 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_PARAMETERS, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REGISTER_CLIENT, 55627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian GET_INPUTBUFFERSIZE, 56a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian OPEN_OUTPUT, 57627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian OPEN_DUPLICATE_OUTPUT, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_OUTPUT, 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SUSPEND_OUTPUT, 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESTORE_OUTPUT, 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_INPUT, 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_INPUT, 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INVALIDATE_STREAM, 64bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian SET_VOICE_VOLUME, 65bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian GET_RENDER_POSITION, 668434c5369304e639efe8eab368ca410c589d87c2Mathias Agopian GET_INPUT_FRAMES_LOST, 67bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian NEW_AUDIO_UNIQUE_ID, 68bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian ACQUIRE_AUDIO_SESSION_ID, 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RELEASE_AUDIO_SESSION_ID, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project QUERY_NUM_EFFECTS, 71bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian QUERY_EFFECT, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_EFFECT_DESCRIPTOR, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_EFFECT, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MOVE_EFFECTS, 75bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian LOAD_HW_MODULE, 76bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian GET_PRIMARY_OUTPUT_SAMPLING_RATE, 77bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian GET_PRIMARY_OUTPUT_FRAME_COUNT, 78bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian SET_LOW_RAM_DEVICE, 79bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian LIST_AUDIO_PORTS, 80bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian GET_AUDIO_PORT, 81bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian CREATE_AUDIO_PATCH, 82bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian RELEASE_AUDIO_PATCH, 83bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian LIST_AUDIO_PATCHES, 84bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian SET_AUDIO_PORT_CONFIG, 85bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian GET_AUDIO_HW_SYNC_FOR_SESSION, 86bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian SYSTEM_READY, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FRAME_COUNT_HAL, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LIST_MICROPHONES, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MAX_ITEMS_PER_LIST 1024 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project explicit BpAudioFlinger(const sp<IBinder>& impl) 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CreateTrackOutput& output, 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioTrack> track; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == nullptr) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return track; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project input.writeToParcel(&data); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lStatus != NO_ERROR) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGE("createTrack transaction error %d", lStatus); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *status = DEAD_OBJECT; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return track; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *status = reply.readInt32(); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*status != NO_ERROR) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGE("createTrack returned error %d", *status); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return track; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (track == 0) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGE("createTrack returned an NULL IAudioTrack with status OK"); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *status = DEAD_OBJECT; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return track; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project output.readFromParcel(&reply); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return track; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input, 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CreateRecordOutput& output, 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<media::IAudioRecord> record; 142a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 143a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 144a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (status == nullptr) { 145a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return record; 146a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 147a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 148a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian input.writeToParcel(&data); 149a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 150a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply); 151a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (lStatus != NO_ERROR) { 152a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian ALOGE("createRecord transaction error %d", lStatus); 153a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *status = DEAD_OBJECT; 154a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return record; 155a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 156a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *status = reply.readInt32(); 157a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (*status != NO_ERROR) { 158a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian ALOGE("createRecord returned error %d", *status); 159a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return record; 160a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 161a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 162a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian record = interface_cast<media::IAudioRecord>(reply.readStrongBinder()); 163a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (record == 0) { 164a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian ALOGE("createRecord returned a NULL IAudioRecord with status OK"); 165a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *status = DEAD_OBJECT; 166a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return record; 167a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 168a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian output.readFromParcel(&reply); 169a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return record; 170a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 171a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 172a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const 173a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 174a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 175a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 176a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) ioHandle); 177a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(SAMPLE_RATE, data, &reply); 178a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 179a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 180a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 181a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian // RESERVED for channelCount() 182a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 183a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual audio_format_t format(audio_io_handle_t output) const 184a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 185a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 186a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 187a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) output); 188a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(FORMAT, data, &reply); 189a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return (audio_format_t) reply.readInt32(); 190a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 191a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 192a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual size_t frameCount(audio_io_handle_t ioHandle) const 193a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 194a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 195a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 196a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) ioHandle); 197a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(FRAME_COUNT, data, &reply); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt64(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t latency(audio_io_handle_t output) const 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) output); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(LATENCY, data, &reply); 20717f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian return reply.readInt32(); 208317a6280cc109e873646e4652be1582d870eedfdMathias Agopian } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21017f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian virtual status_t setMasterVolume(float value) 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 21317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 21417f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian data.writeFloat(value); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 216738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian return reply.readInt32(); 217a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 218a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 219738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian virtual status_t setMasterMute(bool muted) 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(muted); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 225627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian return reply.readInt32(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 227627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian 228627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian virtual float masterVolume() const 229738b9a45399485893fa9541fae19c47e01bc4af4Mathias Agopian { 2301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian Parcel data, reply; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readFloat(); 234a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 235abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian 236abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian virtual bool masterMute() const 237a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24317f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output) 246a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 247a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 248a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 249a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) stream); 250a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeFloat(value); 251a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) output); 252a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(SET_STREAM_VOLUME, data, &reply); 253a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 258a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 259a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 260a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) stream); 261a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(muted); 262a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(SET_STREAM_MUTE, data, &reply); 263a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 264a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 265a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 266a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2706cf0db228ca275dfcda57d79c55e5fa306809632Mathias Agopian data.writeInt32((int32_t) stream); 27117f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian data.writeInt32((int32_t) output); 272627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian remote()->transact(STREAM_VOLUME, data, &reply); 273627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian return reply.readFloat(); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(audio_stream_type_t stream) const 277a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 278a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 279b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 280b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian data.writeInt32((int32_t) stream); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 283a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 284b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian 285b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian virtual status_t setMode(audio_mode_t mode) 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 289a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(mode); 290a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(SET_MODE, data, &reply); 291a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 292b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian } 293b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian 294b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian virtual status_t setMicMute(bool state) 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(state); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MIC_MUTE, data, &reply); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 302b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian 303b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian virtual bool getMicMute() const 304b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian { 305b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian Parcel data, reply; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(GET_MIC_MUTE, data, &reply); 3081379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian return reply.readInt32(); 3091379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian } 310b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian 311b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian virtual void setRecordSilenced(uid_t uid, bool silenced) 312b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3148166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3158166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian data.writeInt32(uid); 3168166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian data.writeInt32(silenced ? 1 : 0); 3178166864e42bc20c1544b2028e8dd65b90f29a0eaMathias Agopian remote()->transact(SET_RECORD_SILENCED, data, &reply); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 320b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 321b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 323b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 324b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian data.writeInt32((int32_t) ioHandle); 325b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian data.writeString8(keyValuePairs); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_PARAMETERS, data, &reply); 327627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian return reply.readInt32(); 328627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian } 329627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian 330627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopian virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 3311379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian { 3321379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian Parcel data, reply; 3331379665abdb8330caf813fb77902914d1545bcd9Mathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 334a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) ioHandle); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString8(keys); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(GET_PARAMETERS, data, &reply); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readString8(); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void registerClient(const sp<IAudioFlingerClient>& client) 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 342a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 343a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 344a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeStrongBinder(IInterface::asBinder(client)); 345a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(REGISTER_CLIENT, data, &reply); 346a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 347a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 348a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 349a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_channel_mask_t channelMask) const 350a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 351a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 352a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 353a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(sampleRate); 354a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(format); 355a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(channelMask); 356a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 357a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt64(); 358a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 359a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 360a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual status_t openOutput(audio_module_handle_t module, 361a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_io_handle_t *output, 362a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_config_t *config, 363a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_devices_t *devices, 364a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian const String8& address, 365a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian uint32_t *latencyMs, 366a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_output_flags_t flags) 367a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 368a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 369a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return BAD_VALUE; 370a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 371a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 372a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 373a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(module); 374a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.write(config, sizeof(audio_config_t)); 375a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(*devices); 376a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeString8(address); 377a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) flags); 378a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 379a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (status != NO_ERROR) { 380a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *output = AUDIO_IO_HANDLE_NONE; 381a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return status; 382a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 383a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian status = (status_t)reply.readInt32(); 384a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (status != NO_ERROR) { 385a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *output = AUDIO_IO_HANDLE_NONE; 386a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return status; 387a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 388a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *output = (audio_io_handle_t)reply.readInt32(); 389a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian ALOGV("openOutput() returned output, %d", *output); 390a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian reply.read(config, sizeof(audio_config_t)); 391a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *devices = (audio_devices_t)reply.readInt32(); 392a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *latencyMs = reply.readInt32(); 393a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return NO_ERROR; 394a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 395a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 396a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 397a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_io_handle_t output2) 398a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 399a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 400a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 401a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) output1); 402a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) output2); 403a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 404a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return (audio_io_handle_t) reply.readInt32(); 405a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 406a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 407a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual status_t closeOutput(audio_io_handle_t output) 408a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 409a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 410a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 411a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) output); 412a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(CLOSE_OUTPUT, data, &reply); 413a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 414a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 415a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 416a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual status_t suspendOutput(audio_io_handle_t output) 417a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 418a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 419a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 420a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) output); 421a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(SUSPEND_OUTPUT, data, &reply); 422a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 423a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 424a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 425a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual status_t restoreOutput(audio_io_handle_t output) 426a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 427a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 428a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 429a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) output); 430a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(RESTORE_OUTPUT, data, &reply); 431a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 432a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 433a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 434a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual status_t openInput(audio_module_handle_t module, 435a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_io_handle_t *input, 436a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_config_t *config, 437a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_devices_t *device, 438a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian const String8& address, 439a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_source_t source, 440a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian audio_input_flags_t flags) 441a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 442a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (input == NULL || config == NULL || device == NULL) { 443a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return BAD_VALUE; 444a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 445a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 446a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 447a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(module); 448a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(*input); 449a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.write(config, sizeof(audio_config_t)); 450a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(*device); 451a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeString8(address); 452a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(source); 453a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(flags); 454a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian status_t status = remote()->transact(OPEN_INPUT, data, &reply); 455a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (status != NO_ERROR) { 456a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *input = AUDIO_IO_HANDLE_NONE; 457a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return status; 458a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 459a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian status = (status_t)reply.readInt32(); 460a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian if (status != NO_ERROR) { 461a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *input = AUDIO_IO_HANDLE_NONE; 462a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return status; 463a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 464a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *input = (audio_io_handle_t)reply.readInt32(); 465a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian reply.read(config, sizeof(audio_config_t)); 466a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian *device = (audio_devices_t)reply.readInt32(); 467a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return NO_ERROR; 468a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 469a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 470a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual status_t closeInput(int input) 471a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 472a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 473a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 474a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32(input); 475a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(CLOSE_INPUT, data, &reply); 476a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 477a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 478a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 479a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian virtual status_t invalidateStream(audio_stream_type_t stream) 480a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian { 481a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian Parcel data, reply; 482a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 483a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian data.writeInt32((int32_t) stream); 484a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian remote()->transact(INVALIDATE_STREAM, data, &reply); 485a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian return reply.readInt32(); 486a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian } 487a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setVoiceVolume(float volume) 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 492 data.writeFloat(volume); 493 remote()->transact(SET_VOICE_VOLUME, data, &reply); 494 return reply.readInt32(); 495 } 496 497 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 498 audio_io_handle_t output) const 499 { 500 Parcel data, reply; 501 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 502 data.writeInt32((int32_t) output); 503 remote()->transact(GET_RENDER_POSITION, data, &reply); 504 status_t status = reply.readInt32(); 505 if (status == NO_ERROR) { 506 uint32_t tmp = reply.readInt32(); 507 if (halFrames != NULL) { 508 *halFrames = tmp; 509 } 510 tmp = reply.readInt32(); 511 if (dspFrames != NULL) { 512 *dspFrames = tmp; 513 } 514 } 515 return status; 516 } 517 518 virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 519 { 520 Parcel data, reply; 521 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 522 data.writeInt32((int32_t) ioHandle); 523 status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 524 if (status != NO_ERROR) { 525 return 0; 526 } 527 return (uint32_t) reply.readInt32(); 528 } 529 530 virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) 531 { 532 Parcel data, reply; 533 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 534 data.writeInt32((int32_t) use); 535 status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply); 536 audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE; 537 if (status == NO_ERROR) { 538 id = reply.readInt32(); 539 } 540 return id; 541 } 542 543 virtual void acquireAudioSessionId(audio_session_t audioSession, int pid) 544 { 545 Parcel data, reply; 546 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 547 data.writeInt32(audioSession); 548 data.writeInt32(pid); 549 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 550 } 551 552 virtual void releaseAudioSessionId(audio_session_t audioSession, int pid) 553 { 554 Parcel data, reply; 555 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 556 data.writeInt32(audioSession); 557 data.writeInt32(pid); 558 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 559 } 560 561 virtual status_t queryNumberEffects(uint32_t *numEffects) const 562 { 563 Parcel data, reply; 564 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 565 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 566 if (status != NO_ERROR) { 567 return status; 568 } 569 status = reply.readInt32(); 570 if (status != NO_ERROR) { 571 return status; 572 } 573 if (numEffects != NULL) { 574 *numEffects = (uint32_t)reply.readInt32(); 575 } 576 return NO_ERROR; 577 } 578 579 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 580 { 581 if (pDescriptor == NULL) { 582 return BAD_VALUE; 583 } 584 Parcel data, reply; 585 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 586 data.writeInt32(index); 587 status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 588 if (status != NO_ERROR) { 589 return status; 590 } 591 status = reply.readInt32(); 592 if (status != NO_ERROR) { 593 return status; 594 } 595 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 596 return NO_ERROR; 597 } 598 599 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 600 effect_descriptor_t *pDescriptor) const 601 { 602 if (pUuid == NULL || pDescriptor == NULL) { 603 return BAD_VALUE; 604 } 605 Parcel data, reply; 606 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 607 data.write(pUuid, sizeof(effect_uuid_t)); 608 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 609 if (status != NO_ERROR) { 610 return status; 611 } 612 status = reply.readInt32(); 613 if (status != NO_ERROR) { 614 return status; 615 } 616 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 617 return NO_ERROR; 618 } 619 620 virtual sp<IEffect> createEffect( 621 effect_descriptor_t *pDesc, 622 const sp<IEffectClient>& client, 623 int32_t priority, 624 audio_io_handle_t output, 625 audio_session_t sessionId, 626 const String16& opPackageName, 627 pid_t pid, 628 status_t *status, 629 int *id, 630 int *enabled) 631 { 632 Parcel data, reply; 633 sp<IEffect> effect; 634 635 if (pDesc == NULL) { 636 return effect; 637 if (status != NULL) { 638 *status = BAD_VALUE; 639 } 640 } 641 642 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 643 data.write(pDesc, sizeof(effect_descriptor_t)); 644 data.writeStrongBinder(IInterface::asBinder(client)); 645 data.writeInt32(priority); 646 data.writeInt32((int32_t) output); 647 data.writeInt32(sessionId); 648 data.writeString16(opPackageName); 649 data.writeInt32((int32_t) pid); 650 651 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 652 if (lStatus != NO_ERROR) { 653 ALOGE("createEffect error: %s", strerror(-lStatus)); 654 } else { 655 lStatus = reply.readInt32(); 656 int tmp = reply.readInt32(); 657 if (id != NULL) { 658 *id = tmp; 659 } 660 tmp = reply.readInt32(); 661 if (enabled != NULL) { 662 *enabled = tmp; 663 } 664 effect = interface_cast<IEffect>(reply.readStrongBinder()); 665 reply.read(pDesc, sizeof(effect_descriptor_t)); 666 } 667 if (status != NULL) { 668 *status = lStatus; 669 } 670 671 return effect; 672 } 673 674 virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput, 675 audio_io_handle_t dstOutput) 676 { 677 Parcel data, reply; 678 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 679 data.writeInt32(session); 680 data.writeInt32((int32_t) srcOutput); 681 data.writeInt32((int32_t) dstOutput); 682 remote()->transact(MOVE_EFFECTS, data, &reply); 683 return reply.readInt32(); 684 } 685 686 virtual audio_module_handle_t loadHwModule(const char *name) 687 { 688 Parcel data, reply; 689 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 690 data.writeCString(name); 691 remote()->transact(LOAD_HW_MODULE, data, &reply); 692 return (audio_module_handle_t) reply.readInt32(); 693 } 694 695 virtual uint32_t getPrimaryOutputSamplingRate() 696 { 697 Parcel data, reply; 698 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 699 remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 700 return reply.readInt32(); 701 } 702 703 virtual size_t getPrimaryOutputFrameCount() 704 { 705 Parcel data, reply; 706 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 707 remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 708 return reply.readInt64(); 709 } 710 711 virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override 712 { 713 Parcel data, reply; 714 715 static_assert(NO_ERROR == 0, "NO_ERROR must be 0"); 716 return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()) 717 ?: data.writeInt32((int) isLowRamDevice) 718 ?: data.writeInt64(totalMemory) 719 ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply) 720 ?: reply.readInt32(); 721 } 722 723 virtual status_t listAudioPorts(unsigned int *num_ports, 724 struct audio_port *ports) 725 { 726 if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 727 return BAD_VALUE; 728 } 729 Parcel data, reply; 730 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 731 data.writeInt32(*num_ports); 732 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 733 if (status != NO_ERROR || 734 (status = (status_t)reply.readInt32()) != NO_ERROR) { 735 return status; 736 } 737 *num_ports = (unsigned int)reply.readInt32(); 738 reply.read(ports, *num_ports * sizeof(struct audio_port)); 739 return status; 740 } 741 virtual status_t getAudioPort(struct audio_port *port) 742 { 743 if (port == NULL) { 744 return BAD_VALUE; 745 } 746 Parcel data, reply; 747 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 748 data.write(port, sizeof(struct audio_port)); 749 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 750 if (status != NO_ERROR || 751 (status = (status_t)reply.readInt32()) != NO_ERROR) { 752 return status; 753 } 754 reply.read(port, sizeof(struct audio_port)); 755 return status; 756 } 757 virtual status_t createAudioPatch(const struct audio_patch *patch, 758 audio_patch_handle_t *handle) 759 { 760 if (patch == NULL || handle == NULL) { 761 return BAD_VALUE; 762 } 763 Parcel data, reply; 764 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 765 data.write(patch, sizeof(struct audio_patch)); 766 data.write(handle, sizeof(audio_patch_handle_t)); 767 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 768 if (status != NO_ERROR || 769 (status = (status_t)reply.readInt32()) != NO_ERROR) { 770 return status; 771 } 772 reply.read(handle, sizeof(audio_patch_handle_t)); 773 return status; 774 } 775 virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 776 { 777 Parcel data, reply; 778 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 779 data.write(&handle, sizeof(audio_patch_handle_t)); 780 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 781 if (status != NO_ERROR) { 782 status = (status_t)reply.readInt32(); 783 } 784 return status; 785 } 786 virtual status_t listAudioPatches(unsigned int *num_patches, 787 struct audio_patch *patches) 788 { 789 if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 790 return BAD_VALUE; 791 } 792 Parcel data, reply; 793 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 794 data.writeInt32(*num_patches); 795 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 796 if (status != NO_ERROR || 797 (status = (status_t)reply.readInt32()) != NO_ERROR) { 798 return status; 799 } 800 *num_patches = (unsigned int)reply.readInt32(); 801 reply.read(patches, *num_patches * sizeof(struct audio_patch)); 802 return status; 803 } 804 virtual status_t setAudioPortConfig(const struct audio_port_config *config) 805 { 806 if (config == NULL) { 807 return BAD_VALUE; 808 } 809 Parcel data, reply; 810 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 811 data.write(config, sizeof(struct audio_port_config)); 812 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 813 if (status != NO_ERROR) { 814 status = (status_t)reply.readInt32(); 815 } 816 return status; 817 } 818 virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 819 { 820 Parcel data, reply; 821 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 822 data.writeInt32(sessionId); 823 status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply); 824 if (status != NO_ERROR) { 825 return AUDIO_HW_SYNC_INVALID; 826 } 827 return (audio_hw_sync_t)reply.readInt32(); 828 } 829 virtual status_t systemReady() 830 { 831 Parcel data, reply; 832 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 833 return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 834 } 835 virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const 836 { 837 Parcel data, reply; 838 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 839 data.writeInt32((int32_t) ioHandle); 840 status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); 841 if (status != NO_ERROR) { 842 return 0; 843 } 844 return reply.readInt64(); 845 } 846 virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) 847 { 848 Parcel data, reply; 849 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 850 status_t status = remote()->transact(LIST_MICROPHONES, data, &reply); 851 if (status != NO_ERROR || 852 (status = (status_t)reply.readInt32()) != NO_ERROR) { 853 return status; 854 } 855 status = reply.readParcelableVector(microphones); 856 return status; 857 } 858}; 859 860IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 861 862// ---------------------------------------------------------------------- 863 864status_t BnAudioFlinger::onTransact( 865 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 866{ 867 // make sure transactions reserved to AudioPolicyManager do not come from other processes 868 switch (code) { 869 case SET_STREAM_VOLUME: 870 case SET_STREAM_MUTE: 871 case SET_MODE: 872 case OPEN_OUTPUT: 873 case OPEN_DUPLICATE_OUTPUT: 874 case CLOSE_OUTPUT: 875 case SUSPEND_OUTPUT: 876 case RESTORE_OUTPUT: 877 case OPEN_INPUT: 878 case CLOSE_INPUT: 879 case INVALIDATE_STREAM: 880 case SET_VOICE_VOLUME: 881 case MOVE_EFFECTS: 882 case LOAD_HW_MODULE: 883 case LIST_AUDIO_PORTS: 884 case GET_AUDIO_PORT: 885 case CREATE_AUDIO_PATCH: 886 case RELEASE_AUDIO_PATCH: 887 case LIST_AUDIO_PATCHES: 888 case SET_AUDIO_PORT_CONFIG: 889 case SET_RECORD_SILENCED: 890 ALOGW("%s: transaction %d received from PID %d", 891 __func__, code, IPCThreadState::self()->getCallingPid()); 892 return INVALID_OPERATION; 893 default: 894 break; 895 } 896 897 // Whitelist of relevant events to trigger log merging. 898 // Log merging should activate during audio activity of any kind. This are considered the 899 // most relevant events. 900 // TODO should select more wisely the items from the list 901 switch (code) { 902 case CREATE_TRACK: 903 case CREATE_RECORD: 904 case SET_MASTER_VOLUME: 905 case SET_MASTER_MUTE: 906 case SET_MIC_MUTE: 907 case SET_PARAMETERS: 908 case CREATE_EFFECT: 909 case SYSTEM_READY: { 910 requestLogMerge(); 911 break; 912 } 913 default: 914 break; 915 } 916 917 switch (code) { 918 case CREATE_TRACK: { 919 CHECK_INTERFACE(IAudioFlinger, data, reply); 920 921 CreateTrackInput input; 922 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 923 reply->writeInt32(DEAD_OBJECT); 924 return NO_ERROR; 925 } 926 927 status_t status; 928 CreateTrackOutput output; 929 930 sp<IAudioTrack> track= createTrack(input, 931 output, 932 &status); 933 934 LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 935 reply->writeInt32(status); 936 if (status != NO_ERROR) { 937 return NO_ERROR; 938 } 939 reply->writeStrongBinder(IInterface::asBinder(track)); 940 output.writeToParcel(reply); 941 return NO_ERROR; 942 } break; 943 case CREATE_RECORD: { 944 CHECK_INTERFACE(IAudioFlinger, data, reply); 945 946 CreateRecordInput input; 947 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 948 reply->writeInt32(DEAD_OBJECT); 949 return NO_ERROR; 950 } 951 952 status_t status; 953 CreateRecordOutput output; 954 955 sp<media::IAudioRecord> record = createRecord(input, 956 output, 957 &status); 958 959 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 960 reply->writeInt32(status); 961 if (status != NO_ERROR) { 962 return NO_ERROR; 963 } 964 reply->writeStrongBinder(IInterface::asBinder(record)); 965 output.writeToParcel(reply); 966 return NO_ERROR; 967 } break; 968 case SAMPLE_RATE: { 969 CHECK_INTERFACE(IAudioFlinger, data, reply); 970 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 971 return NO_ERROR; 972 } break; 973 974 // RESERVED for channelCount() 975 976 case FORMAT: { 977 CHECK_INTERFACE(IAudioFlinger, data, reply); 978 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 979 return NO_ERROR; 980 } break; 981 case FRAME_COUNT: { 982 CHECK_INTERFACE(IAudioFlinger, data, reply); 983 reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 984 return NO_ERROR; 985 } break; 986 case LATENCY: { 987 CHECK_INTERFACE(IAudioFlinger, data, reply); 988 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 989 return NO_ERROR; 990 } break; 991 case SET_MASTER_VOLUME: { 992 CHECK_INTERFACE(IAudioFlinger, data, reply); 993 reply->writeInt32( setMasterVolume(data.readFloat()) ); 994 return NO_ERROR; 995 } break; 996 case SET_MASTER_MUTE: { 997 CHECK_INTERFACE(IAudioFlinger, data, reply); 998 reply->writeInt32( setMasterMute(data.readInt32()) ); 999 return NO_ERROR; 1000 } break; 1001 case MASTER_VOLUME: { 1002 CHECK_INTERFACE(IAudioFlinger, data, reply); 1003 reply->writeFloat( masterVolume() ); 1004 return NO_ERROR; 1005 } break; 1006 case MASTER_MUTE: { 1007 CHECK_INTERFACE(IAudioFlinger, data, reply); 1008 reply->writeInt32( masterMute() ); 1009 return NO_ERROR; 1010 } break; 1011 case SET_STREAM_VOLUME: { 1012 CHECK_INTERFACE(IAudioFlinger, data, reply); 1013 int stream = data.readInt32(); 1014 float volume = data.readFloat(); 1015 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1016 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 1017 return NO_ERROR; 1018 } break; 1019 case SET_STREAM_MUTE: { 1020 CHECK_INTERFACE(IAudioFlinger, data, reply); 1021 int stream = data.readInt32(); 1022 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 1023 return NO_ERROR; 1024 } break; 1025 case STREAM_VOLUME: { 1026 CHECK_INTERFACE(IAudioFlinger, data, reply); 1027 int stream = data.readInt32(); 1028 int output = data.readInt32(); 1029 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 1030 return NO_ERROR; 1031 } break; 1032 case STREAM_MUTE: { 1033 CHECK_INTERFACE(IAudioFlinger, data, reply); 1034 int stream = data.readInt32(); 1035 reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 1036 return NO_ERROR; 1037 } break; 1038 case SET_MODE: { 1039 CHECK_INTERFACE(IAudioFlinger, data, reply); 1040 audio_mode_t mode = (audio_mode_t) data.readInt32(); 1041 reply->writeInt32( setMode(mode) ); 1042 return NO_ERROR; 1043 } break; 1044 case SET_MIC_MUTE: { 1045 CHECK_INTERFACE(IAudioFlinger, data, reply); 1046 int state = data.readInt32(); 1047 reply->writeInt32( setMicMute(state) ); 1048 return NO_ERROR; 1049 } break; 1050 case GET_MIC_MUTE: { 1051 CHECK_INTERFACE(IAudioFlinger, data, reply); 1052 reply->writeInt32( getMicMute() ); 1053 return NO_ERROR; 1054 } break; 1055 case SET_RECORD_SILENCED: { 1056 CHECK_INTERFACE(IAudioFlinger, data, reply); 1057 uid_t uid = data.readInt32(); 1058 audio_source_t source; 1059 data.read(&source, sizeof(audio_source_t)); 1060 bool silenced = data.readInt32() == 1; 1061 setRecordSilenced(uid, silenced); 1062 return NO_ERROR; 1063 } break; 1064 case SET_PARAMETERS: { 1065 CHECK_INTERFACE(IAudioFlinger, data, reply); 1066 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1067 String8 keyValuePairs(data.readString8()); 1068 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 1069 return NO_ERROR; 1070 } break; 1071 case GET_PARAMETERS: { 1072 CHECK_INTERFACE(IAudioFlinger, data, reply); 1073 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1074 String8 keys(data.readString8()); 1075 reply->writeString8(getParameters(ioHandle, keys)); 1076 return NO_ERROR; 1077 } break; 1078 1079 case REGISTER_CLIENT: { 1080 CHECK_INTERFACE(IAudioFlinger, data, reply); 1081 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 1082 data.readStrongBinder()); 1083 registerClient(client); 1084 return NO_ERROR; 1085 } break; 1086 case GET_INPUTBUFFERSIZE: { 1087 CHECK_INTERFACE(IAudioFlinger, data, reply); 1088 uint32_t sampleRate = data.readInt32(); 1089 audio_format_t format = (audio_format_t) data.readInt32(); 1090 audio_channel_mask_t channelMask = data.readInt32(); 1091 reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 1092 return NO_ERROR; 1093 } break; 1094 case OPEN_OUTPUT: { 1095 CHECK_INTERFACE(IAudioFlinger, data, reply); 1096 audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1097 audio_config_t config = {}; 1098 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1099 ALOGE("b/23905951"); 1100 } 1101 audio_devices_t devices = (audio_devices_t)data.readInt32(); 1102 String8 address(data.readString8()); 1103 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1104 uint32_t latencyMs = 0; 1105 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; 1106 status_t status = openOutput(module, &output, &config, 1107 &devices, address, &latencyMs, flags); 1108 ALOGV("OPEN_OUTPUT output, %d", output); 1109 reply->writeInt32((int32_t)status); 1110 if (status == NO_ERROR) { 1111 reply->writeInt32((int32_t)output); 1112 reply->write(&config, sizeof(audio_config_t)); 1113 reply->writeInt32(devices); 1114 reply->writeInt32(latencyMs); 1115 } 1116 return NO_ERROR; 1117 } break; 1118 case OPEN_DUPLICATE_OUTPUT: { 1119 CHECK_INTERFACE(IAudioFlinger, data, reply); 1120 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 1121 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 1122 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1123 return NO_ERROR; 1124 } break; 1125 case CLOSE_OUTPUT: { 1126 CHECK_INTERFACE(IAudioFlinger, data, reply); 1127 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1128 return NO_ERROR; 1129 } break; 1130 case SUSPEND_OUTPUT: { 1131 CHECK_INTERFACE(IAudioFlinger, data, reply); 1132 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1133 return NO_ERROR; 1134 } break; 1135 case RESTORE_OUTPUT: { 1136 CHECK_INTERFACE(IAudioFlinger, data, reply); 1137 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1138 return NO_ERROR; 1139 } break; 1140 case OPEN_INPUT: { 1141 CHECK_INTERFACE(IAudioFlinger, data, reply); 1142 audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1143 audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1144 audio_config_t config = {}; 1145 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1146 ALOGE("b/23905951"); 1147 } 1148 audio_devices_t device = (audio_devices_t)data.readInt32(); 1149 String8 address(data.readString8()); 1150 audio_source_t source = (audio_source_t)data.readInt32(); 1151 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1152 1153 status_t status = openInput(module, &input, &config, 1154 &device, address, source, flags); 1155 reply->writeInt32((int32_t) status); 1156 if (status == NO_ERROR) { 1157 reply->writeInt32((int32_t) input); 1158 reply->write(&config, sizeof(audio_config_t)); 1159 reply->writeInt32(device); 1160 } 1161 return NO_ERROR; 1162 } break; 1163 case CLOSE_INPUT: { 1164 CHECK_INTERFACE(IAudioFlinger, data, reply); 1165 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 1166 return NO_ERROR; 1167 } break; 1168 case INVALIDATE_STREAM: { 1169 CHECK_INTERFACE(IAudioFlinger, data, reply); 1170 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1171 reply->writeInt32(invalidateStream(stream)); 1172 return NO_ERROR; 1173 } break; 1174 case SET_VOICE_VOLUME: { 1175 CHECK_INTERFACE(IAudioFlinger, data, reply); 1176 float volume = data.readFloat(); 1177 reply->writeInt32( setVoiceVolume(volume) ); 1178 return NO_ERROR; 1179 } break; 1180 case GET_RENDER_POSITION: { 1181 CHECK_INTERFACE(IAudioFlinger, data, reply); 1182 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1183 uint32_t halFrames = 0; 1184 uint32_t dspFrames = 0; 1185 status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1186 reply->writeInt32(status); 1187 if (status == NO_ERROR) { 1188 reply->writeInt32(halFrames); 1189 reply->writeInt32(dspFrames); 1190 } 1191 return NO_ERROR; 1192 } 1193 case GET_INPUT_FRAMES_LOST: { 1194 CHECK_INTERFACE(IAudioFlinger, data, reply); 1195 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1196 reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 1197 return NO_ERROR; 1198 } break; 1199 case NEW_AUDIO_UNIQUE_ID: { 1200 CHECK_INTERFACE(IAudioFlinger, data, reply); 1201 reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32())); 1202 return NO_ERROR; 1203 } break; 1204 case ACQUIRE_AUDIO_SESSION_ID: { 1205 CHECK_INTERFACE(IAudioFlinger, data, reply); 1206 audio_session_t audioSession = (audio_session_t) data.readInt32(); 1207 int pid = data.readInt32(); 1208 acquireAudioSessionId(audioSession, pid); 1209 return NO_ERROR; 1210 } break; 1211 case RELEASE_AUDIO_SESSION_ID: { 1212 CHECK_INTERFACE(IAudioFlinger, data, reply); 1213 audio_session_t audioSession = (audio_session_t) data.readInt32(); 1214 int pid = data.readInt32(); 1215 releaseAudioSessionId(audioSession, pid); 1216 return NO_ERROR; 1217 } break; 1218 case QUERY_NUM_EFFECTS: { 1219 CHECK_INTERFACE(IAudioFlinger, data, reply); 1220 uint32_t numEffects = 0; 1221 status_t status = queryNumberEffects(&numEffects); 1222 reply->writeInt32(status); 1223 if (status == NO_ERROR) { 1224 reply->writeInt32((int32_t)numEffects); 1225 } 1226 return NO_ERROR; 1227 } 1228 case QUERY_EFFECT: { 1229 CHECK_INTERFACE(IAudioFlinger, data, reply); 1230 effect_descriptor_t desc = {}; 1231 status_t status = queryEffect(data.readInt32(), &desc); 1232 reply->writeInt32(status); 1233 if (status == NO_ERROR) { 1234 reply->write(&desc, sizeof(effect_descriptor_t)); 1235 } 1236 return NO_ERROR; 1237 } 1238 case GET_EFFECT_DESCRIPTOR: { 1239 CHECK_INTERFACE(IAudioFlinger, data, reply); 1240 effect_uuid_t uuid; 1241 data.read(&uuid, sizeof(effect_uuid_t)); 1242 effect_descriptor_t desc = {}; 1243 status_t status = getEffectDescriptor(&uuid, &desc); 1244 reply->writeInt32(status); 1245 if (status == NO_ERROR) { 1246 reply->write(&desc, sizeof(effect_descriptor_t)); 1247 } 1248 return NO_ERROR; 1249 } 1250 case CREATE_EFFECT: { 1251 CHECK_INTERFACE(IAudioFlinger, data, reply); 1252 effect_descriptor_t desc = {}; 1253 if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1254 ALOGE("b/23905951"); 1255 } 1256 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1257 int32_t priority = data.readInt32(); 1258 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1259 audio_session_t sessionId = (audio_session_t) data.readInt32(); 1260 const String16 opPackageName = data.readString16(); 1261 pid_t pid = (pid_t)data.readInt32(); 1262 1263 status_t status = NO_ERROR; 1264 int id = 0; 1265 int enabled = 0; 1266 1267 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1268 opPackageName, pid, &status, &id, &enabled); 1269 reply->writeInt32(status); 1270 reply->writeInt32(id); 1271 reply->writeInt32(enabled); 1272 reply->writeStrongBinder(IInterface::asBinder(effect)); 1273 reply->write(&desc, sizeof(effect_descriptor_t)); 1274 return NO_ERROR; 1275 } break; 1276 case MOVE_EFFECTS: { 1277 CHECK_INTERFACE(IAudioFlinger, data, reply); 1278 audio_session_t session = (audio_session_t) data.readInt32(); 1279 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 1280 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1281 reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1282 return NO_ERROR; 1283 } break; 1284 case LOAD_HW_MODULE: { 1285 CHECK_INTERFACE(IAudioFlinger, data, reply); 1286 reply->writeInt32(loadHwModule(data.readCString())); 1287 return NO_ERROR; 1288 } break; 1289 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1290 CHECK_INTERFACE(IAudioFlinger, data, reply); 1291 reply->writeInt32(getPrimaryOutputSamplingRate()); 1292 return NO_ERROR; 1293 } break; 1294 case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1295 CHECK_INTERFACE(IAudioFlinger, data, reply); 1296 reply->writeInt64(getPrimaryOutputFrameCount()); 1297 return NO_ERROR; 1298 } break; 1299 case SET_LOW_RAM_DEVICE: { 1300 CHECK_INTERFACE(IAudioFlinger, data, reply); 1301 int32_t isLowRamDevice; 1302 int64_t totalMemory; 1303 const status_t status = 1304 data.readInt32(&isLowRamDevice) ?: 1305 data.readInt64(&totalMemory) ?: 1306 setLowRamDevice(isLowRamDevice != 0, totalMemory); 1307 (void)reply->writeInt32(status); 1308 return NO_ERROR; 1309 } break; 1310 case LIST_AUDIO_PORTS: { 1311 CHECK_INTERFACE(IAudioFlinger, data, reply); 1312 unsigned int numPortsReq = data.readInt32(); 1313 if (numPortsReq > MAX_ITEMS_PER_LIST) { 1314 numPortsReq = MAX_ITEMS_PER_LIST; 1315 } 1316 unsigned int numPorts = numPortsReq; 1317 struct audio_port *ports = 1318 (struct audio_port *)calloc(numPortsReq, 1319 sizeof(struct audio_port)); 1320 if (ports == NULL) { 1321 reply->writeInt32(NO_MEMORY); 1322 reply->writeInt32(0); 1323 return NO_ERROR; 1324 } 1325 status_t status = listAudioPorts(&numPorts, ports); 1326 reply->writeInt32(status); 1327 reply->writeInt32(numPorts); 1328 if (status == NO_ERROR) { 1329 if (numPortsReq > numPorts) { 1330 numPortsReq = numPorts; 1331 } 1332 reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1333 } 1334 free(ports); 1335 return NO_ERROR; 1336 } break; 1337 case GET_AUDIO_PORT: { 1338 CHECK_INTERFACE(IAudioFlinger, data, reply); 1339 struct audio_port port = {}; 1340 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1341 ALOGE("b/23905951"); 1342 } 1343 status_t status = getAudioPort(&port); 1344 reply->writeInt32(status); 1345 if (status == NO_ERROR) { 1346 reply->write(&port, sizeof(struct audio_port)); 1347 } 1348 return NO_ERROR; 1349 } break; 1350 case CREATE_AUDIO_PATCH: { 1351 CHECK_INTERFACE(IAudioFlinger, data, reply); 1352 struct audio_patch patch; 1353 data.read(&patch, sizeof(struct audio_patch)); 1354 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1355 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1356 ALOGE("b/23905951"); 1357 } 1358 status_t status = createAudioPatch(&patch, &handle); 1359 reply->writeInt32(status); 1360 if (status == NO_ERROR) { 1361 reply->write(&handle, sizeof(audio_patch_handle_t)); 1362 } 1363 return NO_ERROR; 1364 } break; 1365 case RELEASE_AUDIO_PATCH: { 1366 CHECK_INTERFACE(IAudioFlinger, data, reply); 1367 audio_patch_handle_t handle; 1368 data.read(&handle, sizeof(audio_patch_handle_t)); 1369 status_t status = releaseAudioPatch(handle); 1370 reply->writeInt32(status); 1371 return NO_ERROR; 1372 } break; 1373 case LIST_AUDIO_PATCHES: { 1374 CHECK_INTERFACE(IAudioFlinger, data, reply); 1375 unsigned int numPatchesReq = data.readInt32(); 1376 if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1377 numPatchesReq = MAX_ITEMS_PER_LIST; 1378 } 1379 unsigned int numPatches = numPatchesReq; 1380 struct audio_patch *patches = 1381 (struct audio_patch *)calloc(numPatchesReq, 1382 sizeof(struct audio_patch)); 1383 if (patches == NULL) { 1384 reply->writeInt32(NO_MEMORY); 1385 reply->writeInt32(0); 1386 return NO_ERROR; 1387 } 1388 status_t status = listAudioPatches(&numPatches, patches); 1389 reply->writeInt32(status); 1390 reply->writeInt32(numPatches); 1391 if (status == NO_ERROR) { 1392 if (numPatchesReq > numPatches) { 1393 numPatchesReq = numPatches; 1394 } 1395 reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1396 } 1397 free(patches); 1398 return NO_ERROR; 1399 } break; 1400 case SET_AUDIO_PORT_CONFIG: { 1401 CHECK_INTERFACE(IAudioFlinger, data, reply); 1402 struct audio_port_config config; 1403 data.read(&config, sizeof(struct audio_port_config)); 1404 status_t status = setAudioPortConfig(&config); 1405 reply->writeInt32(status); 1406 return NO_ERROR; 1407 } break; 1408 case GET_AUDIO_HW_SYNC_FOR_SESSION: { 1409 CHECK_INTERFACE(IAudioFlinger, data, reply); 1410 reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32())); 1411 return NO_ERROR; 1412 } break; 1413 case SYSTEM_READY: { 1414 CHECK_INTERFACE(IAudioFlinger, data, reply); 1415 systemReady(); 1416 return NO_ERROR; 1417 } break; 1418 case FRAME_COUNT_HAL: { 1419 CHECK_INTERFACE(IAudioFlinger, data, reply); 1420 reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); 1421 return NO_ERROR; 1422 } break; 1423 case LIST_MICROPHONES: { 1424 CHECK_INTERFACE(IAudioFlinger, data, reply); 1425 std::vector<media::MicrophoneInfo> microphones; 1426 status_t status = getMicrophones(µphones); 1427 reply->writeInt32(status); 1428 if (status == NO_ERROR) { 1429 reply->writeParcelableVector(microphones); 1430 } 1431 return NO_ERROR; 1432 } 1433 default: 1434 return BBinder::onTransact(code, data, reply, flags); 1435 } 1436} 1437 1438// ---------------------------------------------------------------------------- 1439 1440} // namespace android 1441