IAudioFlinger.cpp revision 0d255b2d9061ba31f13ada3fc0f7e51916407176
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, 50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PARAMETERS, 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_PARAMETERS, 5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project REGISTER_CLIENT, 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_INPUTBUFFERSIZE, 54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_OUTPUT, 55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_DUPLICATE_OUTPUT, 56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_OUTPUT, 57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SUSPEND_OUTPUT, 58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RESTORE_OUTPUT, 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_INPUT, 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_INPUT, 61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent SET_STREAM_OUTPUT, 62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent SET_VOICE_VOLUME, 6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_RENDER_POSITION, 64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_INPUT_FRAMES_LOST, 65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent NEW_AUDIO_SESSION_ID, 66be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent QUERY_NUM_EFFECTS, 67ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent QUERY_EFFECT, 68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_EFFECT_DESCRIPTOR, 69de070137f11d346fba77605bd76a44c040a618fcEric Laurent CREATE_EFFECT, 70de070137f11d346fba77605bd76a44c040a618fcEric Laurent MOVE_EFFECTS 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid, 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType, 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 850d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi uint32_t format, 860d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi uint32_t channelMask, 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int frameCount, 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags, 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 90fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output, 91be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 955841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(pid); 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(streamType); 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1010d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(flags); 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeStrongBinder(sharedBuffer->asBinder()); 105fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 106be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int lSessionId = 0; 107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 108be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("createTrack error: %s", strerror(-lStatus)); 1145841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1195841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1205841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status) { 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1255841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid, 130fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input, 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 1320d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi uint32_t format, 1330d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi uint32_t channelMask, 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int frameCount, 13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags, 136be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1405841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(pid); 143fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1460d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(flags); 149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int lSessionId = 0; 150be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 151be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 153be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 1545841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 1555841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 1565841db78dff14898538200287d246577b1fc37e2Eric Laurent LOGE("openRecord error: %s", strerror(-lStatus)); 1575841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 158be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 159be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 160be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 161be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1625841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1635841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 1645841db78dff14898538200287d246577b1fc37e2Eric Laurent } 16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status) { 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1685841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 171fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual uint32_t sampleRate(int output) const 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 175fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 180fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int channelCount(int output) const 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 184fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(CHANNEL_COUNT, data, &reply); 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1890d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi virtual uint32_t format(int output) const 19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 193fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 198fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual size_t frameCount(int output) const 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 202fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 207fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual uint32_t latency(int output) const 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 211fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 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(muted); 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 250fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t setStreamVolume(int stream, float value, int output) 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 256fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted) 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 271fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual float streamVolume(int stream, int output) const 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 276fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool streamMute(int stream) const 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(stream); 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 290c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMode(int mode) 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 303c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 316fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t setParameters(int ioHandle, const String8& keyValuePairs) 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 320fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(ioHandle); 321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 326fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual String8 getParameters(int ioHandle, const String8& keys) 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 330fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(ioHandle); 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeStrongBinder(client->asBinder()); 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channelCount); 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 355fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int openOutput(uint32_t *pDevices, 356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pSamplingRate, 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pFormat, 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pChannels, 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *pLatencyMs, 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t flags) 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = pDevices ? *pDevices : 0; 364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = pFormat ? *pFormat : 0; 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = pChannels ? *pChannels : 0; 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channels); 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(latency); 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(flags); 376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_OUTPUT, data, &reply); 377fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = reply.readInt32(); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent LOGV("openOutput() returned output, %p", output); 379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent devices = reply.readInt32(); 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pDevices) *pDevices = devices; 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format = reply.readInt32(); 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pFormat) *pFormat = format; 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent channels = reply.readInt32(); 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pChannels) *pChannels = channels; 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent latency = reply.readInt32(); 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pLatencyMs) *pLatencyMs = latency; 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return output; 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 392fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int openDuplicateOutput(int output1, int output2) 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 396fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output1); 397fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output2); 398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 399fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return reply.readInt32(); 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 402fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeOutput(int output) 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 406fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 411fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t suspendOutput(int output) 41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 415fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 420fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t restoreOutput(int output) 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 424fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 429fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual int openInput(uint32_t *pDevices, 430fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t *pSamplingRate, 431fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t *pFormat, 432fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t *pChannels, 433fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent uint32_t acoustics) 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = pDevices ? *pDevices : 0; 437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = pFormat ? *pFormat : 0; 439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = pChannels ? *pChannels : 0; 440c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 443c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 445c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channels); 446c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(acoustics); 447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_INPUT, data, &reply); 448fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input = reply.readInt32(); 449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent devices = reply.readInt32(); 450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pDevices) *pDevices = devices; 451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 452c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 453c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent format = reply.readInt32(); 454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pFormat) *pFormat = format; 455c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent channels = reply.readInt32(); 456c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pChannels) *pChannels = channels; 457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return input; 45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 460fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 464fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 465c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 466c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 469fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t setStreamOutput(uint32_t stream, int output) 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(stream); 474fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(output); 475c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_OUTPUT, data, &reply); 476c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 478f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 479f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 480f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 481f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 482f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 483f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 484f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 485f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 486f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 487342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 488342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) 489342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 490342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 491342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 492342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInt32(output); 493342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 494342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 495342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 496342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (halFrames) { 498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 500342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (dspFrames) { 502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 50705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 50805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent virtual unsigned int getInputFramesLost(int ioHandle) 50905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 51005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 51105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 51205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInt32(ioHandle); 51305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 51405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return reply.readInt32(); 51505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 516be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 517be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual int newAudioSessionId() 518be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 519be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 520be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 521be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 522be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id = 0; 523be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 524be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 525be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 526be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t queryNumberEffects(uint32_t *numEffects) 530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 531be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 533be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 535be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 536be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 537be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 538be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 539be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 540be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (numEffects) { 542be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 543be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 544be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 545be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 546be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 547ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) 548be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 549be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 550be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 551be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 552be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 553be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 554ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 555ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 562be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor) 568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual sp<IEffect> createEffect(pid_t pid, 588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int output, 592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId, 593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status) { 603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = BAD_VALUE; 604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(pid); 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeStrongBinder(client->asBinder()); 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(output); 613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent LOGE("createEffect error: %s", strerror(-lStatus)); 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (id) { 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (enabled) { 626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status) { 632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 637de070137f11d346fba77605bd76a44c040a618fcEric Laurent 638de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t moveEffects(int session, int srcOutput, int dstOutput) 639de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 640de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 641de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 642de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 643de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(srcOutput); 644de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(dstOutput); 645de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 646de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 647de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 65389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch(code) { 65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid = data.readInt32(); 66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format = data.readInt32(); 66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t bufferCount = data.readInt32(); 66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags = data.readInt32(); 66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 668fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 67189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IAudioTrack> track = createTrack(pid, 67289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project streamType, sampleRate, format, 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent channelCount, bufferCount, flags, buffer, output, &sessionId, &status); 674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 67589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(track->asBinder()); 67789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 67889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 67989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 68089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 68189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid = data.readInt32(); 682fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input = data.readInt32(); 68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format = data.readInt32(); 68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 68689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t bufferCount = data.readInt32(); 68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t flags = data.readInt32(); 688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent sp<IAudioRecord> record = openRecord(pid, input, 691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status); 692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(record->asBinder()); 69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 69689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 69889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 699fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( sampleRate(data.readInt32()) ); 70089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 70189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CHANNEL_COUNT: { 70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 704fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( channelCount(data.readInt32()) ); 70589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 70689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 70789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 70889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 709fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( format(data.readInt32()) ); 71089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 71189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 71289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 71389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 714fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( frameCount(data.readInt32()) ); 71589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 71789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 719fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32( latency(data.readInt32()) ); 72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 72189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 72289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_VOLUME: { 72389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 72589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 72689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 72789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 73289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 73489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 73689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 73789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 73989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 74089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 74189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 74289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 74389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 74489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 745c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 746fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 747c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32( setStreamVolume(stream, volume, output) ); 74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 74989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 75089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 75489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 75689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 75789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 75889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 759fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 760c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeFloat( streamVolume(stream, output) ); 76189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 76389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 76489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 76589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( streamMute(stream) ); 76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 77189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int mode = data.readInt32(); 77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 77789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 78289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 786c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 788fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int ioHandle = data.readInt32(); 789c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 790c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 792c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 793c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 794c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 795fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int ioHandle = data.readInt32(); 796c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 797c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 798c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 799c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 800c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int format = data.readInt32(); 81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 81489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 815c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 816c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 817c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = data.readInt32(); 818c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 819c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = data.readInt32(); 820c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = data.readInt32(); 821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = data.readInt32(); 822c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t flags = data.readInt32(); 823fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = openOutput(&devices, 824c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &samplingRate, 825c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &format, 826c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &channels, 827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &latency, 828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent flags); 829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent LOGV("OPEN_OUTPUT output, %p", output); 830fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(output); 831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 832c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 834c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(channels); 835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(latency); 836c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 839c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 840fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output1 = data.readInt32(); 841fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output2 = data.readInt32(); 842fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(openDuplicateOutput(output1, output2)); 843c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 844c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 847fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(closeOutput(data.readInt32())); 848c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 852fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(suspendOutput(data.readInt32())); 853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 857fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(restoreOutput(data.readInt32())); 858c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 859c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 860c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t devices = data.readInt32(); 863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t format = data.readInt32(); 865c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t channels = data.readInt32(); 866c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t acoutics = data.readInt32(); 867c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 868fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int input = openInput(&devices, 869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &samplingRate, 870c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &format, 871c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent &channels, 872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent acoutics); 873fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(input); 874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 877c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(channels); 878c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 879c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 882fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent reply->writeInt32(closeInput(data.readInt32())); 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_OUTPUT: { 88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t stream = data.readInt32(); 888fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setStreamOutput(stream, output)); 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 892f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 893f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 894f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 895f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 896f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 897f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 898342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 899342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 900342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent int output = data.readInt32(); 901342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t halFrames; 902342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t dspFrames; 903342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 904342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 905342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 906342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 907342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 908342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 909342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 910342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 91105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 91205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 91305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent int ioHandle = data.readInt32(); 91405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent reply->writeInt32(getInputFramesLost(ioHandle)); 91505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 91605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 917be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case NEW_AUDIO_SESSION_ID: { 918be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 919be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(newAudioSessionId()); 920be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 921be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 922be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 923be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 924be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t numEffects; 925be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 926be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 927be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 928be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 929be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 930be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 931be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 932ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 933be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 934be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 935ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 936be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 937be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 938be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 939be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 940be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 941be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 942be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 943be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 944be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 945be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 946be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 947be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 948be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 949be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 950be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 951be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 952be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 953be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 956be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent pid_t pid = data.readInt32(); 957be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 958be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 959be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 960be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 961be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int output = data.readInt32(); 962be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 963be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status; 964be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id; 965be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int enabled; 96605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 967be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled); 968be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 969be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 970be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeStrongBinder(effect->asBinder()); 972be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 973be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 974be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 975de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 976de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 977de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 978de070137f11d346fba77605bd76a44c040a618fcEric Laurent int srcOutput = data.readInt32(); 979de070137f11d346fba77605bd76a44c040a618fcEric Laurent int dstOutput = data.readInt32(); 980de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 981de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 982de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 991