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, 61d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten INVALIDATE_STREAM, 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, 774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PORTS, 784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent GET_AUDIO_PORT, 794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CREATE_AUDIO_PATCH, 804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent RELEASE_AUDIO_PATCH, 814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PATCHES, 8293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent SET_AUDIO_PORT_CONFIG, 8393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent GET_AUDIO_HW_SYNC 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 95fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t streamType, 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 9758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 98dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask, 9974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 100e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten track_flags_t *flags, 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 10272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 1033acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid, 104be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 105462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid, 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1095841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 111fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) streamType); 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1140d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 11574935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 116e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(frameCount); 117b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 118e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten data.writeInt32(lFlags); 1192301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // haveSharedBuffer 1203d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (sharedBuffer != 0) { 1213d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(true); 1223d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeStrongBinder(sharedBuffer->asBinder()); 1233d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 1243d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(false); 1253d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 12672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 1273acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten data.writeInt32((int32_t) tid); 128aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 131be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 132be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 133462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen data.writeInt32(clientUid); 13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 13629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createTrack error: %s", strerror(-lStatus)); 1375841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 138b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten frameCount = reply.readInt64(); 13974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 14074935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 14174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 142e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten lFlags = reply.readInt32(); 143e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten if (flags != NULL) { 144e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten *flags = lFlags; 145e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten } 146be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 147be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 148be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1505841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1515841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 1520cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (lStatus == NO_ERROR) { 1530cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track == 0) { 1540cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack should have returned an IAudioTrack"); 1550cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten lStatus = UNKNOWN_ERROR; 1560cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1570cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } else { 1580cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track != 0) { 1590cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus); 1600cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten track.clear(); 1610cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1620cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 164507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1675841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 17172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input, 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 17358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 17428b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten audio_channel_mask_t channelMask, 17574935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 176eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t *flags, 1771879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid, 178be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 1797df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten size_t *notificationFrames, 180d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory>& cblk, 181d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory>& buffers, 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1855841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 18772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) input); 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1900d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 19174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 192e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(frameCount); 193eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 194eeca32671896739e84050da5992d5f151a1629deGlenn Kasten data.writeInt32(lFlags); 1951879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten data.writeInt32((int32_t) tid); 196aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 197be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 198be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 199be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 200be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 2017410591dad836434c72ddee66680802708b70c10Glenn Kasten data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0); 202d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 203d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 2045841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 2055841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 20629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("openRecord error: %s", strerror(-lStatus)); 2075841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 208b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten frameCount = reply.readInt64(); 20974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 21074935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 21174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 212eeca32671896739e84050da5992d5f151a1629deGlenn Kasten lFlags = reply.readInt32(); 213eeca32671896739e84050da5992d5f151a1629deGlenn Kasten if (flags != NULL) { 214eeca32671896739e84050da5992d5f151a1629deGlenn Kasten *flags = lFlags; 215eeca32671896739e84050da5992d5f151a1629deGlenn Kasten } 216be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 217be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 218be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 2207df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten size_t lNotificationFrames = (size_t) reply.readInt64(); 2217df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten if (notificationFrames != NULL) { 2227df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten *notificationFrames = lNotificationFrames; 2237df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten } 2245841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 2255841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 226d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk = interface_cast<IMemory>(reply.readStrongBinder()); 227d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (cblk != 0 && cblk->pointer() == NULL) { 228d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 229d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 230d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers = interface_cast<IMemory>(reply.readStrongBinder()); 231d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (buffers != 0 && buffers->pointer() == NULL) { 232d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 233d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 234e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (lStatus == NO_ERROR) { 235e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (record == 0) { 236e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten ALOGE("openRecord should have returned an IAudioRecord"); 237e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten lStatus = UNKNOWN_ERROR; 238d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } else if (cblk == 0) { 239d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten ALOGE("openRecord should have returned a cblk"); 240d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten lStatus = NO_MEMORY; 241e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 242d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten // buffers is permitted to be 0 243e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } else { 244d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (record != 0 || cblk != 0 || buffers != 0) { 245d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten ALOGE("openRecord returned an IAudioRecord, cblk, " 246d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten "or buffers but with status %d", lStatus); 247e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 248e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 249d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (lStatus != NO_ERROR) { 250d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten record.clear(); 251d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 252d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 253d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 2545841db78dff14898538200287d246577b1fc37e2Eric Laurent } 255507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 2585841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t sampleRate(audio_io_handle_t output) const 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 26572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 27472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 27658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual size_t frameCount(audio_io_handle_t output) const 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 28372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 285e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 33272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 336fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 33872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 343fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 347fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 35372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 357fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 35872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 363fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 367fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 372f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 39872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 41272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 415c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 417c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 418c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeStrongBinder(client->asBinder()); 423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 426dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 427dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 429c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 433dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 435e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openOutput(audio_module_handle_t module, 439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *output, 440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 442cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t *latencyMs, 444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_output_flags_t flags) 44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 447cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 448cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 451a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 452cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*devices); 454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 45518868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 460507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 465507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 467cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent ALOGV("openOutput() returned output, %d", *output); 468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 469cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *devices = (audio_devices_t)reply.readInt32(); 470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *latencyMs = reply.readInt32(); 471cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 472c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 47472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 47572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 476c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 478c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 47972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 48072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 481c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 48272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 483c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 484c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 48572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 487c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 488c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 48972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 49472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 49872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 499c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 502c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 50372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 50772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 508c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 509c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 511c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 512cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openInput(audio_module_handle_t module, 513cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *input, 514cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 515cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *device, 516cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 517cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source, 518cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_input_flags_t flags) 51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 520cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (input == NULL || config == NULL || device == NULL) { 521cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 522cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 525a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 526cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*input); 527cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 528cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*device); 529cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 530cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(source); 531ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten data.writeInt32(flags); 532cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_INPUT, data, &reply); 533cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 534cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 535cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 536507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 537cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 538cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 539cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 540cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 541507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 542cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = (audio_io_handle_t)reply.readInt32(); 543cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 544cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *device = (audio_devices_t)reply.readInt32(); 545cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 547c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 548fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 552fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 553c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 554c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 557d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten virtual status_t invalidateStream(audio_stream_type_t stream) 55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 561fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 562d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten remote()->transact(INVALIDATE_STREAM, data, &reply); 563c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 565f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 566f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 567f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 568f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 569f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 570f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 571f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 572f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 573f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 574342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 575377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 57672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 577342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 578342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 579342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 58072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 581342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 582342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 583342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 584342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 585507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 586342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 587342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 588342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 589507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 590342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 591342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 592342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 593342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 594342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 59505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 5965f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 59705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 59805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 59905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 60072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 6015f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 6025f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 6035f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 6045f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 6055f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 60605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 608de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent virtual audio_unique_id_t newAudioUniqueId() 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 613de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent audio_unique_id_t id = AUDIO_SESSION_ALLOCATE; 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 620d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen virtual void acquireAudioSessionId(int audioSession, int pid) 6213a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6223a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6243a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 625d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6263a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 6273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 629d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen virtual void releaseAudioSessionId(int audioSession, int pid) 6303a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6323a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 634d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 6363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 638f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 6509d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 656f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 663ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 664ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6765e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 677f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 683be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 684be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 695be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6978d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 70172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId, 703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 711e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 712507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 713e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 714e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 715e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 718be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeStrongBinder(client->asBinder()); 720be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 72172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 722be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 72629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 729be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 730507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 731be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 732be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 733be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 734a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 735be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 736be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 738be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 739be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 740507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 741be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 742be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 743be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 744be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 745be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 746de070137f11d346fba77605bd76a44c040a618fcEric Laurent 74772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, 74872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 749de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 750de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 751de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 752de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 75372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 75472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 755de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 756de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 757de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 758a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 759a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 760a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 761a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 762a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 763a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 764a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 765a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 766a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 767cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7683b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 769cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 770cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 771cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 772cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 773cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 774cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 775cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 776e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 777cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 778cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 779cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 780cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 781e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 782cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 783cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7844182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten virtual status_t setLowRamDevice(bool isLowRamDevice) 7854182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 7864182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 7874182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7884182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInt32((int) isLowRamDevice); 7894182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 7904182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return reply.readInt32(); 7914182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPorts(unsigned int *num_ports, 7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports) 7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_ports); 8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_ports = (unsigned int)reply.readInt32(); 8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(ports, *num_ports * sizeof(struct audio_port)); 8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t getAudioPort(struct audio_port *port) 8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (port == NULL) { 8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(port, sizeof(struct audio_port)); 8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(port, sizeof(struct audio_port)); 8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t *handle) 8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (patch == NULL || handle == NULL) { 8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(patch, sizeof(struct audio_patch)); 8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches) 8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_patches); 8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 8654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_patches = (unsigned int)reply.readInt32(); 8704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(patches, *num_patches * sizeof(struct audio_patch)); 8714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 8744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (config == NULL) { 8764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(config, sizeof(struct audio_port_config)); 8814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 8824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 8834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 88793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 88893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent { 88993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent Parcel data, reply; 89093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 89193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInt32(sessionId); 89293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply); 89393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent if (status != NO_ERROR) { 89493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return AUDIO_HW_SYNC_INVALID; 89593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 89693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return (audio_hw_sync_t)reply.readInt32(); 89793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 907e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 91258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 913dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 914e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t frameCount = data.readInt64(); 915a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 9163d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent bool haveSharedBuffer = data.readInt32() != 0; 9173d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IMemory> buffer; 9183d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (haveSharedBuffer) { 9193d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent buffer = interface_cast<IMemory>(data.readStrongBinder()); 9203d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 92172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 9223acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 923be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 924462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid = data.readInt32(); 92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 9263d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IAudioTrack> track; 9273d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if ((haveSharedBuffer && (buffer == 0)) || 9283d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ((buffer != 0) && (buffer->pointer() == NULL))) { 9293d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ALOGW("CREATE_TRACK: cannot retrieve shared memory"); 9303d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent status = DEAD_OBJECT; 9313d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 9323d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent track = createTrack( 9333d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent (audio_stream_type_t) streamType, sampleRate, format, 93474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten channelMask, &frameCount, &flags, buffer, output, tid, 935c5a17425986b4ce3384e6956762c86018b49c4a0Glenn Kasten &sessionId, clientUid, &status); 9360cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 9373d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 938b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten reply->writeInt64(frameCount); 939e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten reply->writeInt32(flags); 940be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(track->asBinder()); 94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 94689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 94772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 94958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 950dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 951e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t frameCount = data.readInt64(); 952a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 9531879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 9557410591dad836434c72ddee66680802708b70c10Glenn Kasten size_t notificationFrames = data.readInt64(); 956d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory> cblk; 957d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory> buffers; 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 9598d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IAudioRecord> record = openRecord(input, 960d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sampleRate, format, channelMask, &frameCount, &flags, tid, &sessionId, 9617df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten ¬ificationFrames, 962d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk, buffers, &status); 963e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 964b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten reply->writeInt64(frameCount); 965eeca32671896739e84050da5992d5f151a1629deGlenn Kasten reply->writeInt32(flags); 966be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 9677df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten reply->writeInt64(notificationFrames); 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(record->asBinder()); 970d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten reply->writeStrongBinder(cblk->asBinder()); 971d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten reply->writeStrongBinder(buffers->asBinder()); 97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 97672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 98172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 986e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 99172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 994e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1017c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 101872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1019fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1025fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1031fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 1032fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 103589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1038fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1043f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1058c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 106072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1061c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 1062c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 1064e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1065c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 1066c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 106772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1068c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 1069c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 1070c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1071e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1072c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 107585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 107685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 108358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1084dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1085e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1090a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1091cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t config; 1092cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.read(&config, sizeof(audio_config_t)); 1093a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1094cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 10950ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1096cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t latencyMs; 1097cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t output; 1098cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openOutput(module, &output, &config, 1099cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &devices, address, &latencyMs, flags); 11007074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten ALOGV("OPEN_OUTPUT output, %d", output); 1101cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)status); 1102cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1103cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)output); 1104cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1105cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(devices); 1106cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(latencyMs); 1107cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 1111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 111272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 111372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 111472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 1118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 111972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 1123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 112472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 1128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 112972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1134a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1135cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1136cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t config; 1137cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.read(&config, sizeof(audio_config_t)); 1138cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t device = (audio_devices_t)data.readInt32(); 1139cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 1140cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source = (audio_source_t)data.readInt32(); 1141ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1143cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openInput(module, &input, &config, 1144cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &device, address, source, flags); 1145cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) status); 1146cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1147cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) input); 1148cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1149cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(device); 1150cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 115572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 115689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 115789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1158d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten case INVALIDATE_STREAM: { 115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1160d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1161d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten reply->writeInt32(invalidateStream(stream)); 116289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 116389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1164f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1165f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1166f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1167f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1168f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1169f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1170342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1171342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 117272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1173377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT uint32_t halFrames; 1174377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT uint32_t dspFrames; 1175342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1176342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1177342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1178342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1179342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1180342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1181342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1182342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 118305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 118405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 118572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 11865f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 118705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 118805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 1189be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case NEW_AUDIO_SESSION_ID: { 1190be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1191de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent reply->writeInt32(newAudioUniqueId()); 1192be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1193be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 11943a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 11953a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 11963a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 1197d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1198d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen acquireAudioSessionId(audioSession, pid); 11993a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12003a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 12013a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 12023a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 12033a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 1204d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1205d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen releaseAudioSessionId(audioSession, pid); 12063a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12073a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1208be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t numEffects; 1211be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1214be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1215be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1216be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1217be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1218ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1220be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1221ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1222be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1223be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1224be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1225be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1226be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1227be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1228be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1229be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1230be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1231be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1238be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1239be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1240be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1241be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 124672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1247be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status; 1249be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id; 1250be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int enabled; 125105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 12528d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 125385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten &status, &id, &enabled); 1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeStrongBinder(effect->asBinder()); 1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1259be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1261de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1262de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1263de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 126472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 126572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1266de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1267de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1268de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1269a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1270a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1271a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1272a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1273a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1274cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1275cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1276cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1277cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1278cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1279cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1280cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1281e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64(getPrimaryOutputFrameCount()); 1282cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1283cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 12844182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 12854182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 12864182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten bool isLowRamDevice = data.readInt32() != 0; 12874182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten reply->writeInt32(setLowRamDevice(isLowRamDevice)); 12884182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 12894182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 12904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PORTS: { 12914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 12924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent unsigned int num_ports = data.readInt32(); 12934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports = 12944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (struct audio_port *)calloc(num_ports, 12954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_port)); 12964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = listAudioPorts(&num_ports, ports); 12974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 12984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 12994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(num_ports); 13004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&ports, num_ports * sizeof(struct audio_port)); 13014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(ports); 13034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case GET_AUDIO_PORT: { 13064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port port; 13084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&port, sizeof(struct audio_port)); 13094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = getAudioPort(&port); 13104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&port, sizeof(struct audio_port)); 13134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case CREATE_AUDIO_PATCH: { 13174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch patch; 13194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&patch, sizeof(struct audio_patch)); 13204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t handle; 13214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 13224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = createAudioPatch(&patch, &handle); 13234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 13264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case RELEASE_AUDIO_PATCH: { 13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t handle; 13324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 13334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = releaseAudioPatch(handle); 13344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PATCHES: { 13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent unsigned int num_patches = data.readInt32(); 13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches = 13414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (struct audio_patch *)calloc(num_patches, 13424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_patch)); 13434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = listAudioPatches(&num_patches, patches); 13444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(num_patches); 13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&patches, num_patches * sizeof(struct audio_patch)); 13484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(patches); 13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case SET_AUDIO_PORT_CONFIG: { 13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port_config config; 13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&config, sizeof(struct audio_port_config)); 13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = setAudioPortConfig(&config); 13574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 136093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent case GET_AUDIO_HW_SYNC: { 136193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 136293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent reply->writeInt32(getAudioHwSyncForSession((audio_session_t)data.readInt32())); 136393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return NO_ERROR; 136493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } break; 136589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 136689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 136789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 136889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 136989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 137189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 1373