IAudioFlinger.cpp revision b1cc36b5d52de7cb3d78426d41dee87f25d7164a
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 25b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent#include <binder/IPCThreadState.h> 267562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h> 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2825a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "IAudioFlinger.h" 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 34f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CREATE_RECORD, 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SAMPLE_RATE, 365876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten RESERVED, // obsolete, was CHANNEL_COUNT 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FORMAT, 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FRAME_COUNT, 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LATENCY, 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_VOLUME, 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_MUTE, 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_VOLUME, 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_MUTE, 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_VOLUME, 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_MUTE, 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_VOLUME, 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_MUTE, 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MODE, 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MIC_MUTE, 5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_MIC_MUTE, 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PARAMETERS, 52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_PARAMETERS, 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project REGISTER_CLIENT, 5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_INPUTBUFFERSIZE, 55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_OUTPUT, 56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_DUPLICATE_OUTPUT, 57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_OUTPUT, 58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SUSPEND_OUTPUT, 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RESTORE_OUTPUT, 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_INPUT, 61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_INPUT, 62d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten INVALIDATE_STREAM, 63342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent SET_VOICE_VOLUME, 6405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_RENDER_POSITION, 65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_INPUT_FRAMES_LOST, 669eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten NEW_AUDIO_UNIQUE_ID, 673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen ACQUIRE_AUDIO_SESSION_ID, 683a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen RELEASE_AUDIO_SESSION_ID, 69be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent QUERY_NUM_EFFECTS, 70ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent QUERY_EFFECT, 71be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_EFFECT_DESCRIPTOR, 72de070137f11d346fba77605bd76a44c040a618fcEric Laurent CREATE_EFFECT, 73a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent MOVE_EFFECTS, 74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten LOAD_HW_MODULE, 75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_SAMPLING_RATE, 76cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_FRAME_COUNT, 774182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten SET_LOW_RAM_DEVICE, 784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PORTS, 794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent GET_AUDIO_PORT, 804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CREATE_AUDIO_PATCH, 814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent RELEASE_AUDIO_PATCH, 824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PATCHES, 8393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent SET_AUDIO_PORT_CONFIG, 849eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten GET_AUDIO_HW_SYNC_FOR_SESSION, 854a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten SYSTEM_READY, 864a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten FRAME_COUNT_HAL, 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024 90f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 94090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioFlinger(const sp<IBinder>& impl) 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 9921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input, 10021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackOutput& output, 10121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent status_t *status) 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1045841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 10621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 10721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (status == nullptr) { 10821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 11021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent input.writeToParcel(&data); 11221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 11521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack transaction error %d", lStatus); 11621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = DEAD_OBJECT; 11721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 11821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 11921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = reply.readInt32(); 12021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (*status != NO_ERROR) { 12121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack returned error %d", *status); 12221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 12321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 12421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 12521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (track == 0) { 12621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack returned an NULL IAudioTrack with status OK"); 12721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = DEAD_OBJECT; 12821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 12921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 13021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output.readFromParcel(&reply); 1315841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 134f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input, 135f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordOutput& output, 136f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t *status) 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 139ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano sp<media::IAudioRecord> record; 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 141f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 142f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (status == nullptr) { 143f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 144f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 145f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 146f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent input.writeToParcel(&data); 147f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 148f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply); 1495841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 150f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord transaction error %d", lStatus); 151f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = DEAD_OBJECT; 152f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 154f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = reply.readInt32(); 155f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (*status != NO_ERROR) { 156f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord returned error %d", *status); 157f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 1583e1acc0c58b337dec4054d78c28b48b2e77e0784Eric Laurent } 159f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 160f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent record = interface_cast<media::IAudioRecord>(reply.readStrongBinder()); 161f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (record == 0) { 162f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord returned a NULL IAudioRecord with status OK"); 163f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = DEAD_OBJECT; 164f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 165f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 166f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output.readFromParcel(&reply); 1675841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1702c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1742c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1794a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 1804a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 18172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 18572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 18758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1902c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual size_t frameCount(audio_io_handle_t ioHandle) const 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1942c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 196e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 19972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 20372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 24372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 247fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 24972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 254fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 258fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 268fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 26972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 274fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 278fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 283f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 30972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 31372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 33306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 337dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 338dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 344dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 346e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 349cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openOutput(audio_module_handle_t module, 350cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *output, 351cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 352cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 353cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 354cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t *latencyMs, 355cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_output_flags_t flags) 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 357cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 358cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 359cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 362a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 363cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 364cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*devices); 365cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 36618868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 367cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 368cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 369cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 370cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 371507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 372cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 373cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 374cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 375cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 376507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 377cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 378cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent ALOGV("openOutput() returned output, %d", *output); 379cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 380cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *devices = (audio_devices_t)reply.readInt32(); 381cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *latencyMs = reply.readInt32(); 382cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 38572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 38672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 39072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 39172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 39372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 41472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 41872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 423cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openInput(audio_module_handle_t module, 424cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *input, 425cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 426cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *device, 427cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 428cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source, 429cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_input_flags_t flags) 43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 431cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (input == NULL || config == NULL || device == NULL) { 432cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 433cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 436a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 437cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*input); 438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*device); 440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(source); 442ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten data.writeInt32(flags); 443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_INPUT, data, &reply); 444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 447507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 448cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 449cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 450cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 452507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = (audio_io_handle_t)reply.readInt32(); 454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *device = (audio_devices_t)reply.readInt32(); 456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 459fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 463fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 465c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 468d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten virtual status_t invalidateStream(audio_stream_type_t stream) 46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 472fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 473d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten remote()->transact(INVALIDATE_STREAM, data, &reply); 474c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 476f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 477f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 478f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 479f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 480f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 481f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 482f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 483f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 484f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 485342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 486377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 48772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 488342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 489342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 490342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 49172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 492342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 493342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 494342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 495342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 496507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 500507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 50605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 5075f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 50805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 50905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 51005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 51172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 5125f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 5135f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 5145f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 5155f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 5165f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 51705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 518be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 519eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) 520be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 521be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 522be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 523eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten data.writeInt32((int32_t) use); 5249eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply); 5259eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE; 526be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 531be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 532d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void acquireAudioSessionId(audio_session_t audioSession, int pid) 5333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 537d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 5383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 5393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 541d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void releaseAudioSessionId(audio_session_t audioSession, int pid) 5423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 546d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 550f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 551be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 552be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 553be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 554be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 555be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 5629d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 568f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 575ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 576ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 5885e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 589f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6098d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 61372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 614d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId, 615be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName, 616b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid, 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 625e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 626507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 627e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 628e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 629e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 63306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 63572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 637be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov data.writeString16(opPackageName); 638b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent data.writeInt32((int32_t) pid); 639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 64229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 646507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 650a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 656507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 662de070137f11d346fba77605bd76a44c040a618fcEric Laurent 663d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput, 66472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 665de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 666de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 667de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 668de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 66972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 67072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 671de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 672de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 673de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 674a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 675a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 676a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 677a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 678a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 679a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 680a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 681a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 682a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 683cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 6843b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 685cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 686cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 687cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 688cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 689cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 690cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 691cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 692e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 693cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 694cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 695cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 696cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 697e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 698cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 699cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7004182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten virtual status_t setLowRamDevice(bool isLowRamDevice) 7014182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 7024182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 7034182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7044182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten data.writeInt32((int) isLowRamDevice); 7054182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 7064182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return reply.readInt32(); 7074182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 7084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPorts(unsigned int *num_ports, 7094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports) 7104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 7124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_ports); 7174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 7184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_ports = (unsigned int)reply.readInt32(); 7234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(ports, *num_ports * sizeof(struct audio_port)); 7244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t getAudioPort(struct audio_port *port) 7274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (port == NULL) { 7294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(port, sizeof(struct audio_port)); 7344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 7354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(port, sizeof(struct audio_port)); 7404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 7434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t *handle) 7444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (patch == NULL || handle == NULL) { 7464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(patch, sizeof(struct audio_patch)); 7514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 7524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 7534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 7584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 7614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 7654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 7664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 7674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 7684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 7724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches) 7734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 7754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_patches); 7804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 7814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_patches = (unsigned int)reply.readInt32(); 7864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(patches, *num_patches * sizeof(struct audio_patch)); 7874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 7904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (config == NULL) { 7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(config, sizeof(struct audio_port_config)); 7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 80393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 80493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent { 80593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent Parcel data, reply; 80693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 80793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInt32(sessionId); 8089eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply); 80993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent if (status != NO_ERROR) { 81093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return AUDIO_HW_SYNC_INVALID; 81193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 81293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return (audio_hw_sync_t)reply.readInt32(); 81393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 81472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent virtual status_t systemReady() 81572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent { 81672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent Parcel data, reply; 81772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 81872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 81972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } 8204a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const 8214a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten { 8224a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten Parcel data, reply; 8234a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8244a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInt32((int32_t) ioHandle); 8254a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); 8264a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten if (status != NO_ERROR) { 8274a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return 0; 8284a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 8294a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return reply.readInt64(); 8304a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 840b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent // make sure transactions reserved to AudioPolicyManager do not come from other processes 841b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent switch (code) { 842b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_STREAM_VOLUME: 843b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_STREAM_MUTE: 844b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_MODE: 845b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_OUTPUT: 846b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_DUPLICATE_OUTPUT: 847b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CLOSE_OUTPUT: 848b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SUSPEND_OUTPUT: 849b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RESTORE_OUTPUT: 850b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_INPUT: 851b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CLOSE_INPUT: 852b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case INVALIDATE_STREAM: 853b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_VOICE_VOLUME: 854b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case MOVE_EFFECTS: 855b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LOAD_HW_MODULE: 856b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LIST_AUDIO_PORTS: 857b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case GET_AUDIO_PORT: 858b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CREATE_AUDIO_PATCH: 859b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RELEASE_AUDIO_PATCH: 860b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LIST_AUDIO_PATCHES: 861b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_AUDIO_PORT_CONFIG: 862b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent ALOGW("%s: transaction %d received from PID %d", 863b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent __func__, code, IPCThreadState::self()->getCallingPid()); 864b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent return INVALID_OPERATION; 865b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent default: 866b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent break; 867b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent } 868b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent 869dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Whitelist of relevant events to trigger log merging. 870dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Log merging should activate during audio activity of any kind. This are considered the 871dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // most relevant events. 872dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // TODO should select more wisely the items from the list 873dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet switch (code) { 874dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_TRACK: 875f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent case CREATE_RECORD: 876dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_VOLUME: 877dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_MUTE: 878dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MIC_MUTE: 879dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_PARAMETERS: 880dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_EFFECT: 881dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SYSTEM_READY: { 882dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet requestLogMerge(); 883dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 884dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 885dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet default: 886dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 887dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 888b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent 889e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 89221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 89321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackInput input; 89421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 89521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent reply->writeInt32(DEAD_OBJECT); 89621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return NO_ERROR; 8973d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 89821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 89921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent status_t status; 90021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackOutput output; 90121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 90221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent sp<IAudioTrack> track= createTrack(input, 90321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output, 90421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent &status); 90521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 90621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 90821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (status != NO_ERROR) { 90921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return NO_ERROR; 91021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 91106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(track)); 91221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output.writeToParcel(reply); 91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 915f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent case CREATE_RECORD: { 91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 917f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 918f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordInput input; 919f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 920f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent reply->writeInt32(DEAD_OBJECT); 921f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return NO_ERROR; 922f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 923f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 924f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t status; 925f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordOutput output; 926f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 927f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent sp<media::IAudioRecord> record = createRecord(input, 928f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output, 929f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent &status); 930f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 931e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 933f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (status != NO_ERROR) { 934f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return NO_ERROR; 935f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 93606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(record)); 937f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output.writeToParcel(reply); 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 94272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 9454a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 9464a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 9474a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 95072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 95289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 95389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 955e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 96072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 963e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 97689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 986c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 98772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 988fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 994fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1000fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 1001fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1007fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1012f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1027c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1030c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 1031c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 1033e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1034c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 1035c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 103672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 1039c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1040e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1041c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 104585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 105258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1053dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1054e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1057c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 1058c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1059a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1060e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1061e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1062e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1063e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1064a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1065cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 10660ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1067983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t latencyMs = 0; 10684cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; 1069cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openOutput(module, &output, &config, 1070cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &devices, address, &latencyMs, flags); 10717074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten ALOGV("OPEN_OUTPUT output, %d", output); 1072cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)status); 1073cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1074cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)output); 1075cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1076cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(devices); 1077cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(latencyMs); 1078cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1079c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1080c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1081c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 1082c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 108372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 108472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 108572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 109072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1091c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1092c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1093c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 1094c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 109572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1096c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1097c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1098c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 1099c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 110072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 1104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1105a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1106cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1107e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1108e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1109e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1110e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1111cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t device = (audio_devices_t)data.readInt32(); 1112cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 1113cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source = (audio_source_t)data.readInt32(); 1114ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1116cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openInput(module, &input, &config, 1117cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &device, address, source, flags); 1118cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) status); 1119cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1120cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) input); 1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1122cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(device); 1123cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 112872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 113089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1131d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten case INVALIDATE_STREAM: { 113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1133d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1134d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten reply->writeInt32(invalidateStream(stream)); 113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 113689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1137f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1138f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1139f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1140f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1141f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1142f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1143342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1144342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 114572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1146983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t halFrames = 0; 1147983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t dspFrames = 0; 1148342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1149342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1150342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1151342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1152342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1153342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1154342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1155342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 115605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 115705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 115872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 11595f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 116005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 116105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 11629eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten case NEW_AUDIO_UNIQUE_ID: { 1163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1164eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32())); 1165be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1166be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 11673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 11683a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1169d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1170d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1171d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen acquireAudioSessionId(audioSession, pid); 11723a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 11733a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 11743a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 11753a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1176d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1177d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1178d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen releaseAudioSessionId(audioSession, pid); 11793a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 11803a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1181be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1182be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1183983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t numEffects = 0; 1184be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1185be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1186be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1187be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1188be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1189be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1190be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1191ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1192be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1193983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1194ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1195be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1196be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1197be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1198be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1199be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1200be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1201be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1202be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1203be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1204be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1205983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1206be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1208be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1211be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1214be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1215e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia effect_descriptor_t desc = {}; 1216e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1217e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1218e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1220be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 122172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1222d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId = (audio_session_t) data.readInt32(); 1223be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 opPackageName = data.readString16(); 1224b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid = (pid_t)data.readInt32(); 1225b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent 1226983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia status_t status = NO_ERROR; 1227983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int id = 0; 1228983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int enabled = 0; 122905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 12308d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1231b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent opPackageName, pid, &status, &id, &enabled); 1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 123506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(effect)); 1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1238be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1239de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1240de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1241d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 124272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 124372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1244de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1245de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1246de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1247a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1248a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1249a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1250a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1251a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1252cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1253cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1254cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1255cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1256cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1257cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1258cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1259e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64(getPrimaryOutputFrameCount()); 1260cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1261cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 12624182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 12634182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 12644182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten bool isLowRamDevice = data.readInt32() != 0; 12654182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten reply->writeInt32(setLowRamDevice(isLowRamDevice)); 12664182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 12674182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 12684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PORTS: { 12694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1270f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPortsReq = data.readInt32(); 1271f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 1272f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 1273f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1274f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPorts = numPortsReq; 12754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports = 1276f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_port *)calloc(numPortsReq, 12774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_port)); 1278f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (ports == NULL) { 1279f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1280f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1281f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1282f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1283f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPorts(&numPorts, ports); 12844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1285f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPorts); 12864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1287f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > numPorts) { 1288f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = numPorts; 1289f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1290f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 12914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 12924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(ports); 12934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 12944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 12954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case GET_AUDIO_PORT: { 12964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1297e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1298e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1299e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1300e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = getAudioPort(&port); 13024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&port, sizeof(struct audio_port)); 13054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case CREATE_AUDIO_PATCH: { 13094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch patch; 13114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1312a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1313e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1314e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1315e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = createAudioPatch(&patch, &handle); 13174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 13204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case RELEASE_AUDIO_PATCH: { 13244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t handle; 13264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 13274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = releaseAudioPatch(handle); 13284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PATCHES: { 13324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatchesReq = data.readInt32(); 1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1335f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 1336f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1337f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatches = numPatchesReq; 13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches = 1339f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_patch *)calloc(numPatchesReq, 13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_patch)); 1341f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (patches == NULL) { 1342f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1343f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1344f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1345f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1346f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPatches(&numPatches, patches); 13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1348f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPatches); 13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1350f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > numPatches) { 1351f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = numPatches; 1352f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1353f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(patches); 13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case SET_AUDIO_PORT_CONFIG: { 13594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port_config config; 13614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&config, sizeof(struct audio_port_config)); 13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = setAudioPortConfig(&config); 13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13669eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten case GET_AUDIO_HW_SYNC_FOR_SESSION: { 136793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1368d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32())); 136993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return NO_ERROR; 137093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } break; 137172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent case SYSTEM_READY: { 137272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 137372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent systemReady(); 137472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return NO_ERROR; 137572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } break; 13764a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten case FRAME_COUNT_HAL: { 13774a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 13784a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); 13794a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return NO_ERROR; 13804a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } break; 138189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 138289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 138389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 138489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 138589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 138689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 138789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 138840bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1389