IAudioFlinger.cpp revision a4c5a550e2a3bc237179b8684e51718e05894492
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License. 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License. 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/ 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger" 19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 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, 663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen ACQUIRE_AUDIO_SESSION_ID, 673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen RELEASE_AUDIO_SESSION_ID, 68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent QUERY_NUM_EFFECTS, 69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent QUERY_EFFECT, 70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_EFFECT_DESCRIPTOR, 71de070137f11d346fba77605bd76a44c040a618fcEric Laurent CREATE_EFFECT, 72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent MOVE_EFFECTS, 73a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent LOAD_HW_MODULE 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid, 86fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t streamType, 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 8858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 890d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi uint32_t channelMask, 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int frameCount, 91a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags, 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 9372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 94be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 985841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(pid); 101fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) streamType); 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1040d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 106a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten data.writeInt32((int32_t) flags); 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeStrongBinder(sharedBuffer->asBinder()); 10872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int lSessionId = 0; 110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 113be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 11629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createTrack error: %s", strerror(-lStatus)); 1175841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 121be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1225841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1235841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status) { 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1285841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid, 13372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input, 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 13558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 1360d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi uint32_t channelMask, 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int frameCount, 138a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags, 139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1435841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(pid); 14672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) input); 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1490d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(flags); 152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int lSessionId = 0; 153be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 154be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 155be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 156be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 1575841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 1585841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 15929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("openRecord error: %s", strerror(-lStatus)); 1605841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 161be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 162be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 164be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1655841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1665841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 1675841db78dff14898538200287d246577b1fc37e2Eric Laurent } 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status) { 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1715841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t sampleRate(audio_io_handle_t output) const 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 17872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 18372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual int channelCount(audio_io_handle_t output) const 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 18772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(CHANNEL_COUNT, data, &reply); 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 19272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 19672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 19858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual size_t frameCount(audio_io_handle_t output) const 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 20572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 21472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 25472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 258fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 26072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 265fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 269fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 279fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 28072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 285fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 289fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 294f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 303c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 33472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeStrongBinder(client->asBinder()); 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 348f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, int channelCount) const 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channelCount); 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 359a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_io_handle_t openOutput(audio_module_handle_t module, 360a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t *pDevices, 361a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pSamplingRate, 362a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_format_t *pFormat, 363a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t *pChannelMask, 364a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pLatencyMs, 365a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_policy_output_flags_t flags) 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 368a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = pDevices ? *pDevices : (audio_devices_t)0; 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 37058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT; 371a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = pChannelMask ? *pChannelMask : (audio_channel_mask_t)0; 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 375a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 379a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(channelMask); 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(latency); 38118868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_OUTPUT, data, &reply); 38372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) reply.readInt32(); 38472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten ALOGV("openOutput() returned output, %d", output); 385a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent devices = (audio_devices_t)reply.readInt32(); 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pDevices) *pDevices = devices; 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 38958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten format = (audio_format_t) reply.readInt32(); 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pFormat) *pFormat = format; 391a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent channelMask = (audio_channel_mask_t)reply.readInt32(); 392a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent if (pChannelMask) *pChannelMask = channelMask; 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent latency = reply.readInt32(); 394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pLatencyMs) *pLatencyMs = latency; 395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return output; 396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 39972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 40472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 40672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 40972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 41372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 41872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 42272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 42772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 43172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 436a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_io_handle_t openInput(audio_module_handle_t module, 437a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t *pDevices, 438a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pSamplingRate, 439a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_format_t *pFormat, 440a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t *pChannelMask) 44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 443a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = pDevices ? *pDevices : (audio_devices_t)0; 444c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 44558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT; 446a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = pChannelMask ? *pChannelMask : (audio_channel_mask_t)0; 447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 449a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 453a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(channelMask); 454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_INPUT, data, &reply); 45572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) reply.readInt32(); 456a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent devices = (audio_devices_t)reply.readInt32(); 457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pDevices) *pDevices = devices; 458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 46058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten format = (audio_format_t) reply.readInt32(); 461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (pFormat) *pFormat = format; 462a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent channelMask = (audio_channel_mask_t)reply.readInt32(); 463a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent if (pChannelMask) *pChannelMask = channelMask; 464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return input; 46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 466c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 467fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 471fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 472c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 47672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output) 47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 480fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 48172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 482c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_OUTPUT, data, &reply); 483c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 485f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 486f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 487f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 488f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 489f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 490f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 491f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 492f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 493f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 494342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 49572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 49672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 50072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (halFrames) { 506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (dspFrames) { 510342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 512342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 514342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 51505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 51672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual unsigned int getInputFramesLost(audio_io_handle_t ioHandle) const 51705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 51805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 51905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 52072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 52105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 52205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return reply.readInt32(); 52305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 524be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 525be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual int newAudioSessionId() 526be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id = 0; 531be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 533be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 535be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 536be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 5373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen virtual void acquireAudioSessionId(int audioSession) 5383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 5423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 5433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen virtual void releaseAudioSessionId(int audioSession) 5463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 5503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 5513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 553f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 554be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 555be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 562be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 5659d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 571f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 578ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 579ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 5915e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 592f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual sp<IEffect> createEffect(pid_t pid, 613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 61672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId, 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 626e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 627e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten if (status) { 628e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 629e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 630e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(pid); 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeStrongBinder(client->asBinder()); 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 63772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 64229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (id) { 647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 650a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status) { 657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 662de070137f11d346fba77605bd76a44c040a618fcEric Laurent 66372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, 66472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 665de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 666de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 667de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 668de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 66972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 67072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 671de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 672de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 673de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 674a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 675a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 676a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 677a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 678a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 679a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 680a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 681a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 682a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 68689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 69089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 69189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 692e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid = data.readInt32(); 69689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 69858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 69989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 70089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t bufferCount = data.readInt32(); 701a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 70372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 70589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 70689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IAudioTrack> track = createTrack(pid, 707fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten (audio_stream_type_t) streamType, sampleRate, format, 708a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten channelCount, bufferCount, flags, buffer, output, &sessionId, &status); 709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 71089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 71189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(track->asBinder()); 71289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 71389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 71489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 71589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid = data.readInt32(); 71772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 71958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 72189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t bufferCount = data.readInt32(); 722a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent sp<IAudioRecord> record = openRecord(pid, input, 726be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status); 727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(record->asBinder()); 73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 73289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 73472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 73689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 73789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CHANNEL_COUNT: { 73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 73972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( channelCount((audio_io_handle_t) data.readInt32()) ); 74089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 74189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 74289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 74389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 74472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 74589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 74689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 74789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 74972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) ); 75089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 75472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 75689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 757e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 75889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 75989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 76089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 76189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 76389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 76489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 76589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 77189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 77789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 780c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 78172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 782fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 788fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 794fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 795fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 801fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 806f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 81489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 81589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 82372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 824c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 825c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 827e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 83072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 832c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 834e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 84558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int channelCount = data.readInt32(); 84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 852a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 853a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 85558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 856a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = data.readInt32(); 85818868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten audio_policy_output_flags_t flags = (audio_policy_output_flags_t) data.readInt32(); 859a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_io_handle_t output = openOutput(module, 860a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &devices, 861a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &samplingRate, 862a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &format, 863a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &channelMask, 864a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &latency, 865a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent flags); 8663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("OPEN_OUTPUT output, %p", output); 86772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) output); 868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 870c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 871a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(channelMask); 872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(latency); 873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 87772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 87872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 87972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 88472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 88972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 89472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 899a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 900a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 901c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 90258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 903a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 905a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_io_handle_t input = openInput(module, 906a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &devices, 907a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &samplingRate, 908a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &format, 909a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &channelMask); 91072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) input); 911c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 914a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(channelMask); 915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 917c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 91972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_OUTPUT: { 92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 924c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t stream = data.readInt32(); 92572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 926fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output)); 92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 929f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 930f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 931f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 932f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 933f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 934f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 935342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 936342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 93772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 938342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t halFrames; 939342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t dspFrames; 940342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 941342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 942342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 943342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 944342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 945342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 946342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 947342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 94805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 94905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 95072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 95105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent reply->writeInt32(getInputFramesLost(ioHandle)); 95205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 95305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case NEW_AUDIO_SESSION_ID: { 955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 956be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(newAudioSessionId()); 957be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 958be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 9593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 9603a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 9613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 9623a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen acquireAudioSessionId(audioSession); 9633a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 9643a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 9653a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 9663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 9673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 9683a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen releaseAudioSessionId(audioSession); 9693a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 9703a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 972be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 973be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t numEffects; 974be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 975be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 976be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 977be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 978be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 979be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 980be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 981ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 982be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 983be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 984ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 985be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 986be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 987be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 988be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 989be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 990be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 991be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 992be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 993be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 994be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 995be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 996be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 997be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 998be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 999be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1000be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1001be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1002be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1003be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1004be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1005be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent pid_t pid = data.readInt32(); 1006be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1007be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1008be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1009be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 101072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1011be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 1012be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status; 1013be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id; 1014be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int enabled; 101505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 1016be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled); 1017be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1018be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1019be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 1020be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeStrongBinder(effect->asBinder()); 1021be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1022be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1023be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1024de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1025de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1026de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 102772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 102872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1029de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1030de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1031de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1032a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1033a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1034a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1035a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1036a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 1045