IAudioFlinger.cpp revision 5f972c031d4061f4f037c9fda1ea4bd9b6a756cd
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, 355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten RESERVED, // obsolete, was 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, 73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten LOAD_HW_MODULE, 74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_SAMPLING_RATE, 75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_FRAME_COUNT, 764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten SET_LOW_RAM_DEVICE, 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 88fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t streamType, 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 9058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 91dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask, 92e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t frameCount, 93e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten track_flags_t *flags, 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 9572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 963acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid, 97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 98d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten String8& name, 99462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid, 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1035841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 105fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) streamType); 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1080d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 110b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 111e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten data.writeInt32(lFlags); 1123d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (sharedBuffer != 0) { 1133d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(true); 1143d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeStrongBinder(sharedBuffer->asBinder()); 1153d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 1163d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(false); 1173d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 11872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 1193acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten data.writeInt32((int32_t) tid); 120aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 121be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 122be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 123be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 124be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 125462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen data.writeInt32(clientUid); 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 12829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createTrack error: %s", strerror(-lStatus)); 1295841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 130e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten lFlags = reply.readInt32(); 131e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten if (flags != NULL) { 132e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten *flags = lFlags; 133e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten } 134be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 135be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 136be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 137be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 138d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten name = reply.readString8(); 1395841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1405841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 142507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1455841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 14972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input, 15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 15158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 15228b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten audio_channel_mask_t channelMask, 153e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t frameCount, 154eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t *flags, 1551879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid, 156be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1605841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 16272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) input); 16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1650d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 167eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 168eeca32671896739e84050da5992d5f151a1629deGlenn Kasten data.writeInt32(lFlags); 1691879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten data.writeInt32((int32_t) tid); 170aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 171be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 172be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 173be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 174be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 1755841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 1765841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 17729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("openRecord error: %s", strerror(-lStatus)); 1785841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 179eeca32671896739e84050da5992d5f151a1629deGlenn Kasten lFlags = reply.readInt32(); 180eeca32671896739e84050da5992d5f151a1629deGlenn Kasten if (flags != NULL) { 181eeca32671896739e84050da5992d5f151a1629deGlenn Kasten *flags = lFlags; 182eeca32671896739e84050da5992d5f151a1629deGlenn Kasten } 183be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 184be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 185be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 186be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1875841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1885841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 189e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (lStatus == NO_ERROR) { 190e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (record == 0) { 191e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten ALOGE("openRecord should have returned an IAudioRecord"); 192e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten lStatus = UNKNOWN_ERROR; 193e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 194e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } else { 195e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (record != 0) { 196e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten ALOGE("openRecord returned an IAudioRecord but with status %d", lStatus); 197e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten record.clear(); 198e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 199e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 2005841db78dff14898538200287d246577b1fc37e2Eric Laurent } 201507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 2045841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t sampleRate(audio_io_handle_t output) const 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 21172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 22258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual size_t frameCount(audio_io_handle_t output) const 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 27872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 282fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 28472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 289fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 293fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 303fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 30472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 309fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 313fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 318f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 34872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 35472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 35872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeStrongBinder(client->asBinder()); 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 372dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 373dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 379dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 384a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_io_handle_t openOutput(audio_module_handle_t module, 385a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t *pDevices, 386a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pSamplingRate, 387a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_format_t *pFormat, 388a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t *pChannelMask, 389a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pLatencyMs, 390ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 391ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 3947c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0; 3957c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0; 3967c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT; 3977c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_channel_mask_t channelMask = pChannelMask != NULL ? 3987c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten *pChannelMask : (audio_channel_mask_t)0; 3997c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0; 40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 401a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 405a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(channelMask); 406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(latency); 40718868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 408b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 409b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 410b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 411b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 412b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 413b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_OUTPUT, data, &reply); 41572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) reply.readInt32(); 41672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten ALOGV("openOutput() returned output, %d", output); 417a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent devices = (audio_devices_t)reply.readInt32(); 418507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pDevices != NULL) { 419507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pDevices = devices; 420507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 422507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pSamplingRate != NULL) { 423507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pSamplingRate = samplingRate; 424507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 42558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten format = (audio_format_t) reply.readInt32(); 426507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pFormat != NULL) { 427507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pFormat = format; 428507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 429a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent channelMask = (audio_channel_mask_t)reply.readInt32(); 430507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pChannelMask != NULL) { 431507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pChannelMask = channelMask; 432507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent latency = reply.readInt32(); 434507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pLatencyMs != NULL) { 435507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pLatencyMs = latency; 436507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return output; 438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 44072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 44172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 443c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 444c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 44572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 44672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 44872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 45172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 452c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 453c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 45572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 456c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 46072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 46472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 465c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 468c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 46972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 47372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 474c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 475c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 478a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_io_handle_t openInput(audio_module_handle_t module, 479a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t *pDevices, 480a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pSamplingRate, 481a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_format_t *pFormat, 482a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t *pChannelMask) 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 4857c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0; 4867c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0; 4877c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT; 4887c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_channel_mask_t channelMask = pChannelMask != NULL ? 4897c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten *pChannelMask : (audio_channel_mask_t)0; 490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 492a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 493c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 494c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 496a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(channelMask); 497c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_INPUT, data, &reply); 49872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) reply.readInt32(); 499a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent devices = (audio_devices_t)reply.readInt32(); 500507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pDevices != NULL) { 501507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pDevices = devices; 502507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 503c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 504507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pSamplingRate != NULL) { 505507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pSamplingRate = samplingRate; 506507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 50758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten format = (audio_format_t) reply.readInt32(); 508507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pFormat != NULL) { 509507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pFormat = format; 510507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 511a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent channelMask = (audio_channel_mask_t)reply.readInt32(); 512507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pChannelMask != NULL) { 513507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pChannelMask = channelMask; 514507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 515c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return input; 51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 517c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 518fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 522fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 523c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 524c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 52772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output) 52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 531fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 53272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 533c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_OUTPUT, data, &reply); 534c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 536f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 537f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 538f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 539f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 540f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 541f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 542f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 543f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 544f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 545342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 54626c77556efc30800466b60b3975bc35a70c8c28bGlenn Kasten virtual status_t getRenderPosition(size_t *halFrames, size_t *dspFrames, 54772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 548342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 549342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 550342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 55172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 552342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 553342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 554342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 555342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 556507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 557342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 558342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 559342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 560507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 561342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 562342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 563342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 564342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 565342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 56605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 5675f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 56805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 56905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 57005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 57172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 5725f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 5735f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 5745f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 5755f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 5765f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 57705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual int newAudioSessionId() 580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id = 0; 585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 5913a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen virtual void acquireAudioSessionId(int audioSession) 5923a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5933a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5943a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5953a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 5963a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 5973a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5983a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 5993a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen virtual void releaseAudioSessionId(int audioSession) 6003a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6013a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6023a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6033a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 6043a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 6053a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6063a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 607f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 6199d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 625f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 632ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 633ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6455e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 646f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6668d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 67072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId, 672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 680e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 681507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 682e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 683e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 684e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeStrongBinder(client->asBinder()); 689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 69072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 69529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 699507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 703a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 709507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 713be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 715de070137f11d346fba77605bd76a44c040a618fcEric Laurent 71672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, 71772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 718de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 719de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 720de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 721de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 72272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 72372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 724de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 725de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 726de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 727a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 728a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 729a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 730a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 731a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 732a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 733a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 734a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 735a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 736cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7373b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 738cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 739cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 740cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 741cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 742cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 743cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 744cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 745e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 746cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 747cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 748cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 749cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 750cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 751cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 752cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7534182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten virtual status_t setLowRamDevice(bool isLowRamDevice) 7544182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 7554182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 7564182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7574182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInt32((int) isLowRamDevice); 7584182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 7594182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return reply.readInt32(); 7604182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 7614182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten 76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 76389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 76489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 76589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 771e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 77658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 777dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 778e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t frameCount = data.readInt32(); 779a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 7803d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent bool haveSharedBuffer = data.readInt32() != 0; 7813d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IMemory> buffer; 7823d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (haveSharedBuffer) { 7833d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent buffer = interface_cast<IMemory>(data.readStrongBinder()); 7843d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 78572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 7863acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 787be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 788462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid = data.readInt32(); 789d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten String8 name; 79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 7913d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IAudioTrack> track; 7923d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if ((haveSharedBuffer && (buffer == 0)) || 7933d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ((buffer != 0) && (buffer->pointer() == NULL))) { 7943d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ALOGW("CREATE_TRACK: cannot retrieve shared memory"); 7953d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent status = DEAD_OBJECT; 7963d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 7973d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent track = createTrack( 7983d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent (audio_stream_type_t) streamType, sampleRate, format, 7993d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent channelMask, frameCount, &flags, buffer, output, tid, 800462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen &sessionId, name, clientUid, &status); 8013d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 802e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten reply->writeInt32(flags); 803be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 804d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten reply->writeString8(name); 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(track->asBinder()); 80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 81172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 81358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 814dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 815e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t frameCount = data.readInt32(); 816a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 8171879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 818be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 8208d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IAudioRecord> record = openRecord(input, 821eeca32671896739e84050da5992d5f151a1629deGlenn Kasten sampleRate, format, channelMask, frameCount, &flags, tid, &sessionId, &status); 822e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 823eeca32671896739e84050da5992d5f151a1629deGlenn Kasten reply->writeInt32(flags); 824be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(record->asBinder()); 82789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 83172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 83672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 84172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) ); 84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 84672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 849e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 87372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 874fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 880fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 886fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 887fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 893fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 898f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 91289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 91572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 917c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 919e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 920c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 92272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 923c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 924c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 925c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 926e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 927c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 93085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 93185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 93589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 93858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 939dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 940dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) ); 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 944c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 945a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 946a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 94858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 949a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 950c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = data.readInt32(); 9510ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 952b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 953b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 954b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 955b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 956b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 957a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_io_handle_t output = openOutput(module, 958a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &devices, 959a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &samplingRate, 960a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &format, 961a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &channelMask, 962a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &latency, 963b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 964b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 9653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("OPEN_OUTPUT output, %p", output); 96672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) output); 967c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 968c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 969c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 970a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(channelMask); 971c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(latency); 972c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 973c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 974c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 975c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 97672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 97772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 97872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 979c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 980c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 981c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 982c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 98372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 984c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 985c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 986c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 987c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 98872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 989c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 990c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 991c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 992c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 99372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 994c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 995c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 996c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 997c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 998a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 999a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1000c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 100158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1002a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 1003c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1004a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_io_handle_t input = openInput(module, 1005a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &devices, 1006a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &samplingRate, 1007a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &format, 1008a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &channelMask); 100972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) input); 1010c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 1011c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 1012c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 1013a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(channelMask); 1014c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1015c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1016c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1021c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_OUTPUT: { 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1023c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t stream = data.readInt32(); 102472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1025fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output)); 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1028f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1029f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1030f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1031f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1032f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1033f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1034342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1035342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 103672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1037e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t halFrames; 1038e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t dspFrames; 1039342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1040342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1041342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1042342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1043342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1044342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1045342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1046342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 104705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 104805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 104972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 10505f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 105105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 105205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 1053be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case NEW_AUDIO_SESSION_ID: { 1054be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1055be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(newAudioSessionId()); 1056be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1057be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 10583a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 10593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 10603a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 10613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen acquireAudioSessionId(audioSession); 10623a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 10633a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 10643a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 10653a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 10663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 10673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen releaseAudioSessionId(audioSession); 10683a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 10693a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1070be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1071be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1072be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t numEffects; 1073be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1074be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1075be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1076be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1077be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1078be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1079be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1080ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1081be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1082be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1083ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1084be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1085be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1086be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1087be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1088be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1089be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1090be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1091be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1092be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1093be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1094be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1095be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1096be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1097be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1098be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1099be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1100be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1101be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1102be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1103be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1104be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1105be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1106be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 110872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 1110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status; 1111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id; 1112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int enabled; 111305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 11148d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 111585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten &status, &id, &enabled); 1116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 1119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeStrongBinder(effect->asBinder()); 1120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1121be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1122be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1123de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1124de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1125de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 112672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 112772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1128de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1129de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1130de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1131a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1132a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1133a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1134a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1135a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1136cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1137cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1138cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1139cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1140cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1141cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1142cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1143cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputFrameCount()); 1144cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1145cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 11464182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 11474182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 11484182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten bool isLowRamDevice = data.readInt32() != 0; 11494182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten reply->writeInt32(setLowRamDevice(isLowRamDevice)); 11504182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 11514182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 115289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 115389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 115589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 115689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 115789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 115889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 1160