IAudioFlinger.cpp revision e995e477ad59b79145200c8f1e9e13c16c682d59
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, 8372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent GET_AUDIO_HW_SYNC, 8472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent SYSTEM_READY 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 87f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024 88f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 98fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t streamType, 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 10058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 101dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask, 10274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 103e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten track_flags_t *flags, 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 10572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 1063acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid, 107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 108462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid, 10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1125841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 114fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) streamType); 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1170d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 11874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 119e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(frameCount); 120b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 121e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten data.writeInt32(lFlags); 1222301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // haveSharedBuffer 1233d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (sharedBuffer != 0) { 1243d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(true); 12506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(sharedBuffer)); 1263d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 1273d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(false); 1283d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 12972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 1303acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten data.writeInt32((int32_t) tid); 131aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 132be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 133be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 134be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 135be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 136462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen data.writeInt32(clientUid); 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 13929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createTrack error: %s", strerror(-lStatus)); 1405841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 141b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten frameCount = reply.readInt64(); 14274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 14374935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 14474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 145e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten lFlags = reply.readInt32(); 146e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten if (flags != NULL) { 147e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten *flags = lFlags; 148e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten } 149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 150be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 151be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1535841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1545841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 1550cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (lStatus == NO_ERROR) { 1560cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track == 0) { 1570cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack should have returned an IAudioTrack"); 1580cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten lStatus = UNKNOWN_ERROR; 1590cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1600cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } else { 1610cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track != 0) { 1620cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus); 1630cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten track.clear(); 1640cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1650cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 167507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1705841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 17472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input, 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 17658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 17728b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten audio_channel_mask_t channelMask, 178be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName, 17974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 180eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t *flags, 1811879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid, 1824cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi int clientUid, 183be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 1847df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten size_t *notificationFrames, 185d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory>& cblk, 186d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory>& buffers, 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1905841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 19272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) input); 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1950d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 196eaa34703cb5f1acedb20cbcdff1ab79c11ff6857Dianne Hackborn data.writeString16(opPackageName); 19774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 198e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(frameCount); 199eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 200eeca32671896739e84050da5992d5f151a1629deGlenn Kasten data.writeInt32(lFlags); 2011879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten data.writeInt32((int32_t) tid); 2024cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi data.writeInt32((int32_t) clientUid); 203aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 204be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 205be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 206be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 2087410591dad836434c72ddee66680802708b70c10Glenn Kasten data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0); 209d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 210d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 2115841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 2125841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 21329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("openRecord error: %s", strerror(-lStatus)); 2145841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 215b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten frameCount = reply.readInt64(); 21674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 21774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 21874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 219eeca32671896739e84050da5992d5f151a1629deGlenn Kasten lFlags = reply.readInt32(); 220eeca32671896739e84050da5992d5f151a1629deGlenn Kasten if (flags != NULL) { 221eeca32671896739e84050da5992d5f151a1629deGlenn Kasten *flags = lFlags; 222eeca32671896739e84050da5992d5f151a1629deGlenn Kasten } 223be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 224be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 225be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 226be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 2277df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten size_t lNotificationFrames = (size_t) reply.readInt64(); 2287df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten if (notificationFrames != NULL) { 2297df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten *notificationFrames = lNotificationFrames; 2307df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten } 2315841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 2325841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 233d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk = interface_cast<IMemory>(reply.readStrongBinder()); 234d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (cblk != 0 && cblk->pointer() == NULL) { 235d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 236d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 237d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers = interface_cast<IMemory>(reply.readStrongBinder()); 238d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (buffers != 0 && buffers->pointer() == NULL) { 239d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 240d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 241e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (lStatus == NO_ERROR) { 242e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (record == 0) { 243e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten ALOGE("openRecord should have returned an IAudioRecord"); 244e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten lStatus = UNKNOWN_ERROR; 245d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } else if (cblk == 0) { 246d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten ALOGE("openRecord should have returned a cblk"); 247d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten lStatus = NO_MEMORY; 248e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 249d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten // buffers is permitted to be 0 250e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } else { 251d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (record != 0 || cblk != 0 || buffers != 0) { 252d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten ALOGE("openRecord returned an IAudioRecord, cblk, " 253d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten "or buffers but with status %d", lStatus); 254e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 255e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 256d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (lStatus != NO_ERROR) { 257d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten record.clear(); 258d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 259d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 260d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 2615841db78dff14898538200287d246577b1fc37e2Eric Laurent } 262507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 2655841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t sampleRate(audio_io_handle_t output) const 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 27272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 28172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 28358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual size_t frameCount(audio_io_handle_t output) const 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 292e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 33972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 343fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 34572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 350fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 354fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 364fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 36572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 370fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 374fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 379f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 41572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 41972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 42906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 433dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 434dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 440dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 442e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openOutput(audio_module_handle_t module, 446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *output, 447cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 448cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 449cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 450cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t *latencyMs, 451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_output_flags_t flags) 45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 458a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*devices); 461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 46218868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 467507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 469cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 471cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 472507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 473cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 474cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent ALOGV("openOutput() returned output, %d", *output); 475cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 476cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *devices = (audio_devices_t)reply.readInt32(); 477cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *latencyMs = reply.readInt32(); 478cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 479c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 480c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 48172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 48272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 483c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 484c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 485c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 48672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 48772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 488c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 48972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 491c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 49272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 493c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 494c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 495c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 49672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 497c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 50172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 50572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 506c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 509c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 51072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 51472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 515c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 516c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 518c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 519cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openInput(audio_module_handle_t module, 520cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *input, 521cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 522cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *device, 523cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 524cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source, 525cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_input_flags_t flags) 52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 527cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (input == NULL || config == NULL || device == NULL) { 528cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 529cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 532a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 533cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*input); 534cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 535cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*device); 536cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 537cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(source); 538ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten data.writeInt32(flags); 539cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_INPUT, data, &reply); 540cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 541cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 542cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 543507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 544cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 545cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 546cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 547cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 548507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 549cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = (audio_io_handle_t)reply.readInt32(); 550cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 551cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *device = (audio_devices_t)reply.readInt32(); 552cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 554c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 555fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 559fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 560c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 561c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 564d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten virtual status_t invalidateStream(audio_stream_type_t stream) 56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 568fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 569d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten remote()->transact(INVALIDATE_STREAM, data, &reply); 570c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 572f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 573f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 574f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 575f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 576f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 577f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 578f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 579f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 580f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 581342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 582377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 58372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 584342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 585342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 586342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 58772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 588342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 589342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 590342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 591342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 592507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 593342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 594342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 595342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 596507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 597342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 598342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 599342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 600342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 601342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 60205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 6035f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 60405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 60505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 60605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 60772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 6085f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 6095f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 6105f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 6115f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 6125f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 61305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 615de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent virtual audio_unique_id_t newAudioUniqueId() 616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 620de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent audio_unique_id_t id = AUDIO_SESSION_ALLOCATE; 621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 627d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen virtual void acquireAudioSessionId(int audioSession, int pid) 6283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6293a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6303a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 632d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 6343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 636d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen virtual void releaseAudioSessionId(int audioSession, int pid) 6373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 641d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 6433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 645f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 6579d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 663f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 670ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 671ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6835e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 684f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 695be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 7048d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 70872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId, 710be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName, 711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 713be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 718be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 719e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 720507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 721e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 722e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 723e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 726be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 72706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 72972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 730be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 731be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov data.writeString16(opPackageName); 732be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 733be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 734be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 73529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 736be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 738be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 739507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 740be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 741be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 742be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 743a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 744be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 745be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 746be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 747be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 748be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 749507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 750be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 751be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 752be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 753be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 754be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 755de070137f11d346fba77605bd76a44c040a618fcEric Laurent 75672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, 75772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 758de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 759de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 760de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 761de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 76272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 76372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 764de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 765de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 766de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 767a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 768a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 769a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 770a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 771a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 772a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 773a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 774a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 775a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 776cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7773b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 778cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 779cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 780cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 781cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 782cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 783cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 784cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 785e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 786cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 787cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 788cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 789cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 790e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 791cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 792cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7934182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten virtual status_t setLowRamDevice(bool isLowRamDevice) 7944182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 7954182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 7964182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7974182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInt32((int) isLowRamDevice); 7984182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 7994182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return reply.readInt32(); 8004182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPorts(unsigned int *num_ports, 8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports) 8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_ports); 8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_ports = (unsigned int)reply.readInt32(); 8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(ports, *num_ports * sizeof(struct audio_port)); 8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t getAudioPort(struct audio_port *port) 8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (port == NULL) { 8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(port, sizeof(struct audio_port)); 8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(port, sizeof(struct audio_port)); 8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t *handle) 8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (patch == NULL || handle == NULL) { 8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(patch, sizeof(struct audio_patch)); 8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 8654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches) 8664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 8684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_patches); 8734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 8744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_patches = (unsigned int)reply.readInt32(); 8794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(patches, *num_patches * sizeof(struct audio_patch)); 8804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 8834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (config == NULL) { 8854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(config, sizeof(struct audio_port_config)); 8904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 8914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 8924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 89693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 89793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent { 89893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent Parcel data, reply; 89993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 90093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInt32(sessionId); 90193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply); 90293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent if (status != NO_ERROR) { 90393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return AUDIO_HW_SYNC_INVALID; 90493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 90593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return (audio_hw_sync_t)reply.readInt32(); 90693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 90772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent virtual status_t systemReady() 90872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent { 90972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent Parcel data, reply; 91072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 91172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 91272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } 91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 922e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 92489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 92758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 928dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 929e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t frameCount = data.readInt64(); 930a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 9313d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent bool haveSharedBuffer = data.readInt32() != 0; 9323d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IMemory> buffer; 9333d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (haveSharedBuffer) { 9343d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent buffer = interface_cast<IMemory>(data.readStrongBinder()); 9353d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 93672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 9373acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 938be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 939462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid = data.readInt32(); 94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 9413d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IAudioTrack> track; 9423d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if ((haveSharedBuffer && (buffer == 0)) || 9433d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ((buffer != 0) && (buffer->pointer() == NULL))) { 9443d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ALOGW("CREATE_TRACK: cannot retrieve shared memory"); 9453d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent status = DEAD_OBJECT; 9463d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 9473d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent track = createTrack( 9483d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent (audio_stream_type_t) streamType, sampleRate, format, 94974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten channelMask, &frameCount, &flags, buffer, output, tid, 950c5a17425986b4ce3384e6956762c86018b49c4a0Glenn Kasten &sessionId, clientUid, &status); 9510cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 9523d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 953b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten reply->writeInt64(frameCount); 954e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten reply->writeInt32(flags); 955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 95706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(track)); 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 96272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 96458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 965dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 966be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName = data.readString16(); 967e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t frameCount = data.readInt64(); 968a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 9691879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 9704cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi int clientUid = data.readInt32(); 971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 9727410591dad836434c72ddee66680802708b70c10Glenn Kasten size_t notificationFrames = data.readInt64(); 973d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory> cblk; 974d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory> buffers; 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 9768d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IAudioRecord> record = openRecord(input, 977be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov sampleRate, format, channelMask, opPackageName, &frameCount, &flags, tid, 9784cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi clientUid, &sessionId, ¬ificationFrames, cblk, buffers, &status); 979e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 980b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten reply->writeInt64(frameCount); 981eeca32671896739e84050da5992d5f151a1629deGlenn Kasten reply->writeInt32(flags); 982be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 9837df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten reply->writeInt64(notificationFrames); 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 98506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(record)); 98606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(cblk)); 98706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(buffers)); 98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 99272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 99772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1002e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 100772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1010e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1033c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 103472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1035fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1041fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1047fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 1048fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1054fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1059f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1074c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 107672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1077c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 1078c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 1080e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1081c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 1082c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 108372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1084c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 1085c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1087e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 109185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 109285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 109958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1100dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1101e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 110389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 1105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1106a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1107e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1108e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1109e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1110e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1111a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1112cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 11130ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1114cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t latencyMs; 1115cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t output; 1116cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openOutput(module, &output, &config, 1117cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &devices, address, &latencyMs, flags); 11187074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten ALOGV("OPEN_OUTPUT output, %d", output); 1119cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)status); 1120cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)output); 1122cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1123cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(devices); 1124cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(latencyMs); 1125cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 1129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 113072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 113172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 113272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 113772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 1141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 114272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 1146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 114772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1152a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1153cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1154e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1155e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1156e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1157e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1158cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t device = (audio_devices_t)data.readInt32(); 1159cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 1160cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source = (audio_source_t)data.readInt32(); 1161ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1163cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openInput(module, &input, &config, 1164cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &device, address, source, flags); 1165cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) status); 1166cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1167cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) input); 1168cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1169cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(device); 1170cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1173c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 117489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 117572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 117689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 117789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1178d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten case INVALIDATE_STREAM: { 117989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1180d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1181d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten reply->writeInt32(invalidateStream(stream)); 118289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1184f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1185f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1186f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1187f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1188f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1189f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1190342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1191342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 119272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1193377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT uint32_t halFrames; 1194377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT uint32_t dspFrames; 1195342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1196342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1197342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1198342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1199342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1200342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1201342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1202342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 120305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 120405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 120572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 12065f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 120705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 120805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 1209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case NEW_AUDIO_SESSION_ID: { 1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1211de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent reply->writeInt32(newAudioUniqueId()); 1212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 12143a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 12153a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 12163a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 1217d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1218d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen acquireAudioSessionId(audioSession, pid); 12193a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12203a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 12213a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 12223a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 12233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 1224d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1225d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen releaseAudioSessionId(audioSession, pid); 12263a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1228be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1229be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1230be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t numEffects; 1231be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1238ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1239be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1240be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1241ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1246be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1247be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1249be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1250be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1251be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1252be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1253be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1259be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1261be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1262e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia effect_descriptor_t desc = {}; 1263e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1264e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1265e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1267be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 126872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1269be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 1270be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 opPackageName = data.readString16(); 1271be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status; 1272be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id; 1273be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int enabled; 127405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 12758d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1276be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov opPackageName, &status, &id, &enabled); 1277be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1278be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1279be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 128006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(effect)); 1281be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1282be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1283be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1284de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1285de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1286de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 128772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 128872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1289de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1290de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1291de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1292a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1293a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1294a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1295a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1296a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1297cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1298cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1299cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1300cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1301cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1302cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1303cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1304e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64(getPrimaryOutputFrameCount()); 1305cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1306cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 13074182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 13084182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 13094182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten bool isLowRamDevice = data.readInt32() != 0; 13104182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten reply->writeInt32(setLowRamDevice(isLowRamDevice)); 13114182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 13124182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 13134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PORTS: { 13144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1315f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPortsReq = data.readInt32(); 1316f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 1317f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 1318f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1319f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPorts = numPortsReq; 13204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports = 1321f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_port *)calloc(numPortsReq, 13224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_port)); 1323f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (ports == NULL) { 1324f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1325f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1326f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1327f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1328f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPorts(&numPorts, ports); 13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1330f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPorts); 13314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1332f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > numPorts) { 1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = numPorts; 1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1335f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 13364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(ports); 13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case GET_AUDIO_PORT: { 13414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1342e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1343e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1344e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1345e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = getAudioPort(&port); 13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&port, sizeof(struct audio_port)); 13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case CREATE_AUDIO_PATCH: { 13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch patch; 13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1357e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_patch_handle_t handle = {}; 1358e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1359e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1360e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = createAudioPatch(&patch, &handle); 13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case RELEASE_AUDIO_PATCH: { 13694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t handle; 13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = releaseAudioPatch(handle); 13734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PATCHES: { 13774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1378f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatchesReq = data.readInt32(); 1379f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1380f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 1381f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1382f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatches = numPatchesReq; 13834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches = 1384f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_patch *)calloc(numPatchesReq, 13854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_patch)); 1386f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (patches == NULL) { 1387f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1388f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1389f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1390f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1391f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPatches(&numPatches, patches); 13924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1393f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPatches); 13944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1395f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > numPatches) { 1396f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = numPatches; 1397f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1398f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 14004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(patches); 14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case SET_AUDIO_PORT_CONFIG: { 14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port_config config; 14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&config, sizeof(struct audio_port_config)); 14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = setAudioPortConfig(&config); 14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 141193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent case GET_AUDIO_HW_SYNC: { 141293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 141393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent reply->writeInt32(getAudioHwSyncForSession((audio_session_t)data.readInt32())); 141493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return NO_ERROR; 141593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } break; 141672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent case SYSTEM_READY: { 141772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 141872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent systemReady(); 141972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return NO_ERROR; 142072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } break; 142189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 142289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 142389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 142489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 142589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 142689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 142789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 142840bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1429