IAudioFlinger.cpp revision 25a9e5561a7f14e79b04f713a515a9464b9ea077
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 2725a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "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, 844a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten SYSTEM_READY, 854a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten FRAME_COUNT_HAL, 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 88f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024 89f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 93090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioFlinger(const sp<IBinder>& impl) 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 99fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t streamType, 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 10158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 102dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask, 10374935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 104050677873c10d4da308ac222f8533c96cca3207eEric Laurent audio_output_flags_t *flags, 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 10672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 1079ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George pid_t pid, 1083acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid, 109d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t *sessionId, 110462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid, 11120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent status_t *status, 11220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId) 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1155841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 117fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) streamType); 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1200d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 12174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 122e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(frameCount); 123050677873c10d4da308ac222f8533c96cca3207eEric Laurent audio_output_flags_t lFlags = flags != NULL ? *flags : AUDIO_OUTPUT_FLAG_NONE; 124e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten data.writeInt32(lFlags); 1252301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten // haveSharedBuffer 1263d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (sharedBuffer != 0) { 1273d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(true); 12806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(sharedBuffer)); 1293d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 1303d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(false); 1313d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 13272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 1339ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George data.writeInt32((int32_t) pid); 1343acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten data.writeInt32((int32_t) tid); 135d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE; 136be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 137be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 138be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 140462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen data.writeInt32(clientUid); 14120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.writeInt32(portId); 14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 14429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createTrack error: %s", strerror(-lStatus)); 1455841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 146b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten frameCount = reply.readInt64(); 14774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 14874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 14974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 150050677873c10d4da308ac222f8533c96cca3207eEric Laurent lFlags = (audio_output_flags_t)reply.readInt32(); 151e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten if (flags != NULL) { 152e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten *flags = lFlags; 153e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten } 154d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten lSessionId = (audio_session_t) reply.readInt32(); 155be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 156be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 157be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1585841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1595841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 1600cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (lStatus == NO_ERROR) { 1610cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track == 0) { 1620cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack should have returned an IAudioTrack"); 1630cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten lStatus = UNKNOWN_ERROR; 1640cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1650cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } else { 1660cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track != 0) { 1670cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus); 1680cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten track.clear(); 1690cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1700cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 172507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1755841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 17972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input, 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 18158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 18228b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten audio_channel_mask_t channelMask, 183be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName, 18474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 185050677873c10d4da308ac222f8533c96cca3207eEric Laurent audio_input_flags_t *flags, 1869ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George pid_t pid, 1871879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid, 1884cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi int clientUid, 189d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t *sessionId, 1907df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten size_t *notificationFrames, 191d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory>& cblk, 192d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory>& buffers, 19320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent status_t *status, 19420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId) 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1975841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 19972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) input); 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 2020d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 203eaa34703cb5f1acedb20cbcdff1ab79c11ff6857Dianne Hackborn data.writeString16(opPackageName); 20474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 205e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten data.writeInt64(frameCount); 206050677873c10d4da308ac222f8533c96cca3207eEric Laurent audio_input_flags_t lFlags = flags != NULL ? *flags : AUDIO_INPUT_FLAG_NONE; 207eeca32671896739e84050da5992d5f151a1629deGlenn Kasten data.writeInt32(lFlags); 2089ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George data.writeInt32((int32_t) pid); 2091879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten data.writeInt32((int32_t) tid); 2104cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi data.writeInt32((int32_t) clientUid); 211d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE; 212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 214be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 215be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 2167410591dad836434c72ddee66680802708b70c10Glenn Kasten data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0); 21720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent data.writeInt32(portId); 218d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 219d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 2205841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 2215841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 22229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("openRecord error: %s", strerror(-lStatus)); 2235841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 224b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten frameCount = reply.readInt64(); 22574935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 22674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 22774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 228050677873c10d4da308ac222f8533c96cca3207eEric Laurent lFlags = (audio_input_flags_t)reply.readInt32(); 229eeca32671896739e84050da5992d5f151a1629deGlenn Kasten if (flags != NULL) { 230eeca32671896739e84050da5992d5f151a1629deGlenn Kasten *flags = lFlags; 231eeca32671896739e84050da5992d5f151a1629deGlenn Kasten } 232d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten lSessionId = (audio_session_t) reply.readInt32(); 233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 2367df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten size_t lNotificationFrames = (size_t) reply.readInt64(); 2377df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten if (notificationFrames != NULL) { 2387df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten *notificationFrames = lNotificationFrames; 2397df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten } 2405841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 2415841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 242d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk = interface_cast<IMemory>(reply.readStrongBinder()); 243d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (cblk != 0 && cblk->pointer() == NULL) { 244d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 245d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 246d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers = interface_cast<IMemory>(reply.readStrongBinder()); 247d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (buffers != 0 && buffers->pointer() == NULL) { 248d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 249d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 250e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (lStatus == NO_ERROR) { 251e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (record == 0) { 252e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten ALOGE("openRecord should have returned an IAudioRecord"); 253e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten lStatus = UNKNOWN_ERROR; 254d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } else if (cblk == 0) { 255d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten ALOGE("openRecord should have returned a cblk"); 256d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten lStatus = NO_MEMORY; 257e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 258d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten // buffers is permitted to be 0 259e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } else { 260d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (record != 0 || cblk != 0 || buffers != 0) { 261d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten ALOGE("openRecord returned an IAudioRecord, cblk, " 262d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten "or buffers but with status %d", lStatus); 263e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 264e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 265d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten if (lStatus != NO_ERROR) { 266d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten record.clear(); 267d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten cblk.clear(); 268d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten buffers.clear(); 269d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten } 2705841db78dff14898538200287d246577b1fc37e2Eric Laurent } 271507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 2745841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2772c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2812c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2864a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 2874a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 28872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 29458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2972c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual size_t frameCount(audio_io_handle_t ioHandle) const 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3012c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 303e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 31072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 35072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 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.writeFloat(value); 35672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 361fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 365fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 37172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 375fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 37672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 381fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 385fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 390f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 41672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 42072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 42672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 43072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 44006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 443c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 444dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 445dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 446c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 448c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 451dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 452c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 453e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openOutput(audio_module_handle_t module, 457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *output, 458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t *latencyMs, 462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_output_flags_t flags) 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 469a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 471cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*devices); 472cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 47318868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 474cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 475cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 476cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 477cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 478507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 479cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 480cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 481cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 482cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 483507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 484cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 485cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent ALOGV("openOutput() returned output, %d", *output); 486cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 487cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *devices = (audio_devices_t)reply.readInt32(); 488cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *latencyMs = reply.readInt32(); 489cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 491c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 49272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 49372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 494c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 495c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 496c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 49772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 49872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 499c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 50072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 501c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 502c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 50372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 504c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 505c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 506c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 50772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 508c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 51272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 51672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 517c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 520c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 52172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 52572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 526c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 527c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 529c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 530cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openInput(audio_module_handle_t module, 531cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *input, 532cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 533cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *device, 534cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 535cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source, 536cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_input_flags_t flags) 53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 538cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (input == NULL || config == NULL || device == NULL) { 539cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 540cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 543a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 544cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*input); 545cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 546cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*device); 547cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 548cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(source); 549ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten data.writeInt32(flags); 550cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_INPUT, data, &reply); 551cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 552cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 553cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 554507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 555cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 556cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 557cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 558cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 559507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 560cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = (audio_io_handle_t)reply.readInt32(); 561cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 562cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *device = (audio_devices_t)reply.readInt32(); 563cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 565c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 566fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 570fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 571c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 572c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 575d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten virtual status_t invalidateStream(audio_stream_type_t stream) 57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 579fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 580d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten remote()->transact(INVALIDATE_STREAM, data, &reply); 581c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 583f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 584f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 585f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 586f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 587f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 588f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 589f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 590f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 591f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 592342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 593377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 59472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 595342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 596342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 597342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 59872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 599342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 600342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 601342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 602342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 603507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 604342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 605342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 606342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 607507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 608342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 609342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 610342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 611342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 612342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 61305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 6145f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 61505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 61605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 61705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 61872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 6195f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 6205f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 6215f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 6225f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 6235f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 62405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 626eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) 627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 630eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten data.writeInt32((int32_t) use); 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 632de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent audio_unique_id_t id = AUDIO_SESSION_ALLOCATE; 633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 639d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void acquireAudioSessionId(audio_session_t audioSession, int pid) 6403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 644d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 6463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 648d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void releaseAudioSessionId(audio_session_t audioSession, int pid) 6493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 653d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6543a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 6553a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 657f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 6699d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 675f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 682ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 683ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 684be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6955e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 696f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 713be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 7168d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 718be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 72072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 721d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId, 722be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName, 723b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid, 724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 726be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 729be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 730be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 731be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 732e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 733507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 734e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 735e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 736e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 738be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 739be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 74006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 741be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 74272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 743be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 744be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov data.writeString16(opPackageName); 745b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent data.writeInt32((int32_t) pid); 746be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 747be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 748be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 74929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 750be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 751be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 752be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 753507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 754be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 755be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 756be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 757a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 758be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 759be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 760be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 761be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 762be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 763507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 764be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 765be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 766be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 767be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 768be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 769de070137f11d346fba77605bd76a44c040a618fcEric Laurent 770d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput, 77172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 772de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 773de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 774de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 775de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 77672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 77772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 778de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 779de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 780de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 781a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 782a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 783a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 784a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 785a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 786a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 787a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 788a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 789a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 790cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7913b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 792cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 793cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 794cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 795cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 796cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 797cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 798cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 799e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 800cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 801cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 802cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 803cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 804e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 805cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 806cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 8074182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten virtual status_t setLowRamDevice(bool isLowRamDevice) 8084182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 8094182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 8104182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8114182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInt32((int) isLowRamDevice); 8124182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 8134182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return reply.readInt32(); 8144182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPorts(unsigned int *num_ports, 8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports) 8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_ports); 8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_ports = (unsigned int)reply.readInt32(); 8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(ports, *num_ports * sizeof(struct audio_port)); 8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t getAudioPort(struct audio_port *port) 8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (port == NULL) { 8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(port, sizeof(struct audio_port)); 8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(port, sizeof(struct audio_port)); 8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t *handle) 8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (patch == NULL || handle == NULL) { 8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(patch, sizeof(struct audio_patch)); 8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 8654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 8684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 8724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 8734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 8744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 8794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches) 8804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 8824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_patches); 8874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 8884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 8894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 8904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_patches = (unsigned int)reply.readInt32(); 8934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(patches, *num_patches * sizeof(struct audio_patch)); 8944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 8974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (config == NULL) { 8994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 9004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 9014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 9024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 9034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(config, sizeof(struct audio_port_config)); 9044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 9054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 9064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 9074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 9084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 9094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 91093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 91193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent { 91293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent Parcel data, reply; 91393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 91493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInt32(sessionId); 91593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply); 91693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent if (status != NO_ERROR) { 91793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return AUDIO_HW_SYNC_INVALID; 91893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 91993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return (audio_hw_sync_t)reply.readInt32(); 92093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 92172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent virtual status_t systemReady() 92272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent { 92372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent Parcel data, reply; 92472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 92572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 92672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } 9274a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const 9284a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten { 9294a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten Parcel data, reply; 9304a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 9314a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInt32((int32_t) ioHandle); 9324a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); 9334a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten if (status != NO_ERROR) { 9344a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return 0; 9354a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 9364a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return reply.readInt64(); 9374a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 94689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 947dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Whitelist of relevant events to trigger log merging. 948dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Log merging should activate during audio activity of any kind. This are considered the 949dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // most relevant events. 950dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // TODO should select more wisely the items from the list 951dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet switch (code) { 952dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_TRACK: 953dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case OPEN_RECORD: 954dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_VOLUME: 955dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_MUTE: 956dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_STREAM_VOLUME: 957dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_STREAM_MUTE: 958dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MIC_MUTE: 959dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_PARAMETERS: 960dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case OPEN_INPUT: 961dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_VOICE_VOLUME: 962dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_EFFECT: 963dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SYSTEM_READY: { 964dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet requestLogMerge(); 965dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 966dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 967dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet default: 968dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 969dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 970e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 97558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 976dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 977e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t frameCount = data.readInt64(); 978050677873c10d4da308ac222f8533c96cca3207eEric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 9793d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent bool haveSharedBuffer = data.readInt32() != 0; 9803d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IMemory> buffer; 9813d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (haveSharedBuffer) { 9823d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent buffer = interface_cast<IMemory>(data.readStrongBinder()); 9833d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 98472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 9859ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George pid_t pid = (pid_t) data.readInt32(); 9863acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 987d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId = (audio_session_t) data.readInt32(); 988462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid = data.readInt32(); 98920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId = (audio_port_handle_t) data.readInt32(); 990983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia status_t status = NO_ERROR; 9913d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IAudioTrack> track; 9923d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if ((haveSharedBuffer && (buffer == 0)) || 9933d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ((buffer != 0) && (buffer->pointer() == NULL))) { 9943d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ALOGW("CREATE_TRACK: cannot retrieve shared memory"); 9953d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent status = DEAD_OBJECT; 9963d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 9973d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent track = createTrack( 9983d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent (audio_stream_type_t) streamType, sampleRate, format, 9999ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George channelMask, &frameCount, &flags, buffer, output, pid, tid, 100020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent &sessionId, clientUid, &status, portId); 10010cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 10023d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 1003b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten reply->writeInt64(frameCount); 1004e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten reply->writeInt32(flags); 1005be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 100706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(track)); 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 101458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1015dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1016be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName = data.readString16(); 1017e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten size_t frameCount = data.readInt64(); 1018050677873c10d4da308ac222f8533c96cca3207eEric Laurent audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 10199ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George pid_t pid = (pid_t) data.readInt32(); 10201879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 10214cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi int clientUid = data.readInt32(); 1022d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId = (audio_session_t) data.readInt32(); 10237410591dad836434c72ddee66680802708b70c10Glenn Kasten size_t notificationFrames = data.readInt64(); 102420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent audio_port_handle_t portId = (audio_port_handle_t) data.readInt32(); 1025d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory> cblk; 1026d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten sp<IMemory> buffers; 1027983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia status_t status = NO_ERROR; 10288d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IAudioRecord> record = openRecord(input, 10299ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George sampleRate, format, channelMask, opPackageName, &frameCount, &flags, 10309ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George pid, tid, clientUid, &sessionId, ¬ificationFrames, cblk, buffers, 103120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent &status, portId); 1032e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 1033b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten reply->writeInt64(frameCount); 1034eeca32671896739e84050da5992d5f151a1629deGlenn Kasten reply->writeInt32(flags); 1035be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 10367df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten reply->writeInt64(notificationFrames); 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 103806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(record)); 103906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(cblk)); 104006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(buffers)); 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 10484a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 10494a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 10504a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 105372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1058e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 106372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1066e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 109072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1091fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1097fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 110189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1103fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 1104fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 110689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 110789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 110989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1110fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 111189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 111389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 111489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1115f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 111689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 111789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 111889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 111989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 112089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 112189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 112489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 112589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 112689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 112889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 113272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 1136e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 113972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 1141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1143e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 114589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 114689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 114785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 114885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 114989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 115089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 115189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 115289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 115389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 115558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1156dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1157e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 115889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 1161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1162a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1163e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1164e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1165e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1166e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1167a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1168cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 11690ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1170983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t latencyMs = 0; 11714cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; 1172cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openOutput(module, &output, &config, 1173cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &devices, address, &latencyMs, flags); 11747074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten ALOGV("OPEN_OUTPUT output, %d", output); 1175cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)status); 1176cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1177cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)output); 1178cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1179cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(devices); 1180cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(latencyMs); 1181cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1182c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1183c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1184c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 1185c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 118672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 118772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 118872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1189c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1190c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1191c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 1192c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 119372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1194c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1195c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1196c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 1197c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 119872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1199c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1200c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1201c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 1202c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 120372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1204c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1205c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1206c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 1207c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1208a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1209cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1210e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1211e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1212e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1213e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1214cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t device = (audio_devices_t)data.readInt32(); 1215cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 1216cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source = (audio_source_t)data.readInt32(); 1217ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1218c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1219cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openInput(module, &input, &config, 1220cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &device, address, source, flags); 1221cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) status); 1222cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1223cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) input); 1224cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1225cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(device); 1226cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1227c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1228c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1229c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 123089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 123172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 123289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 123389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1234d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten case INVALIDATE_STREAM: { 123589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1236d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1237d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten reply->writeInt32(invalidateStream(stream)); 123889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 123989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1240f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1241f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1242f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1243f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1244f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1245f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1246342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1247342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 124872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1249983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t halFrames = 0; 1250983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t dspFrames = 0; 1251342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1252342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1253342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1254342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1255342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1256342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1257342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1258342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 125905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 126005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 126172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 12625f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 126305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 126405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 1265be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case NEW_AUDIO_SESSION_ID: { 1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1267eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32())); 1268be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1269be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 12703a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 12713a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1272d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1273d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1274d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen acquireAudioSessionId(audioSession, pid); 12753a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12763a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 12773a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 12783a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1279d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1280d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1281d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen releaseAudioSessionId(audioSession, pid); 12823a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12833a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1284be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1285be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1286983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t numEffects = 0; 1287be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1288be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1289be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1290be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1291be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1292be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1293be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1294ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1295be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1296983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1297ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1298be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1299be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1300be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1301be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1302be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1303be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1304be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1305be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1306be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1307be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1308983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1309be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1310be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1311be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1312be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1313be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1314be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1315be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1316be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1317be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1318e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia effect_descriptor_t desc = {}; 1319e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1320e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1321e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1322be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1323be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 132472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1325d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId = (audio_session_t) data.readInt32(); 1326be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 opPackageName = data.readString16(); 1327b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid = (pid_t)data.readInt32(); 1328b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent 1329983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia status_t status = NO_ERROR; 1330983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int id = 0; 1331983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int enabled = 0; 133205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 13338d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1334b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent opPackageName, pid, &status, &id, &enabled); 1335be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1336be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1337be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 133806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(effect)); 1339be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1340be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1341be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1342de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1343de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1344d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 134572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 134672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1347de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1348de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1349de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1350a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1351a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1352a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1353a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1354a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1355cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1356cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1357cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1358cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1359cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1360cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1361cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1362e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64(getPrimaryOutputFrameCount()); 1363cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1364cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 13654182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 13664182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 13674182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten bool isLowRamDevice = data.readInt32() != 0; 13684182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten reply->writeInt32(setLowRamDevice(isLowRamDevice)); 13694182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 13704182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PORTS: { 13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1373f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPortsReq = data.readInt32(); 1374f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 1375f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 1376f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1377f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPorts = numPortsReq; 13784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports = 1379f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_port *)calloc(numPortsReq, 13804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_port)); 1381f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (ports == NULL) { 1382f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1383f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1384f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1385f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1386f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPorts(&numPorts, ports); 13874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1388f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPorts); 13894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1390f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > numPorts) { 1391f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = numPorts; 1392f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1393f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 13944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(ports); 13964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case GET_AUDIO_PORT: { 13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1400e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1401e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1402e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1403e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = getAudioPort(&port); 14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&port, sizeof(struct audio_port)); 14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case CREATE_AUDIO_PATCH: { 14124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 14134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch patch; 14144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1415a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1416e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1417e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1418e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 14194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = createAudioPatch(&patch, &handle); 14204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 14224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 14234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 14244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case RELEASE_AUDIO_PATCH: { 14274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 14284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t handle; 14294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 14304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = releaseAudioPatch(handle); 14314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PATCHES: { 14354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1436f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatchesReq = data.readInt32(); 1437f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1438f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 1439f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1440f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatches = numPatchesReq; 14414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches = 1442f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_patch *)calloc(numPatchesReq, 14434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_patch)); 1444f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (patches == NULL) { 1445f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1446f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1447f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1448f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1449f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPatches(&numPatches, patches); 14504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1451f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPatches); 14524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1453f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > numPatches) { 1454f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = numPatches; 1455f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1456f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 14574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 14584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(patches); 14594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case SET_AUDIO_PORT_CONFIG: { 14624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 14634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port_config config; 14644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&config, sizeof(struct audio_port_config)); 14654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = setAudioPortConfig(&config); 14664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 146993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent case GET_AUDIO_HW_SYNC: { 147093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1471d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32())); 147293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return NO_ERROR; 147393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } break; 147472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent case SYSTEM_READY: { 147572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 147672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent systemReady(); 147772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return NO_ERROR; 147872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } break; 14794a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten case FRAME_COUNT_HAL: { 14804a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 14814a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); 14824a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return NO_ERROR; 14834a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } break; 148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 148589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 148689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 148789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 148889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 148989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 149140bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1492