IAudioFlinger.cpp revision 05bca2fde53bfe3063d2a0a877f2b6bfdd6052cf
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* //device/extlibs/pv/android/IAudioflinger.cpp 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 257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h> 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h> 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OPEN_RECORD, 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SAMPLE_RATE, 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHANNEL_COUNT, 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FORMAT, 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FRAME_COUNT, 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LATENCY, 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_VOLUME, 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_MUTE, 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_VOLUME, 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_MUTE, 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_VOLUME, 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_MUTE, 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_VOLUME, 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_MUTE, 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MODE, 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MIC_MUTE, 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_MIC_MUTE, 50b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent IS_STREAM_ACTIVE, 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PARAMETERS, 52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_PARAMETERS, 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project REGISTER_CLIENT, 5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_INPUTBUFFERSIZE, 55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_OUTPUT, 56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_DUPLICATE_OUTPUT, 57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_OUTPUT, 58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SUSPEND_OUTPUT, 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RESTORE_OUTPUT, 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_INPUT, 61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_INPUT, 62f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent SET_STREAM_OUTPUT, 63342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent SET_VOICE_VOLUME, 6405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_RENDER_POSITION, 6505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_INPUT_FRAMES_LOST 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid, 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType, 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format, 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount, 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int frameCount, 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags, 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 85fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output, 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 895841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(pid); 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(streamType); 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(channelCount); 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(flags); 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeStrongBinder(sharedBuffer->asBinder()); 99fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("createTrack error: %s", strerror(-lStatus)); 1035841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 1045841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1055841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status) { 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1105841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid, 115fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input, 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format, 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount, 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int frameCount, 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags, 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1245841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(pid); 127fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(channelCount); 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(flags); 1335841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 1345841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 1355841db78dff14898538200287d246577b1fc37e2Eric Laurent LOGE("openRecord error: %s", strerror(-lStatus)); 1365841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 1375841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1385841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 1395841db78dff14898538200287d246577b1fc37e2Eric Laurent } 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status) { 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1435841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 146fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual uint32_t sampleRate(int output) const 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 150fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 155fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int channelCount(int output) const 15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 159fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(CHANNEL_COUNT, data, &reply); 16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 164fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int format(int output) const 16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 168fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 173fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual size_t frameCount(int output) const 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 177fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 182fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual uint32_t latency(int output) const 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 186fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 225fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t setStreamVolume(int stream, float value, int output) 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 231fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted) 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 246fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual float streamVolume(int stream, int output) const 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 251fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool streamMute(int stream) const 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMode(int mode) 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 291b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent virtual bool isStreamActive(int stream) const 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 295b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent data.writeInt32(stream); 296b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent remote()->transact(IS_STREAM_ACTIVE, data, &reply); 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 300fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t setParameters(int ioHandle, const String8& keyValuePairs) 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 304fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(ioHandle); 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 310fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual String8 getParameters(int ioHandle, const String8& keys) 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 314fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(ioHandle); 315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeStrongBinder(client->asBinder()); 325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channelCount); 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 339fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int openOutput(uint32_t *pDevices, 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pSamplingRate, 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pFormat, 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pChannels, 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pLatencyMs, 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t flags) 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = pDevices ? *pDevices : 0; 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = pFormat ? *pFormat : 0; 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = pChannels ? *pChannels : 0; 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channels); 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(latency); 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(flags); 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_OUTPUT, data, &reply); 361fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = reply.readInt32(); 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent LOGV("openOutput() returned output, %p", output); 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent devices = reply.readInt32(); 364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pDevices) *pDevices = devices; 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format = reply.readInt32(); 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pFormat) *pFormat = format; 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent channels = reply.readInt32(); 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pChannels) *pChannels = channels; 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent latency = reply.readInt32(); 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pLatencyMs) *pLatencyMs = latency; 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return output; 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 376fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int openDuplicateOutput(int output1, int output2) 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 380fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output1); 381fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output2); 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 383fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return reply.readInt32(); 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 386fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeOutput(int output) 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 390fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 395fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t suspendOutput(int output) 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 399fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 404fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t restoreOutput(int output) 40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 408fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 413fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int openInput(uint32_t *pDevices, 414fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t *pSamplingRate, 415fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t *pFormat, 416fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t *pChannels, 417fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t acoustics) 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = pDevices ? *pDevices : 0; 421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = pFormat ? *pFormat : 0; 423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = pChannels ? *pChannels : 0; 424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 429c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channels); 430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(acoustics); 431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_INPUT, data, &reply); 432fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input = reply.readInt32(); 433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent devices = reply.readInt32(); 434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pDevices) *pDevices = devices; 435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format = reply.readInt32(); 438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pFormat) *pFormat = format; 439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent channels = reply.readInt32(); 440c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pChannels) *pChannels = channels; 441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return input; 44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 443c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 444fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 448fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 453fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t setStreamOutput(uint32_t stream, int output) 45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(stream); 458fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_OUTPUT, data, &reply); 460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 462f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 463f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 464f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 465f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 466f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 467f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 468f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 469f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 470f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 471342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 472342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) 473342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 474342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 475342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 476342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInt32(output); 477342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 478342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 479342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 480342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 481342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (halFrames) { 482342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 483342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 484342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 485342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (dspFrames) { 486342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 487342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 488342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 489342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 490342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 49105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 49205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent virtual unsigned int getInputFramesLost(int ioHandle) 49305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 49405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 49505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 49605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInt32(ioHandle); 49705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 49805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return reply.readInt32(); 49905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch(code) { 51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid = data.readInt32(); 51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format = data.readInt32(); 51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t bufferCount = data.readInt32(); 51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags = data.readInt32(); 51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 520fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IAudioTrack> track = createTrack(pid, 52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project streamType, sampleRate, format, 524c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent channelCount, bufferCount, flags, buffer, output, &status); 52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(track->asBinder()); 52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid = data.readInt32(); 532fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input = data.readInt32(); 53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format = data.readInt32(); 53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t bufferCount = data.readInt32(); 53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags = data.readInt32(); 53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 539c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent sp<IAudioRecord> record = openRecord(pid, input, 54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sampleRate, format, channelCount, bufferCount, flags, &status); 54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(record->asBinder()); 54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 547fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( sampleRate(data.readInt32()) ); 54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CHANNEL_COUNT: { 55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 552fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( channelCount(data.readInt32()) ); 55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 557fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( format(data.readInt32()) ); 55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 562fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( frameCount(data.readInt32()) ); 56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 567fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( latency(data.readInt32()) ); 56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_VOLUME: { 57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 593c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 594fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 595c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32( setStreamVolume(stream, volume, output) ); 59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 607fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 608c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeFloat( streamVolume(stream, output) ); 60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( streamMute(stream) ); 61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 61789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 61889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int mode = data.readInt32(); 62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 62189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 634b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent case IS_STREAM_ACTIVE: { 63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 636b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent int stream = data.readInt32(); 637b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent reply->writeInt32( isStreamActive(stream) ); 63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 640c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 642fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int ioHandle = data.readInt32(); 643c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 644c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 64589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 646c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 647c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 648c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 649fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int ioHandle = data.readInt32(); 650c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 651c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 652c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 653c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 654c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format = data.readInt32(); 66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 669c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 670c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 671c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = data.readInt32(); 672c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 673c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = data.readInt32(); 674c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = data.readInt32(); 675c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = data.readInt32(); 676c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t flags = data.readInt32(); 677fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = openOutput(&devices, 678c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &samplingRate, 679c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &format, 680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &channels, 681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &latency, 682c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent flags); 683c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent LOGV("OPEN_OUTPUT output, %p", output); 684fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(output); 685c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 686c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 687c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 688c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(channels); 689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(latency); 690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 691c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 692c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 693c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 694fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output1 = data.readInt32(); 695fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output2 = data.readInt32(); 696fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(openDuplicateOutput(output1, output2)); 697c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 698c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 699c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 700c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 701fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(closeOutput(data.readInt32())); 702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 704c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 705c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 706fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(suspendOutput(data.readInt32())); 707c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 708c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 711fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(restoreOutput(data.readInt32())); 712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 713c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 714c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 715c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 716c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = data.readInt32(); 717c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 718c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = data.readInt32(); 719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = data.readInt32(); 720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t acoutics = data.readInt32(); 721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 722fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input = openInput(&devices, 723c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &samplingRate, 724c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &format, 725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &channels, 726c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent acoutics); 727fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(input); 728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 730c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 731c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(channels); 732c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 733c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 734c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 736fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(closeInput(data.readInt32())); 73789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 739c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_OUTPUT: { 74089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 741c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t stream = data.readInt32(); 742fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 743c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setStreamOutput(stream, output)); 74489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 74589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 746f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 747f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 748f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 749f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 750f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 751f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 752342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 753342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 754342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent int output = data.readInt32(); 755342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t halFrames; 756342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t dspFrames; 757342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 758342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 759342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 760342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 761342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 762342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 763342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 764342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 76505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 76605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 76705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent int ioHandle = data.readInt32(); 76805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent reply->writeInt32(getInputFramesLost(ioHandle)); 76905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 77005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 77105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 77789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 780