IAudioFlinger.cpp revision 7074296c72b3be919ebc9dfd504f4572a188d2e7
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License. 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License. 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/ 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger" 19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h> 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h> 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OPEN_RECORD, 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SAMPLE_RATE, 355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten RESERVED, // obsolete, was CHANNEL_COUNT 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FORMAT, 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FRAME_COUNT, 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LATENCY, 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_VOLUME, 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_MUTE, 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_VOLUME, 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_MUTE, 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_VOLUME, 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_MUTE, 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_VOLUME, 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_MUTE, 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MODE, 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MIC_MUTE, 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_MIC_MUTE, 50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PARAMETERS, 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_PARAMETERS, 5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project REGISTER_CLIENT, 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_INPUTBUFFERSIZE, 54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_OUTPUT, 55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_DUPLICATE_OUTPUT, 56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_OUTPUT, 57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SUSPEND_OUTPUT, 58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RESTORE_OUTPUT, 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_INPUT, 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_INPUT, 61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent SET_STREAM_OUTPUT, 62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent SET_VOICE_VOLUME, 6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_RENDER_POSITION, 64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_INPUT_FRAMES_LOST, 65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent NEW_AUDIO_SESSION_ID, 663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen ACQUIRE_AUDIO_SESSION_ID, 673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen RELEASE_AUDIO_SESSION_ID, 68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent QUERY_NUM_EFFECTS, 69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent QUERY_EFFECT, 70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_EFFECT_DESCRIPTOR, 71de070137f11d346fba77605bd76a44c040a618fcEric Laurent CREATE_EFFECT, 72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent MOVE_EFFECTS, 73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten LOAD_HW_MODULE, 74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_SAMPLING_RATE, 75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_FRAME_COUNT, 764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten SET_LOW_RAM_DEVICE, 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 88fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_stream_type_t streamType, 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 9058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 91dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask, 9274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 93e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten track_flags_t *flags, 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 9572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 963acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid, 97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 98d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten String8& name, 99462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid, 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1035841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 105fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) streamType); 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1080d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 10974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 111b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 112e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten data.writeInt32(lFlags); 1133d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (sharedBuffer != 0) { 1143d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(true); 1153d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeStrongBinder(sharedBuffer->asBinder()); 1163d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 1173d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent data.writeInt32(false); 1183d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 11972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 1203acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten data.writeInt32((int32_t) tid); 121aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 122be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 123be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 124be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 125be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 126462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen data.writeInt32(clientUid); 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 12929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createTrack error: %s", strerror(-lStatus)); 1305841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 13174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten frameCount = reply.readInt32(); 13274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 13374935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 13474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 135e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten lFlags = reply.readInt32(); 136e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten if (flags != NULL) { 137e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten *flags = lFlags; 138e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten } 139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 140be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 141be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 142be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 143d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten name = reply.readString8(); 1445841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 1455841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 1460cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (lStatus == NO_ERROR) { 1470cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track == 0) { 1480cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack should have returned an IAudioTrack"); 1490cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten lStatus = UNKNOWN_ERROR; 1500cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1510cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } else { 1520cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten if (track != 0) { 1530cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus); 1540cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten track.clear(); 1550cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 1560cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten } 15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 158507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1615841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 16572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input, 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 16758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format, 16828b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten audio_channel_mask_t channelMask, 16974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t *pFrameCount, 170eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t *flags, 1711879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid, 172be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *sessionId, 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status) 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1765841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioRecord> record; 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 17872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) input); 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sampleRate); 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 1810d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32(channelMask); 18274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(frameCount); 184eeca32671896739e84050da5992d5f151a1629deGlenn Kasten track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 185eeca32671896739e84050da5992d5f151a1629deGlenn Kasten data.writeInt32(lFlags); 1861879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten data.writeInt32((int32_t) tid); 187aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten int lSessionId = AUDIO_SESSION_ALLOCATE; 188be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 189be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = *sessionId; 190be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 191be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(lSessionId); 1925841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 1935841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 19429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("openRecord error: %s", strerror(-lStatus)); 1955841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 19674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten frameCount = reply.readInt32(); 19774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten if (pFrameCount != NULL) { 19874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten *pFrameCount = frameCount; 19974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten } 200eeca32671896739e84050da5992d5f151a1629deGlenn Kasten lFlags = reply.readInt32(); 201eeca32671896739e84050da5992d5f151a1629deGlenn Kasten if (flags != NULL) { 202eeca32671896739e84050da5992d5f151a1629deGlenn Kasten *flags = lFlags; 203eeca32671896739e84050da5992d5f151a1629deGlenn Kasten } 204be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = reply.readInt32(); 205be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 206be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *sessionId = lSessionId; 207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 2085841db78dff14898538200287d246577b1fc37e2Eric Laurent lStatus = reply.readInt32(); 2095841db78dff14898538200287d246577b1fc37e2Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 210e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (lStatus == NO_ERROR) { 211e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (record == 0) { 212e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten ALOGE("openRecord should have returned an IAudioRecord"); 213e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten lStatus = UNKNOWN_ERROR; 214e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 215e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } else { 216e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten if (record != 0) { 217e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten ALOGE("openRecord returned an IAudioRecord but with status %d", lStatus); 218e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten record.clear(); 219e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 220e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten } 2215841db78dff14898538200287d246577b1fc37e2Eric Laurent } 222507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 2255841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t sampleRate(audio_io_handle_t output) const 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 24358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual size_t frameCount(audio_io_handle_t output) const 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 25072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 25972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 29972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 303fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 30572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 310fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 314fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 324fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 32572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 330fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 334fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 339f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 36972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 37572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 37972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeStrongBinder(client->asBinder()); 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 393dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 394dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 400dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 405a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_io_handle_t openOutput(audio_module_handle_t module, 406a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t *pDevices, 407a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pSamplingRate, 408a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_format_t *pFormat, 409a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t *pChannelMask, 410a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pLatencyMs, 411ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald audio_output_flags_t flags, 412ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald const audio_offload_info_t *offloadInfo) 41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 4157c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0; 4167c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0; 4177c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT; 4187c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_channel_mask_t channelMask = pChannelMask != NULL ? 4197c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten *pChannelMask : (audio_channel_mask_t)0; 4207c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0; 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 422a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 426a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(channelMask); 427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(latency); 42818868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 429b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (offloadInfo == NULL) { 430b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(0); 431b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } else { 432b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.writeInt32(1); 433b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.write(offloadInfo, sizeof(audio_offload_info_t)); 434b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_OUTPUT, data, &reply); 43672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) reply.readInt32(); 43772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten ALOGV("openOutput() returned output, %d", output); 438a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent devices = (audio_devices_t)reply.readInt32(); 439507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pDevices != NULL) { 440507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pDevices = devices; 441507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 443507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pSamplingRate != NULL) { 444507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pSamplingRate = samplingRate; 445507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 44658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten format = (audio_format_t) reply.readInt32(); 447507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pFormat != NULL) { 448507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pFormat = format; 449507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 450a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent channelMask = (audio_channel_mask_t)reply.readInt32(); 451507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pChannelMask != NULL) { 452507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pChannelMask = channelMask; 453507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent latency = reply.readInt32(); 455507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pLatencyMs != NULL) { 456507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pLatencyMs = latency; 457507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return output; 459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 46172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 46272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 463c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 465c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 46672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 46772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 468c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 46972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 470c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 471c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 47272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 474c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 475c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 47672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 48172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 48572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 489c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 49072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 49472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 495c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 496c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 498c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 499a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_io_handle_t openInput(audio_module_handle_t module, 500a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t *pDevices, 501a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent uint32_t *pSamplingRate, 502a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_format_t *pFormat, 503a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t *pChannelMask) 50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 5067c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0; 5077c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0; 5087c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT; 5097c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten audio_channel_mask_t channelMask = pChannelMask != NULL ? 5107c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten *pChannelMask : (audio_channel_mask_t)0; 511c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 513a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 514c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(devices); 515c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(samplingRate); 51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 517a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(channelMask); 518c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_INPUT, data, &reply); 51972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) reply.readInt32(); 520a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent devices = (audio_devices_t)reply.readInt32(); 521507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pDevices != NULL) { 522507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pDevices = devices; 523507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 524c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent samplingRate = reply.readInt32(); 525507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pSamplingRate != NULL) { 526507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pSamplingRate = samplingRate; 527507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 52858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten format = (audio_format_t) reply.readInt32(); 529507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pFormat != NULL) { 530507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pFormat = format; 531507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 532a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent channelMask = (audio_channel_mask_t)reply.readInt32(); 533507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (pChannelMask != NULL) { 534507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten *pChannelMask = channelMask; 535507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 536c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return input; 53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 538c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 539fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 543fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 544c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 545c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 54872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output) 54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 552fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 55372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 554c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_OUTPUT, data, &reply); 555c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 557f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 558f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 559f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 560f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 561f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 562f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 563f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 564f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 565f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 566342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 567377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 56872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 569342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 570342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 571342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 57272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 573342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 574342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 575342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 576342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 577507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 578342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 579342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 580342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 581507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 582342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 583342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 584342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 585342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 586342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 58705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 5885f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 58905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 59005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 59105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 59272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 5935f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 5945f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 5955f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 5965f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 5975f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 59805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual int newAudioSessionId() 601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id = 0; 606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 612d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen virtual void acquireAudioSessionId(int audioSession, int pid) 6133a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6143a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6153a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6163a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 617d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6183a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 6193a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6203a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 621d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen virtual void releaseAudioSessionId(int audioSession, int pid) 6223a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 6233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 6243a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6253a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 626d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 6273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 6283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 6293a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 630f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 6429d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 648f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 655ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 656ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6685e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 669f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 683be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 684be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6898d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 69372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId, 695be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 703e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 704507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 705e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 706e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 707e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeStrongBinder(client->asBinder()); 712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 71372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 71829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 720be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 721be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 722507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 726a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 729be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 730be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 731be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 732507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 733be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 734be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 735be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 736be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 738de070137f11d346fba77605bd76a44c040a618fcEric Laurent 73972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, 74072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 741de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 742de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 743de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 744de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 74572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 74672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 747de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 748de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 749de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 750a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 751a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 752a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 753a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 754a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 755a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 756a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 757a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 758a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 759cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7603b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 761cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 762cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 763cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 764cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 765cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 766cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 767cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 768e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 769cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 770cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 771cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 772cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 773cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 774cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 775cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten virtual status_t setLowRamDevice(bool isLowRamDevice) 7774182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 7784182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 7794182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7804182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInt32((int) isLowRamDevice); 7814182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 7824182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return reply.readInt32(); 7834182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 7844182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten 78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 794e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int streamType = data.readInt32(); 79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 79958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 800dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 801e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t frameCount = data.readInt32(); 802a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 8033d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent bool haveSharedBuffer = data.readInt32() != 0; 8043d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IMemory> buffer; 8053d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if (haveSharedBuffer) { 8063d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent buffer = interface_cast<IMemory>(data.readStrongBinder()); 8073d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 80872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 8093acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 810be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 811462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen int clientUid = data.readInt32(); 812d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten String8 name; 81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 8143d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent sp<IAudioTrack> track; 8153d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent if ((haveSharedBuffer && (buffer == 0)) || 8163d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ((buffer != 0) && (buffer->pointer() == NULL))) { 8173d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent ALOGW("CREATE_TRACK: cannot retrieve shared memory"); 8183d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent status = DEAD_OBJECT; 8193d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } else { 8203d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent track = createTrack( 8213d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent (audio_stream_type_t) streamType, sampleRate, format, 82274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten channelMask, &frameCount, &flags, buffer, output, tid, 823462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen &sessionId, name, clientUid, &status); 8240cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 8253d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 82674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten reply->writeInt32(frameCount); 827e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten reply->writeInt32(flags); 828be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 829d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten reply->writeString8(name); 83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(track->asBinder()); 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case OPEN_RECORD: { 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 83672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 83858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 839dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 840e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten size_t frameCount = data.readInt32(); 841a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten track_flags_t flags = (track_flags_t) data.readInt32(); 8421879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten pid_t tid = (pid_t) data.readInt32(); 843be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status; 8458d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IAudioRecord> record = openRecord(input, 84674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten sampleRate, format, channelMask, &frameCount, &flags, tid, &sessionId, &status); 847e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 84874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten reply->writeInt32(frameCount); 849eeca32671896739e84050da5992d5f151a1629deGlenn Kasten reply->writeInt32(flags); 850be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(sessionId); 85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeStrongBinder(record->asBinder()); 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 85772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 86272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 86772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) ); 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 87272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 875e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 89972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 900fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 906fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 912fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 913fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 919fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 924f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 93189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 93589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 939c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 94172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 942c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 945e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 946c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 94872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 949c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 950c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 952e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 953c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 95685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 95785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 96458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 965dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 966dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) ); 96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 969c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 970c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 971a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 972a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 973c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 97458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 975a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 976c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t latency = data.readInt32(); 9770ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 978b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald bool hasOffloadInfo = data.readInt32() != 0; 979b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald audio_offload_info_t offloadInfo; 980b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald if (hasOffloadInfo) { 981b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald data.read(&offloadInfo, sizeof(audio_offload_info_t)); 982b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald } 983a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_io_handle_t output = openOutput(module, 984a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &devices, 985a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &samplingRate, 986a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &format, 987a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &channelMask, 988a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &latency, 989b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald flags, 990b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald hasOffloadInfo ? &offloadInfo : NULL); 9917074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten ALOGV("OPEN_OUTPUT output, %d", output); 99272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) output); 993c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 994c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 995c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 996a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(channelMask); 997c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(latency); 998c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1000c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 100272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 100372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 100472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1005c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1006c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1007c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 1008c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 100972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1010c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1011c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1012c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 1013c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 101472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1015c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1016c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1017c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 1018c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 101972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1020c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1021c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1022c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 1023c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1024a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1025a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1026c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t samplingRate = data.readInt32(); 102758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1028a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 1029c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1030a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_io_handle_t input = openInput(module, 1031a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &devices, 1032a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &samplingRate, 1033a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &format, 1034a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent &channelMask); 103572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) input); 1036c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(devices); 1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(samplingRate); 1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(format); 1039a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(channelMask); 1040c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1041c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1042c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1047c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_STREAM_OUTPUT: { 104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1049c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t stream = data.readInt32(); 105072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1051fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output)); 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1054f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1055f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1056f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1057f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1058f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1059f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1060342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1061342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 106272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1063377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT uint32_t halFrames; 1064377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT uint32_t dspFrames; 1065342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1066342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1067342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1068342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1069342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1070342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1071342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1072342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 107305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 107405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 107572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 10765f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 107705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 107805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 1079be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case NEW_AUDIO_SESSION_ID: { 1080be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1081be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(newAudioSessionId()); 1082be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1083be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 10843a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 10853a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 10863a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 1087d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1088d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen acquireAudioSessionId(audioSession, pid); 10893a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 10903a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 10913a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 10923a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 10933a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen int audioSession = data.readInt32(); 1094d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1095d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen releaseAudioSessionId(audioSession, pid); 10963a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 10973a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1098be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1099be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1100be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t numEffects; 1101be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1102be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1103be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1104be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1105be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1106be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1108ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1111ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1113be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1121be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1122be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1123be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1124be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1125be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1126be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1127be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1128be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1131be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1132be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t desc; 1133be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 1134be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1135be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 113672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1137be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int sessionId = data.readInt32(); 1138be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status; 1139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int id; 1140be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int enabled; 114105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 11428d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 114385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten &status, &id, &enabled); 1144be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1145be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1146be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 1147be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeStrongBinder(effect->asBinder()); 1148be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1150be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1151de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1152de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1153de070137f11d346fba77605bd76a44c040a618fcEric Laurent int session = data.readInt32(); 115472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 115572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1156de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1157de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1158de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1159a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1160a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1161a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1162a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1163a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1164cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1165cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1166cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1167cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1168cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1169cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1170cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1171cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputFrameCount()); 1172cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1173cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 11744182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 11754182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 11764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten bool isLowRamDevice = data.readInt32() != 0; 11774182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten reply->writeInt32(setLowRamDevice(isLowRamDevice)); 11784182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 11794182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 118089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 118189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 118289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 118489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 118589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 118689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 118789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 1188