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 "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, 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 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 INVALIDATE_STREAM, 62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent SET_VOICE_VOLUME, 6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_RENDER_POSITION, 64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_INPUT_FRAMES_LOST, 65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent NEW_AUDIO_SESSION_ID, 663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen ACQUIRE_AUDIO_SESSION_ID, 673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen RELEASE_AUDIO_SESSION_ID, 68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent QUERY_NUM_EFFECTS, 69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent QUERY_EFFECT, 70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_EFFECT_DESCRIPTOR, 71de070137f11d346fba77605bd76a44c040a618fcEric Laurent CREATE_EFFECT, 72de070137f11d346fba77605bd76a44c040a618fcEric Laurent MOVE_EFFECTS, 7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOAD_HW_MODULE, 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_PRIMARY_OUTPUT_SAMPLING_RATE, 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_PRIMARY_OUTPUT_FRAME_COUNT, 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_LOW_RAM_DEVICE, 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LIST_AUDIO_PORTS, 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_AUDIO_PORT, 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_AUDIO_PATCH, 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project RELEASE_AUDIO_PATCH, 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LIST_AUDIO_PATCHES, 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_AUDIO_PORT_CONFIG, 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_AUDIO_HW_SYNC, 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SYSTEM_READY, 85fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten FRAME_COUNT_HAL, 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 870d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi 880d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi#define MAX_ITEMS_PER_LIST 1024 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 92fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurentpublic: 93be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent explicit BpAudioFlinger(const sp<IBinder>& impl) 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 975841db78dff14898538200287d246577b1fc37e2Eric Laurent 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioTrack> createTrack( 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_stream_type_t streamType, 100fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten uint32_t sampleRate, 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_format_t format, 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_channel_mask_t channelMask, 1030d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi size_t *pFrameCount, 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_output_flags_t *flags, 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IMemory>& sharedBuffer, 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_io_handle_t output, 107fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent pid_t pid, 108be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent pid_t tid, 109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_session_t *sessionId, 110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int clientUid, 111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_port_handle_t portId) 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 11529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block sp<IAudioTrack> track; 1165841db78dff14898538200287d246577b1fc37e2Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32((int32_t) streamType); 118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sampleRate); 119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(format); 120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(channelMask); 1215841db78dff14898538200287d246577b1fc37e2Eric Laurent size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 1225841db78dff14898538200287d246577b1fc37e2Eric Laurent data.writeInt64(frameCount); 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_output_flags_t lFlags = flags != NULL ? *flags : AUDIO_OUTPUT_FLAG_NONE; 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(lFlags); 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // haveSharedBuffer 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (sharedBuffer != 0) { 1275841db78dff14898538200287d246577b1fc37e2Eric Laurent data.writeInt32(true); 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeStrongBinder(IInterface::asBinder(sharedBuffer)); 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(false); 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 132fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32((int32_t) output); 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) pid); 1340d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi data.writeInt32((int32_t) tid); 1350d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE; 13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (sessionId != NULL) { 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSessionId = *sessionId; 138be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(lSessionId); 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(clientUid); 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(portId); 1425841db78dff14898538200287d246577b1fc37e2Eric Laurent status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ALOGE("createTrack error: %s", strerror(-lStatus)); 145fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } else { 14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project frameCount = reply.readInt64(); 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (pFrameCount != NULL) { 1480d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi *pFrameCount = frameCount; 14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lFlags = (audio_output_flags_t)reply.readInt32(); 151be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (flags != NULL) { 152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *flags = lFlags; 153be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 154be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lSessionId = (audio_session_t) reply.readInt32(); 155be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (sessionId != NULL) { 1565841db78dff14898538200287d246577b1fc37e2Eric Laurent *sessionId = lSessionId; 1575841db78dff14898538200287d246577b1fc37e2Eric Laurent } 15829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block lStatus = reply.readInt32(); 1595841db78dff14898538200287d246577b1fc37e2Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 160be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus == NO_ERROR) { 161be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (track == 0) { 162be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent ALOGE("createTrack should have returned an IAudioTrack"); 163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = UNKNOWN_ERROR; 1645841db78dff14898538200287d246577b1fc37e2Eric Laurent } 1655841db78dff14898538200287d246577b1fc37e2Eric Laurent } else { 1665841db78dff14898538200287d246577b1fc37e2Eric Laurent if (track != 0) { 16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus); 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project track.clear(); 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1705841db78dff14898538200287d246577b1fc37e2Eric Laurent } 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NULL) { 173fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent *status = lStatus; 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return track; 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 177fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IAudioRecord> openRecord( 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_io_handle_t input, 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate, 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_format_t format, 182fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_channel_mask_t channelMask, 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const String16& opPackageName, 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t *pFrameCount, 18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_input_flags_t *flags, 186fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent pid_t pid, 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t tid, 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int clientUid, 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_session_t *sessionId, 19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t *notificationFrames, 1910d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi sp<IMemory>& cblk, 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IMemory>& buffers, 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status, 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_port_handle_t portId) 195fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent { 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IAudioRecord> record; 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) input); 200fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(sampleRate); 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(format); 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(channelMask); 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeString16(opPackageName); 204fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt64(frameCount); 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_input_flags_t lFlags = flags != NULL ? *flags : AUDIO_INPUT_FLAG_NONE; 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(lFlags); 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) pid); 209fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32((int32_t) tid); 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) clientUid); 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE; 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (sessionId != NULL) { 213fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent lSessionId = *sessionId; 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(lSessionId); 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0); 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(portId); 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project cblk.clear(); 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project buffers.clear(); 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ALOGE("openRecord error: %s", strerror(-lStatus)); 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project frameCount = reply.readInt64(); 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (pFrameCount != NULL) { 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *pFrameCount = frameCount; 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lFlags = (audio_input_flags_t)reply.readInt32(); 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (flags != NULL) { 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *flags = lFlags; 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSessionId = (audio_session_t) reply.readInt32(); 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (sessionId != NULL) { 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *sessionId = lSessionId; 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t lNotificationFrames = (size_t) reply.readInt64(); 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (notificationFrames != NULL) { 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *notificationFrames = lNotificationFrames; 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lStatus = reply.readInt32(); 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project cblk = interface_cast<IMemory>(reply.readStrongBinder()); 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (cblk != 0 && cblk->pointer() == NULL) { 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project cblk.clear(); 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project buffers = interface_cast<IMemory>(reply.readStrongBinder()); 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (buffers != 0 && buffers->pointer() == NULL) { 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project buffers.clear(); 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus == NO_ERROR) { 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (record == 0) { 252fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten ALOGE("openRecord should have returned an IAudioRecord"); 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lStatus = UNKNOWN_ERROR; 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else if (cblk == 0) { 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ALOGE("openRecord should have returned a cblk"); 256fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten lStatus = NO_MEMORY; 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 258fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent // buffers is permitted to be 0 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (record != 0 || cblk != 0 || buffers != 0) { 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ALOGE("openRecord returned an IAudioRecord, cblk, " 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project "or buffers but with status %d", lStatus); 263fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten } 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project record.clear(); 267fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten cblk.clear(); 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project buffers.clear(); 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NULL) { 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = lStatus; 273fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten } 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return record; 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 277fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const 278fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent { 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) ioHandle); 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 283fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten return reply.readInt32(); 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // RESERVED for channelCount() 287fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual audio_format_t format(audio_io_handle_t output) const 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) output); 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return (audio_format_t) reply.readInt32(); 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual size_t frameCount(audio_io_handle_t ioHandle) const 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) ioHandle); 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt64(); 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual uint32_t latency(audio_io_handle_t output) const 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) output); 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 318fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 322fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMasterMute(bool muted) 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 328fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(muted); 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 332fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual float masterVolume() const 334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(MASTER_VOLUME, data, &reply); 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readFloat(); 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool masterMute() const 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(MASTER_MUTE, data, &reply); 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t output) 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) stream); 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) output); 357fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent remote()->transact(SET_STREAM_VOLUME, data, &reply); 358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) stream); 366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(muted); 367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_STREAM_MUTE, data, &reply); 368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) stream); 376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) output); 377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STREAM_VOLUME, data, &reply); 378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readFloat(); 379fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 3803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block 381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool streamMute(audio_stream_type_t stream) const 382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) stream); 386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(STREAM_MUTE, data, &reply); 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMode(audio_mode_t mode) 391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 394fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(mode); 395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 398fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 399fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t setMicMute(bool state) 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 401fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent Parcel data, reply; 402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 404fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 408fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual bool getMicMute() const 409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(GET_MIC_MUTE, data, &reply); 413fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return reply.readInt32(); 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 417fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent { 418c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) ioHandle); 421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 422fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 426fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int32_t) ioHandle); 431fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeString8(keys); 432fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 433fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return reply.readString8(); 434fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 435fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual void registerClient(const sp<IAudioFlingerClient>& client) 43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 440c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeStrongBinder(IInterface::asBinder(client)); 441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 444c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 445c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_channel_mask_t channelMask) const 44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 448c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 450fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(format); 451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(channelMask); 452c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 453c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt64(); 454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 455c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 456c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t openOutput(audio_module_handle_t module, 457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_io_handle_t *output, 458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_config_t *config, 459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_devices_t *devices, 46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const String8& address, 461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent uint32_t *latencyMs, 462fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent audio_output_flags_t flags) 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BAD_VALUE; 466fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 467c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 468c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(module); 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.write(config, sizeof(audio_config_t)); 471fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32(*devices); 47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeString8(address); 47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) flags); 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 475fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten if (status != NO_ERROR) { 476fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent *output = AUDIO_IO_HANDLE_NONE; 477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return status; 478c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status = (status_t)reply.readInt32(); 480f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent if (status != NO_ERROR) { 481f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent *output = AUDIO_IO_HANDLE_NONE; 482f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return status; 483f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 484f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 485f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent ALOGV("openOutput() returned output, %d", *output); 486f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply.read(config, sizeof(audio_config_t)); 487f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent *devices = (audio_devices_t)reply.readInt32(); 488f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent *latencyMs = reply.readInt32(); 489342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 490342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 491342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 492342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 493342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent audio_io_handle_t output2) 494342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 495342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 496342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInt32((int32_t) output1); 498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInt32((int32_t) output2); 499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 500342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return (audio_io_handle_t) reply.readInt32(); 501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent virtual status_t closeOutput(audio_io_handle_t output) 504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInt32((int32_t) output); 508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 50905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return reply.readInt32(); 51005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 51105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 51205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent virtual status_t suspendOutput(audio_io_handle_t output) 51305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 51405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 51505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 51605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInt32((int32_t) output); 51705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 518be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return reply.readInt32(); 519be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 520be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 521be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t restoreOutput(audio_io_handle_t output) 522be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 523be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 524be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 525be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32((int32_t) output); 526be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return reply.readInt32(); 528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t openInput(audio_module_handle_t module, 5313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen audio_io_handle_t *input, 5323a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen audio_config_t *config, 5333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen audio_devices_t *device, 5343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen const String8& address, 5353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen audio_source_t source, 5363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen audio_input_flags_t flags) 5373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen if (input == NULL || config == NULL || device == NULL) { 5393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return BAD_VALUE; 5403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(module); 5443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(*input); 5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.write(config, sizeof(audio_config_t)); 5463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(*device); 547be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeString8(address); 548be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(source); 549be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(flags); 550be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(OPEN_INPUT, data, &reply); 551be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 552be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *input = AUDIO_IO_HANDLE_NONE; 553be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 554be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 555be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = (status_t)reply.readInt32(); 556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *input = AUDIO_IO_HANDLE_NONE; 558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *input = (audio_io_handle_t)reply.readInt32(); 561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(config, sizeof(audio_config_t)); 562be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *device = (audio_devices_t)reply.readInt32(); 563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 565ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t closeInput(int input) 567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(input); 571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 572ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return reply.readInt32(); 573ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t invalidateStream(audio_stream_type_t stream) 576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32((int32_t) stream); 580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent remote()->transact(INVALIDATE_STREAM, data, &reply); 581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return reply.readInt32(); 582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t setVoiceVolume(float volume) 585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeFloat(volume); 589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return reply.readInt32(); 591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_io_handle_t output) const 595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32((int32_t) output); 599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = reply.readInt32(); 601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t tmp = reply.readInt32(); 603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (halFrames != NULL) { 604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *halFrames = tmp; 605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (dspFrames != NULL) { 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *dspFrames = tmp; 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32((int32_t) ioHandle); 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return 0; 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return (uint32_t) reply.readInt32(); 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) 627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32((int32_t) use); 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_unique_id_t id = AUDIO_SESSION_ALLOCATE; 633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 63529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block } 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual void acquireAudioSessionId(audio_session_t audioSession, int pid) 640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(audioSession); 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(pid); 645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent virtual void releaseAudioSessionId(audio_session_t audioSession, int pid) 649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(audioSession); 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(pid); 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 655de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 656de070137f11d346fba77605bd76a44c040a618fcEric Laurent 657de070137f11d346fba77605bd76a44c040a618fcEric Laurent virtual status_t queryNumberEffects(uint32_t *numEffects) const 658de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 659de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 660de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 661de070137f11d346fba77605bd76a44c040a618fcEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 662de070137f11d346fba77605bd76a44c040a618fcEric Laurent if (status != NO_ERROR) { 663de070137f11d346fba77605bd76a44c040a618fcEric Laurent return status; 664de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 665de070137f11d346fba77605bd76a44c040a618fcEric Laurent status = reply.readInt32(); 66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NO_ERROR) { 66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return status; 66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (numEffects != NULL) { 67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *numEffects = (uint32_t)reply.readInt32(); 67189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 67289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 67389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 67489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 67589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 67789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (pDescriptor == NULL) { 67889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BAD_VALUE; 67989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 68089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 68189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 68289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(index); 68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NO_ERROR) { 68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return status; 686fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NO_ERROR) { 68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return status; 690fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten } 691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 69689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project effect_descriptor_t *pDescriptor) const 69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 69889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (pUuid == NULL || pDescriptor == NULL) { 69989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BAD_VALUE; 700fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 70189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.write(pUuid, sizeof(effect_uuid_t)); 70489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 70589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NO_ERROR) { 706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 70789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 708c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent status = reply.readInt32(); 709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 71189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 71289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply.read(pDescriptor, sizeof(effect_descriptor_t)); 71389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 71489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 71589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual sp<IEffect> createEffect( 717fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent effect_descriptor_t *pDesc, 71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const sp<IEffectClient>& client, 71989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int32_t priority, 72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_io_handle_t output, 72189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_session_t sessionId, 722fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent const String16& opPackageName, 72389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid, 72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t *status, 72589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int *id, 72689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int *enabled) 727fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent { 72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<IEffect> effect; 73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (pDesc == NULL) { 732fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return effect; 73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NULL) { 73489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *status = BAD_VALUE; 73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 73689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 737fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 73989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.write(pDesc, sizeof(effect_descriptor_t)); 74089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeStrongBinder(IInterface::asBinder(client)); 74189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(priority); 74289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) output); 74389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(sessionId); 74489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeString16(opPackageName); 74589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) pid); 74689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 74789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 74989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ALOGE("createEffect error: %s", strerror(-lStatus)); 75089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lStatus = reply.readInt32(); 75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int tmp = reply.readInt32(); 75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (id != NULL) { 75489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *id = tmp; 75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 75689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project tmp = reply.readInt32(); 75789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (enabled != NULL) { 75889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *enabled = tmp; 75989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 76089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project effect = interface_cast<IEffect>(reply.readStrongBinder()); 76189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply.read(pDesc, sizeof(effect_descriptor_t)); 76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 763c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (status != NULL) { 764fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent *status = lStatus; 765fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten } 76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return effect; 76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput, 771fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten audio_io_handle_t dstOutput) 77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(session); 77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32((int32_t) srcOutput); 777fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32((int32_t) dstOutput); 778fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten remote()->transact(MOVE_EFFECTS, data, &reply); 77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual audio_module_handle_t loadHwModule(const char *name) 78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 784fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten Parcel data, reply; 78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeCString(name); 78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LOAD_HW_MODULE, data, &reply); 78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return (audio_module_handle_t) reply.readInt32(); 78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual uint32_t getPrimaryOutputSamplingRate() 79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 79489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual size_t getPrimaryOutputFrameCount() 80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt64(); 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 806fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setLowRamDevice(bool isLowRamDevice) 808c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 810c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 811c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32((int) isLowRamDevice); 812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 813fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return reply.readInt32(); 814c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 815c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t listAudioPorts(unsigned int *num_ports, 816c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent struct audio_port *ports) 817c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 818c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BAD_VALUE; 82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 82189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 82389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(*num_ports); 82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (status != NO_ERROR || 82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (status = (status_t)reply.readInt32()) != NO_ERROR) { 82789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return status; 82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *num_ports = (unsigned int)reply.readInt32(); 83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply.read(ports, *num_ports * sizeof(struct audio_port)); 83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return status; 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t getAudioPort(struct audio_port *port) 834c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (port == NULL) { 836c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BAD_VALUE; 837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 839c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 840c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.write(port, sizeof(struct audio_port)); 841fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 842c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (status != NO_ERROR || 843c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 844c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return status; 845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply.read(port, sizeof(struct audio_port)); 8473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block return status; 848fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent audio_patch_handle_t *handle) 851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 852c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (patch == NULL || handle == NULL) { 853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BAD_VALUE; 854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.write(patch, sizeof(struct audio_patch)); 858fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 859fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 860fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent if (status != NO_ERROR || 861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return status; 863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 865fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent return status; 866c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 867c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 870fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 871c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (status != NO_ERROR) { 874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent status = (status_t)reply.readInt32(); 875fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return status; 877c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 878c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 879c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent struct audio_patch *patches) 880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return BAD_VALUE; 883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 884c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 886fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(*num_patches); 887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (status != NO_ERROR || 889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return status; 891fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent *num_patches = (unsigned int)reply.readInt32(); 893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply.read(patches, *num_patches * sizeof(struct audio_patch)); 894c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return status; 895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (config == NULL) { 89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BAD_VALUE; 900fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent } 90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.write(config, sizeof(struct audio_port_config)); 90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (status != NO_ERROR) { 906fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent status = (status_t)reply.readInt32(); 907fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten } 90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return status; 90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 910f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 911f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 912f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 913f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 914f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInt32(sessionId); 915f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply); 916342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status != NO_ERROR) { 917342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return AUDIO_HW_SYNC_INVALID; 918342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 919342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return (audio_hw_sync_t)reply.readInt32(); 920342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 921342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent virtual status_t systemReady() 922342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 923342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 924342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 925342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 926342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 927342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const 928342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 92905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 93005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 93105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInt32((int32_t) ioHandle); 93205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); 93305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent if (status != NO_ERROR) { 93405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return 0; 935be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 936be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return reply.readInt64(); 937be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 938be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent}; 939be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 9403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco NelissenIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 9413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 9423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen// ---------------------------------------------------------------------- 9433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 9443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissenstatus_t BnAudioFlinger::onTransact( 9453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 9463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen{ 9473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen // Whitelist of relevant events to trigger log merging. 9483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen // Log merging should activate during audio activity of any kind. This are considered the 9493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen // most relevant events. 9503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen // TODO should select more wisely the items from the list 9513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen switch (code) { 952be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_TRACK: 953be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case OPEN_RECORD: 954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SET_MASTER_VOLUME: 955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SET_MASTER_MUTE: 956be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SET_STREAM_VOLUME: 957be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SET_STREAM_MUTE: 958be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SET_MIC_MUTE: 959be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SET_PARAMETERS: 960be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case OPEN_INPUT: 961be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SET_VOICE_VOLUME: 962ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case CREATE_EFFECT: 963be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case SYSTEM_READY: { 964be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent requestLogMerge(); 965ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 966be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 967be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent default: 968be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent break; 969be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 970be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent switch (code) { 971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_TRACK: { 972be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 973be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int streamType = data.readInt32(); 974be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t sampleRate = data.readInt32(); 975be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_format_t format = (audio_format_t) data.readInt32(); 976be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_channel_mask_t channelMask = data.readInt32(); 977be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent size_t frameCount = data.readInt64(); 978be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 979be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent bool haveSharedBuffer = data.readInt32() != 0; 980be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IMemory> buffer; 981be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (haveSharedBuffer) { 982be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent buffer = interface_cast<IMemory>(data.readStrongBinder()); 983be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 984be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 985be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent pid_t pid = (pid_t) data.readInt32(); 986be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent pid_t tid = (pid_t) data.readInt32(); 987be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_session_t sessionId = (audio_session_t) data.readInt32(); 988be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int clientUid = data.readInt32(); 989be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent audio_port_handle_t portId = (audio_port_handle_t) data.readInt32(); 990be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = NO_ERROR; 991be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IAudioTrack> track; 992be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if ((haveSharedBuffer && (buffer == 0)) || 993be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent ((buffer != 0) && (buffer->pointer() == NULL))) { 994be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent ALOGW("CREATE_TRACK: cannot retrieve shared memory"); 995be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = DEAD_OBJECT; 99605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } else { 997be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent track = createTrack( 998be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent (audio_stream_type_t) streamType, sampleRate, format, 999be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent channelMask, &frameCount, &flags, buffer, output, pid, tid, 1000be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent &sessionId, clientUid, &status, portId); 1001be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 1002be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1003be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt64(frameCount); 1004be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(flags); 1005de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(sessionId); 1006de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(status); 1007de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeStrongBinder(IInterface::asBinder(track)); 1008de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1009de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1010de070137f11d346fba77605bd76a44c040a618fcEric Laurent case OPEN_RECORD: { 1011de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1012de070137f11d346fba77605bd76a44c040a618fcEric Laurent audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_format_t format = (audio_format_t) data.readInt32(); 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_channel_mask_t channelMask = data.readInt32(); 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const String16& opPackageName = data.readString16(); 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project size_t frameCount = data.readInt64(); 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t pid = (pid_t) data.readInt32(); 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pid_t tid = (pid_t) data.readInt32(); 1021 int clientUid = data.readInt32(); 1022 audio_session_t sessionId = (audio_session_t) data.readInt32(); 1023 size_t notificationFrames = data.readInt64(); 1024 audio_port_handle_t portId = (audio_port_handle_t) data.readInt32(); 1025 sp<IMemory> cblk; 1026 sp<IMemory> buffers; 1027 status_t status = NO_ERROR; 1028 sp<IAudioRecord> record = openRecord(input, 1029 sampleRate, format, channelMask, opPackageName, &frameCount, &flags, 1030 pid, tid, clientUid, &sessionId, ¬ificationFrames, cblk, buffers, 1031 &status, portId); 1032 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 1033 reply->writeInt64(frameCount); 1034 reply->writeInt32(flags); 1035 reply->writeInt32(sessionId); 1036 reply->writeInt64(notificationFrames); 1037 reply->writeInt32(status); 1038 reply->writeStrongBinder(IInterface::asBinder(record)); 1039 reply->writeStrongBinder(IInterface::asBinder(cblk)); 1040 reply->writeStrongBinder(IInterface::asBinder(buffers)); 1041 return NO_ERROR; 1042 } break; 1043 case SAMPLE_RATE: { 1044 CHECK_INTERFACE(IAudioFlinger, data, reply); 1045 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 1046 return NO_ERROR; 1047 } break; 1048 1049 // RESERVED for channelCount() 1050 1051 case FORMAT: { 1052 CHECK_INTERFACE(IAudioFlinger, data, reply); 1053 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 1054 return NO_ERROR; 1055 } break; 1056 case FRAME_COUNT: { 1057 CHECK_INTERFACE(IAudioFlinger, data, reply); 1058 reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 1059 return NO_ERROR; 1060 } break; 1061 case LATENCY: { 1062 CHECK_INTERFACE(IAudioFlinger, data, reply); 1063 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 1064 return NO_ERROR; 1065 } break; 1066 case SET_MASTER_VOLUME: { 1067 CHECK_INTERFACE(IAudioFlinger, data, reply); 1068 reply->writeInt32( setMasterVolume(data.readFloat()) ); 1069 return NO_ERROR; 1070 } break; 1071 case SET_MASTER_MUTE: { 1072 CHECK_INTERFACE(IAudioFlinger, data, reply); 1073 reply->writeInt32( setMasterMute(data.readInt32()) ); 1074 return NO_ERROR; 1075 } break; 1076 case MASTER_VOLUME: { 1077 CHECK_INTERFACE(IAudioFlinger, data, reply); 1078 reply->writeFloat( masterVolume() ); 1079 return NO_ERROR; 1080 } break; 1081 case MASTER_MUTE: { 1082 CHECK_INTERFACE(IAudioFlinger, data, reply); 1083 reply->writeInt32( masterMute() ); 1084 return NO_ERROR; 1085 } break; 1086 case SET_STREAM_VOLUME: { 1087 CHECK_INTERFACE(IAudioFlinger, data, reply); 1088 int stream = data.readInt32(); 1089 float volume = data.readFloat(); 1090 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1091 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 1092 return NO_ERROR; 1093 } break; 1094 case SET_STREAM_MUTE: { 1095 CHECK_INTERFACE(IAudioFlinger, data, reply); 1096 int stream = data.readInt32(); 1097 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 1098 return NO_ERROR; 1099 } break; 1100 case STREAM_VOLUME: { 1101 CHECK_INTERFACE(IAudioFlinger, data, reply); 1102 int stream = data.readInt32(); 1103 int output = data.readInt32(); 1104 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 1105 return NO_ERROR; 1106 } break; 1107 case STREAM_MUTE: { 1108 CHECK_INTERFACE(IAudioFlinger, data, reply); 1109 int stream = data.readInt32(); 1110 reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 1111 return NO_ERROR; 1112 } break; 1113 case SET_MODE: { 1114 CHECK_INTERFACE(IAudioFlinger, data, reply); 1115 audio_mode_t mode = (audio_mode_t) data.readInt32(); 1116 reply->writeInt32( setMode(mode) ); 1117 return NO_ERROR; 1118 } break; 1119 case SET_MIC_MUTE: { 1120 CHECK_INTERFACE(IAudioFlinger, data, reply); 1121 int state = data.readInt32(); 1122 reply->writeInt32( setMicMute(state) ); 1123 return NO_ERROR; 1124 } break; 1125 case GET_MIC_MUTE: { 1126 CHECK_INTERFACE(IAudioFlinger, data, reply); 1127 reply->writeInt32( getMicMute() ); 1128 return NO_ERROR; 1129 } break; 1130 case SET_PARAMETERS: { 1131 CHECK_INTERFACE(IAudioFlinger, data, reply); 1132 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1133 String8 keyValuePairs(data.readString8()); 1134 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 1135 return NO_ERROR; 1136 } break; 1137 case GET_PARAMETERS: { 1138 CHECK_INTERFACE(IAudioFlinger, data, reply); 1139 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1140 String8 keys(data.readString8()); 1141 reply->writeString8(getParameters(ioHandle, keys)); 1142 return NO_ERROR; 1143 } break; 1144 1145 case REGISTER_CLIENT: { 1146 CHECK_INTERFACE(IAudioFlinger, data, reply); 1147 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 1148 data.readStrongBinder()); 1149 registerClient(client); 1150 return NO_ERROR; 1151 } break; 1152 case GET_INPUTBUFFERSIZE: { 1153 CHECK_INTERFACE(IAudioFlinger, data, reply); 1154 uint32_t sampleRate = data.readInt32(); 1155 audio_format_t format = (audio_format_t) data.readInt32(); 1156 audio_channel_mask_t channelMask = data.readInt32(); 1157 reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 1158 return NO_ERROR; 1159 } break; 1160 case OPEN_OUTPUT: { 1161 CHECK_INTERFACE(IAudioFlinger, data, reply); 1162 audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1163 audio_config_t config = {}; 1164 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1165 ALOGE("b/23905951"); 1166 } 1167 audio_devices_t devices = (audio_devices_t)data.readInt32(); 1168 String8 address(data.readString8()); 1169 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1170 uint32_t latencyMs = 0; 1171 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; 1172 status_t status = openOutput(module, &output, &config, 1173 &devices, address, &latencyMs, flags); 1174 ALOGV("OPEN_OUTPUT output, %d", output); 1175 reply->writeInt32((int32_t)status); 1176 if (status == NO_ERROR) { 1177 reply->writeInt32((int32_t)output); 1178 reply->write(&config, sizeof(audio_config_t)); 1179 reply->writeInt32(devices); 1180 reply->writeInt32(latencyMs); 1181 } 1182 return NO_ERROR; 1183 } break; 1184 case OPEN_DUPLICATE_OUTPUT: { 1185 CHECK_INTERFACE(IAudioFlinger, data, reply); 1186 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 1187 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 1188 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1189 return NO_ERROR; 1190 } break; 1191 case CLOSE_OUTPUT: { 1192 CHECK_INTERFACE(IAudioFlinger, data, reply); 1193 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1194 return NO_ERROR; 1195 } break; 1196 case SUSPEND_OUTPUT: { 1197 CHECK_INTERFACE(IAudioFlinger, data, reply); 1198 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1199 return NO_ERROR; 1200 } break; 1201 case RESTORE_OUTPUT: { 1202 CHECK_INTERFACE(IAudioFlinger, data, reply); 1203 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1204 return NO_ERROR; 1205 } break; 1206 case OPEN_INPUT: { 1207 CHECK_INTERFACE(IAudioFlinger, data, reply); 1208 audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1209 audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1210 audio_config_t config = {}; 1211 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1212 ALOGE("b/23905951"); 1213 } 1214 audio_devices_t device = (audio_devices_t)data.readInt32(); 1215 String8 address(data.readString8()); 1216 audio_source_t source = (audio_source_t)data.readInt32(); 1217 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1218 1219 status_t status = openInput(module, &input, &config, 1220 &device, address, source, flags); 1221 reply->writeInt32((int32_t) status); 1222 if (status == NO_ERROR) { 1223 reply->writeInt32((int32_t) input); 1224 reply->write(&config, sizeof(audio_config_t)); 1225 reply->writeInt32(device); 1226 } 1227 return NO_ERROR; 1228 } break; 1229 case CLOSE_INPUT: { 1230 CHECK_INTERFACE(IAudioFlinger, data, reply); 1231 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 1232 return NO_ERROR; 1233 } break; 1234 case INVALIDATE_STREAM: { 1235 CHECK_INTERFACE(IAudioFlinger, data, reply); 1236 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1237 reply->writeInt32(invalidateStream(stream)); 1238 return NO_ERROR; 1239 } break; 1240 case SET_VOICE_VOLUME: { 1241 CHECK_INTERFACE(IAudioFlinger, data, reply); 1242 float volume = data.readFloat(); 1243 reply->writeInt32( setVoiceVolume(volume) ); 1244 return NO_ERROR; 1245 } break; 1246 case GET_RENDER_POSITION: { 1247 CHECK_INTERFACE(IAudioFlinger, data, reply); 1248 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1249 uint32_t halFrames = 0; 1250 uint32_t dspFrames = 0; 1251 status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1252 reply->writeInt32(status); 1253 if (status == NO_ERROR) { 1254 reply->writeInt32(halFrames); 1255 reply->writeInt32(dspFrames); 1256 } 1257 return NO_ERROR; 1258 } 1259 case GET_INPUT_FRAMES_LOST: { 1260 CHECK_INTERFACE(IAudioFlinger, data, reply); 1261 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1262 reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 1263 return NO_ERROR; 1264 } break; 1265 case NEW_AUDIO_SESSION_ID: { 1266 CHECK_INTERFACE(IAudioFlinger, data, reply); 1267 reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32())); 1268 return NO_ERROR; 1269 } break; 1270 case ACQUIRE_AUDIO_SESSION_ID: { 1271 CHECK_INTERFACE(IAudioFlinger, data, reply); 1272 audio_session_t audioSession = (audio_session_t) data.readInt32(); 1273 int pid = data.readInt32(); 1274 acquireAudioSessionId(audioSession, pid); 1275 return NO_ERROR; 1276 } break; 1277 case RELEASE_AUDIO_SESSION_ID: { 1278 CHECK_INTERFACE(IAudioFlinger, data, reply); 1279 audio_session_t audioSession = (audio_session_t) data.readInt32(); 1280 int pid = data.readInt32(); 1281 releaseAudioSessionId(audioSession, pid); 1282 return NO_ERROR; 1283 } break; 1284 case QUERY_NUM_EFFECTS: { 1285 CHECK_INTERFACE(IAudioFlinger, data, reply); 1286 uint32_t numEffects = 0; 1287 status_t status = queryNumberEffects(&numEffects); 1288 reply->writeInt32(status); 1289 if (status == NO_ERROR) { 1290 reply->writeInt32((int32_t)numEffects); 1291 } 1292 return NO_ERROR; 1293 } 1294 case QUERY_EFFECT: { 1295 CHECK_INTERFACE(IAudioFlinger, data, reply); 1296 effect_descriptor_t desc = {}; 1297 status_t status = queryEffect(data.readInt32(), &desc); 1298 reply->writeInt32(status); 1299 if (status == NO_ERROR) { 1300 reply->write(&desc, sizeof(effect_descriptor_t)); 1301 } 1302 return NO_ERROR; 1303 } 1304 case GET_EFFECT_DESCRIPTOR: { 1305 CHECK_INTERFACE(IAudioFlinger, data, reply); 1306 effect_uuid_t uuid; 1307 data.read(&uuid, sizeof(effect_uuid_t)); 1308 effect_descriptor_t desc = {}; 1309 status_t status = getEffectDescriptor(&uuid, &desc); 1310 reply->writeInt32(status); 1311 if (status == NO_ERROR) { 1312 reply->write(&desc, sizeof(effect_descriptor_t)); 1313 } 1314 return NO_ERROR; 1315 } 1316 case CREATE_EFFECT: { 1317 CHECK_INTERFACE(IAudioFlinger, data, reply); 1318 effect_descriptor_t desc = {}; 1319 if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1320 ALOGE("b/23905951"); 1321 } 1322 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1323 int32_t priority = data.readInt32(); 1324 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1325 audio_session_t sessionId = (audio_session_t) data.readInt32(); 1326 const String16 opPackageName = data.readString16(); 1327 pid_t pid = (pid_t)data.readInt32(); 1328 1329 status_t status = NO_ERROR; 1330 int id = 0; 1331 int enabled = 0; 1332 1333 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1334 opPackageName, pid, &status, &id, &enabled); 1335 reply->writeInt32(status); 1336 reply->writeInt32(id); 1337 reply->writeInt32(enabled); 1338 reply->writeStrongBinder(IInterface::asBinder(effect)); 1339 reply->write(&desc, sizeof(effect_descriptor_t)); 1340 return NO_ERROR; 1341 } break; 1342 case MOVE_EFFECTS: { 1343 CHECK_INTERFACE(IAudioFlinger, data, reply); 1344 audio_session_t session = (audio_session_t) data.readInt32(); 1345 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 1346 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1347 reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1348 return NO_ERROR; 1349 } break; 1350 case LOAD_HW_MODULE: { 1351 CHECK_INTERFACE(IAudioFlinger, data, reply); 1352 reply->writeInt32(loadHwModule(data.readCString())); 1353 return NO_ERROR; 1354 } break; 1355 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1356 CHECK_INTERFACE(IAudioFlinger, data, reply); 1357 reply->writeInt32(getPrimaryOutputSamplingRate()); 1358 return NO_ERROR; 1359 } break; 1360 case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1361 CHECK_INTERFACE(IAudioFlinger, data, reply); 1362 reply->writeInt64(getPrimaryOutputFrameCount()); 1363 return NO_ERROR; 1364 } break; 1365 case SET_LOW_RAM_DEVICE: { 1366 CHECK_INTERFACE(IAudioFlinger, data, reply); 1367 bool isLowRamDevice = data.readInt32() != 0; 1368 reply->writeInt32(setLowRamDevice(isLowRamDevice)); 1369 return NO_ERROR; 1370 } break; 1371 case LIST_AUDIO_PORTS: { 1372 CHECK_INTERFACE(IAudioFlinger, data, reply); 1373 unsigned int numPortsReq = data.readInt32(); 1374 if (numPortsReq > MAX_ITEMS_PER_LIST) { 1375 numPortsReq = MAX_ITEMS_PER_LIST; 1376 } 1377 unsigned int numPorts = numPortsReq; 1378 struct audio_port *ports = 1379 (struct audio_port *)calloc(numPortsReq, 1380 sizeof(struct audio_port)); 1381 if (ports == NULL) { 1382 reply->writeInt32(NO_MEMORY); 1383 reply->writeInt32(0); 1384 return NO_ERROR; 1385 } 1386 status_t status = listAudioPorts(&numPorts, ports); 1387 reply->writeInt32(status); 1388 reply->writeInt32(numPorts); 1389 if (status == NO_ERROR) { 1390 if (numPortsReq > numPorts) { 1391 numPortsReq = numPorts; 1392 } 1393 reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1394 } 1395 free(ports); 1396 return NO_ERROR; 1397 } break; 1398 case GET_AUDIO_PORT: { 1399 CHECK_INTERFACE(IAudioFlinger, data, reply); 1400 struct audio_port port = {}; 1401 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1402 ALOGE("b/23905951"); 1403 } 1404 status_t status = getAudioPort(&port); 1405 reply->writeInt32(status); 1406 if (status == NO_ERROR) { 1407 reply->write(&port, sizeof(struct audio_port)); 1408 } 1409 return NO_ERROR; 1410 } break; 1411 case CREATE_AUDIO_PATCH: { 1412 CHECK_INTERFACE(IAudioFlinger, data, reply); 1413 struct audio_patch patch; 1414 data.read(&patch, sizeof(struct audio_patch)); 1415 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1416 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1417 ALOGE("b/23905951"); 1418 } 1419 status_t status = createAudioPatch(&patch, &handle); 1420 reply->writeInt32(status); 1421 if (status == NO_ERROR) { 1422 reply->write(&handle, sizeof(audio_patch_handle_t)); 1423 } 1424 return NO_ERROR; 1425 } break; 1426 case RELEASE_AUDIO_PATCH: { 1427 CHECK_INTERFACE(IAudioFlinger, data, reply); 1428 audio_patch_handle_t handle; 1429 data.read(&handle, sizeof(audio_patch_handle_t)); 1430 status_t status = releaseAudioPatch(handle); 1431 reply->writeInt32(status); 1432 return NO_ERROR; 1433 } break; 1434 case LIST_AUDIO_PATCHES: { 1435 CHECK_INTERFACE(IAudioFlinger, data, reply); 1436 unsigned int numPatchesReq = data.readInt32(); 1437 if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1438 numPatchesReq = MAX_ITEMS_PER_LIST; 1439 } 1440 unsigned int numPatches = numPatchesReq; 1441 struct audio_patch *patches = 1442 (struct audio_patch *)calloc(numPatchesReq, 1443 sizeof(struct audio_patch)); 1444 if (patches == NULL) { 1445 reply->writeInt32(NO_MEMORY); 1446 reply->writeInt32(0); 1447 return NO_ERROR; 1448 } 1449 status_t status = listAudioPatches(&numPatches, patches); 1450 reply->writeInt32(status); 1451 reply->writeInt32(numPatches); 1452 if (status == NO_ERROR) { 1453 if (numPatchesReq > numPatches) { 1454 numPatchesReq = numPatches; 1455 } 1456 reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1457 } 1458 free(patches); 1459 return NO_ERROR; 1460 } break; 1461 case SET_AUDIO_PORT_CONFIG: { 1462 CHECK_INTERFACE(IAudioFlinger, data, reply); 1463 struct audio_port_config config; 1464 data.read(&config, sizeof(struct audio_port_config)); 1465 status_t status = setAudioPortConfig(&config); 1466 reply->writeInt32(status); 1467 return NO_ERROR; 1468 } break; 1469 case GET_AUDIO_HW_SYNC: { 1470 CHECK_INTERFACE(IAudioFlinger, data, reply); 1471 reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32())); 1472 return NO_ERROR; 1473 } break; 1474 case SYSTEM_READY: { 1475 CHECK_INTERFACE(IAudioFlinger, data, reply); 1476 systemReady(); 1477 return NO_ERROR; 1478 } break; 1479 case FRAME_COUNT_HAL: { 1480 CHECK_INTERFACE(IAudioFlinger, data, reply); 1481 reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); 1482 return NO_ERROR; 1483 } break; 1484 default: 1485 return BBinder::onTransact(code, data, reply, flags); 1486 } 1487} 1488 1489// ---------------------------------------------------------------------------- 1490 1491} // namespace android 1492