IAudioFlinger.cpp revision 9ff780e58ff96ff98acaae4166bb218880bf9e73
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> 274980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent#include <private/android_filesystem_config.h> 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2925a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "IAudioFlinger.h" 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum { 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 35f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CREATE_RECORD, 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SAMPLE_RATE, 375876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten RESERVED, // obsolete, was CHANNEL_COUNT 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FORMAT, 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project FRAME_COUNT, 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LATENCY, 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_VOLUME, 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MASTER_MUTE, 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_VOLUME, 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project MASTER_MUTE, 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_VOLUME, 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_STREAM_MUTE, 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_VOLUME, 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project STREAM_MUTE, 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MODE, 5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project SET_MIC_MUTE, 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_MIC_MUTE, 52f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov SET_RECORD_SILENCED, 53c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SET_PARAMETERS, 54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent GET_PARAMETERS, 5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project REGISTER_CLIENT, 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project GET_INPUTBUFFERSIZE, 57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_OUTPUT, 58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_DUPLICATE_OUTPUT, 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_OUTPUT, 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent SUSPEND_OUTPUT, 61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RESTORE_OUTPUT, 62c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent OPEN_INPUT, 63c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CLOSE_INPUT, 64d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten INVALIDATE_STREAM, 65342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent SET_VOICE_VOLUME, 6605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent GET_RENDER_POSITION, 67be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_INPUT_FRAMES_LOST, 689eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten NEW_AUDIO_UNIQUE_ID, 693a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen ACQUIRE_AUDIO_SESSION_ID, 703a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen RELEASE_AUDIO_SESSION_ID, 71be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent QUERY_NUM_EFFECTS, 72ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent QUERY_EFFECT, 73be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent GET_EFFECT_DESCRIPTOR, 74de070137f11d346fba77605bd76a44c040a618fcEric Laurent CREATE_EFFECT, 75a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent MOVE_EFFECTS, 76cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten LOAD_HW_MODULE, 77cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_SAMPLING_RATE, 78cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten GET_PRIMARY_OUTPUT_FRAME_COUNT, 794182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten SET_LOW_RAM_DEVICE, 804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PORTS, 814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent GET_AUDIO_PORT, 824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CREATE_AUDIO_PATCH, 834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent RELEASE_AUDIO_PATCH, 844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent LIST_AUDIO_PATCHES, 8593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent SET_AUDIO_PORT_CONFIG, 869eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten GET_AUDIO_HW_SYNC_FOR_SESSION, 874a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten SYSTEM_READY, 884a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten FRAME_COUNT_HAL, 899ff780e58ff96ff98acaae4166bb218880bf9e73jiabin GET_MICROPHONES, 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 92f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024 93f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic: 97090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpAudioFlinger(const sp<IBinder>& impl) 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input, 10321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackOutput& output, 10421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent status_t *status) 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 1075841db78dff14898538200287d246577b1fc37e2Eric Laurent sp<IAudioTrack> track; 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 10921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (status == nullptr) { 11121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 11321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent input.writeToParcel(&data); 11521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus != NO_ERROR) { 11821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack transaction error %d", lStatus); 11921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = DEAD_OBJECT; 12021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 12121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 12221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = reply.readInt32(); 12321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (*status != NO_ERROR) { 12421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack returned error %d", *status); 12521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 12621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 12721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 12821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (track == 0) { 12921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent ALOGE("createTrack returned an NULL IAudioTrack with status OK"); 13021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent *status = DEAD_OBJECT; 13121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return track; 13221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 13321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output.readFromParcel(&reply); 1345841db78dff14898538200287d246577b1fc37e2Eric Laurent return track; 13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input, 138f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordOutput& output, 139f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t *status) 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 142ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano sp<media::IAudioRecord> record; 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 144f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 145f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (status == nullptr) { 146f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 147f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 148f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 149f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent input.writeToParcel(&data); 150f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 151f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply); 1525841db78dff14898538200287d246577b1fc37e2Eric Laurent if (lStatus != NO_ERROR) { 153f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord transaction error %d", lStatus); 154f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = DEAD_OBJECT; 155f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 157f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = reply.readInt32(); 158f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (*status != NO_ERROR) { 159f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord returned error %d", *status); 160f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 1613e1acc0c58b337dec4054d78c28b48b2e77e0784Eric Laurent } 162f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 163f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent record = interface_cast<media::IAudioRecord>(reply.readStrongBinder()); 164f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (record == 0) { 165f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent ALOGE("createRecord returned a NULL IAudioRecord with status OK"); 166f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent *status = DEAD_OBJECT; 167f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return record; 168f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 169f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output.readFromParcel(&reply); 1705841db78dff14898538200287d246577b1fc37e2Eric Laurent return record; 17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1732c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const 17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1772c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1824a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 1834a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 18472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_format_t format(audio_io_handle_t output) const 18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 18872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FORMAT, data, &reply); 19058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten return (audio_format_t) reply.readInt32(); 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1932c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten virtual size_t frameCount(audio_io_handle_t ioHandle) const 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1972c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten data.writeInt32((int32_t) ioHandle); 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 199e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 20272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual uint32_t latency(audio_io_handle_t output) const 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 20672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(LATENCY, data, &reply); 20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterVolume(float value) 21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual status_t setMasterMute(bool muted) 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual float masterVolume() const 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project virtual bool masterMute() const 23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 24672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 250fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeFloat(value); 25272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 257fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 261fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(muted); 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 271fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 27272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readFloat(); 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 277fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten virtual bool streamMute(audio_stream_type_t stream) const 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 281fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 286f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten virtual status_t setMode(audio_mode_t mode) 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInt32(mode); 291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MODE, data, &reply); 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual status_t setMicMute(bool state) 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(state); 300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_MIC_MUTE, data, &reply); 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual bool getMicMute() const 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_MIC_MUTE, data, &reply); 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 312f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov virtual void setRecordSilenced(uid_t uid, bool silenced) 313f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov { 314f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov Parcel data, reply; 315f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 316f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.writeInt32(uid); 317f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.writeInt32(silenced ? 1 : 0); 318f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov remote()->transact(SET_RECORD_SILENCED, data, &reply); 319f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov } 320f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov 32172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 32572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keyValuePairs); 327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 33572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeString8(keys); 337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readString8(); 339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 34506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 349dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 350dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask) const 351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(sampleRate); 355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInt32(format); 356dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten data.writeInt32(channelMask); 357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 358e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 361cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openOutput(audio_module_handle_t module, 362cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *output, 363cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 364cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *devices, 365cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 366cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent uint32_t *latencyMs, 367cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_output_flags_t flags) 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 369cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 370cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 371cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 374a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 375cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 376cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*devices); 377cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 37818868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten data.writeInt32((int32_t) flags); 379cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 380cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 381cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 382cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 383507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 384cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 385cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 386cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = AUDIO_IO_HANDLE_NONE; 387cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 388507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 389cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *output = (audio_io_handle_t)reply.readInt32(); 390cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent ALOGV("openOutput() returned output, %d", *output); 391cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 392cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *devices = (audio_devices_t)reply.readInt32(); 393cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *latencyMs = reply.readInt32(); 394cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 39772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 39872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2) 399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output1); 40372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output2); 404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten return (audio_io_handle_t) reply.readInt32(); 406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 40872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t closeOutput(audio_io_handle_t output) 409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Parcel data, reply; 411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 41272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 41772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t suspendOutput(audio_io_handle_t output) 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 42172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return reply.readInt32(); 42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 42672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten virtual status_t restoreOutput(audio_io_handle_t output) 42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 43072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 435cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent virtual status_t openInput(audio_module_handle_t module, 436cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t *input, 437cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_config_t *config, 438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t *device, 439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent const String8& address, 440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source, 441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_input_flags_t flags) 44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (input == NULL || config == NULL || device == NULL) { 444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return BAD_VALUE; 445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 448a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInt32(module); 449cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*input); 450cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.write(config, sizeof(audio_config_t)); 451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(*device); 452cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeString8(address); 453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent data.writeInt32(source); 454ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten data.writeInt32(flags); 455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = remote()->transact(OPEN_INPUT, data, &reply); 456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 459507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status = (status_t)reply.readInt32(); 461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status != NO_ERROR) { 462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = AUDIO_IO_HANDLE_NONE; 463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return status; 464507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten } 465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *input = (audio_io_handle_t)reply.readInt32(); 466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply.read(config, sizeof(audio_config_t)); 467cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent *device = (audio_devices_t)reply.readInt32(); 468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent return NO_ERROR; 46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 470c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 471fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent virtual status_t closeInput(int input) 47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 475fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent data.writeInt32(input); 476c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 480d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten virtual status_t invalidateStream(audio_stream_type_t stream) 48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Parcel data, reply; 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 484fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten data.writeInt32((int32_t) stream); 485d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten remote()->transact(INVALIDATE_STREAM, data, &reply); 486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return reply.readInt32(); 48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 488f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent 489f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent virtual status_t setVoiceVolume(float volume) 490f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent { 491f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent Parcel data, reply; 492f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 493f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent data.writeFloat(volume); 494f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 495f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return reply.readInt32(); 496f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } 497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent 498377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 49972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output) const 500342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent { 501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent Parcel data, reply; 502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 50372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = reply.readInt32(); 506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent uint32_t tmp = reply.readInt32(); 508507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (halFrames != NULL) { 509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *halFrames = tmp; 510342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent tmp = reply.readInt32(); 512507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (dspFrames != NULL) { 513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent *dspFrames = tmp; 514342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 515342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 516342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return status; 517342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 51805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 5195f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 52005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent { 52105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent Parcel data, reply; 52205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 52372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) ioHandle); 5245f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 5255f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten if (status != NO_ERROR) { 5265f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return 0; 5275f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten } 5285f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten return (uint32_t) reply.readInt32(); 52905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } 530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 531eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) 532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 533be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 535eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten data.writeInt32((int32_t) use); 5369eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply); 5379eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE; 538be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 539be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent id = reply.readInt32(); 540be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return id; 542be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 543be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 544d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void acquireAudioSessionId(audio_session_t audioSession, int pid) 5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 549d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 5503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 5513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 553d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual void releaseAudioSessionId(audio_session_t audioSession, int pid) 5543a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen { 5553a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen Parcel data, reply; 5563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5573a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen data.writeInt32(audioSession); 558d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen data.writeInt32(pid); 5593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 5603a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } 5613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen 562f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryNumberEffects(uint32_t *numEffects) const 563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 5749d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (numEffects != NULL) { 575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *numEffects = (uint32_t)reply.readInt32(); 576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 580f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDescriptor == NULL) { 583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 587ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent data.writeInt32(index); 588ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6005e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 601f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten effect_descriptor_t *pDescriptor) const 602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return BAD_VALUE; 605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status = reply.readInt32(); 614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status != NO_ERROR) { 615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return status; 616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 6218d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten virtual sp<IEffect> createEffect( 622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_descriptor_t *pDesc, 623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent const sp<IEffectClient>& client, 624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority, 62572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output, 626d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId, 627be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16& opPackageName, 628b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid, 629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t *status, 630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *id, 631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int *enabled) 632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent Parcel data, reply; 634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffect> effect; 635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (pDesc == NULL) { 637e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten return effect; 638507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 639e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten *status = BAD_VALUE; 640e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 641e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } 642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 64506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(client)); 646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(priority); 64772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) output); 648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.writeInt32(sessionId); 649be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov data.writeString16(opPackageName); 650b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent data.writeInt32((int32_t) pid); 651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (lStatus != NO_ERROR) { 65429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("createEffect error: %s", strerror(-lStatus)); 655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } else { 656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent lStatus = reply.readInt32(); 657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int tmp = reply.readInt32(); 658507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (id != NULL) { 659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *id = tmp; 660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent tmp = reply.readInt32(); 662a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (enabled != NULL) { 663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *enabled = tmp; 664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 668507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten if (status != NULL) { 669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent *status = lStatus; 670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent 672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return effect; 673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 674de070137f11d346fba77605bd76a44c040a618fcEric Laurent 675d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput, 67672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput) 677de070137f11d346fba77605bd76a44c040a618fcEric Laurent { 678de070137f11d346fba77605bd76a44c040a618fcEric Laurent Parcel data, reply; 679de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 680de070137f11d346fba77605bd76a44c040a618fcEric Laurent data.writeInt32(session); 68172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) srcOutput); 68272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten data.writeInt32((int32_t) dstOutput); 683de070137f11d346fba77605bd76a44c040a618fcEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 684de070137f11d346fba77605bd76a44c040a618fcEric Laurent return reply.readInt32(); 685de070137f11d346fba77605bd76a44c040a618fcEric Laurent } 686a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent 687a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent virtual audio_module_handle_t loadHwModule(const char *name) 688a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent { 689a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent Parcel data, reply; 690a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 691a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent data.writeCString(name); 692a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent remote()->transact(LOAD_HW_MODULE, data, &reply); 693a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return (audio_module_handle_t) reply.readInt32(); 694a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } 695cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 6963b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten virtual uint32_t getPrimaryOutputSamplingRate() 697cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 698cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 699cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 700cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 701cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return reply.readInt32(); 702cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 703cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 704e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten virtual size_t getPrimaryOutputFrameCount() 705cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten { 706cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten Parcel data, reply; 707cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 708cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 709e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten return reply.readInt64(); 710cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } 711cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten 7126f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override 7134182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten { 7144182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten Parcel data, reply; 7156f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung 7166f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung static_assert(NO_ERROR == 0, "NO_ERROR must be 0"); 7176f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()) 7186f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: data.writeInt32((int) isLowRamDevice) 7196f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: data.writeInt64(totalMemory) 7206f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply) 7216f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung ?: reply.readInt32(); 7224182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } 7236f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung 7244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPorts(unsigned int *num_ports, 7254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports) 7264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 7284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_ports); 7334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 7344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_ports = (unsigned int)reply.readInt32(); 7394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(ports, *num_ports * sizeof(struct audio_port)); 7404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t getAudioPort(struct audio_port *port) 7434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (port == NULL) { 7454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(port, sizeof(struct audio_port)); 7504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 7514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(port, sizeof(struct audio_port)); 7564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t createAudioPatch(const struct audio_patch *patch, 7594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t *handle) 7604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (patch == NULL || handle == NULL) { 7624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(patch, sizeof(struct audio_patch)); 7674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(handle, sizeof(audio_patch_handle_t)); 7684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 7694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(handle, sizeof(audio_patch_handle_t)); 7744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 7774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(&handle, sizeof(audio_patch_handle_t)); 7814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 7824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 7834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 7844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 7864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t listAudioPatches(unsigned int *num_patches, 7884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches) 7894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 7904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 7914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInt32(*num_patches); 7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR || 7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent (status = (status_t)reply.readInt32()) != NO_ERROR) { 7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent *num_patches = (unsigned int)reply.readInt32(); 8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply.read(patches, *num_patches * sizeof(struct audio_patch)); 8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent virtual status_t setAudioPortConfig(const struct audio_port_config *config) 8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent { 8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (config == NULL) { 8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return BAD_VALUE; 8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent Parcel data, reply; 8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.write(config, sizeof(struct audio_port_config)); 8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status != NO_ERROR) { 8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status = (status_t)reply.readInt32(); 8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return status; 8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 81993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 82093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent { 82193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent Parcel data, reply; 82293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 82393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent data.writeInt32(sessionId); 8249eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply); 82593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent if (status != NO_ERROR) { 82693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return AUDIO_HW_SYNC_INVALID; 82793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 82893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return (audio_hw_sync_t)reply.readInt32(); 82993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } 83072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent virtual status_t systemReady() 83172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent { 83272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent Parcel data, reply; 83372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 83472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 83572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } 8364a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const 8374a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten { 8384a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten Parcel data, reply; 8394a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8404a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten data.writeInt32((int32_t) ioHandle); 8414a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); 8424a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten if (status != NO_ERROR) { 8434a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return 0; 8444a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 8454a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return reply.readInt64(); 8464a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } 84746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) 84846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin { 84946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin Parcel data, reply; 85046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8519ff780e58ff96ff98acaae4166bb218880bf9e73jiabin status_t status = remote()->transact(GET_MICROPHONES, data, &reply); 85246a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin if (status != NO_ERROR || 85346a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin (status = (status_t)reply.readInt32()) != NO_ERROR) { 85446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin return status; 85546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 85646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin status = reply.readParcelableVector(microphones); 85746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin return status; 85846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; 86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------- 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 868b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent // make sure transactions reserved to AudioPolicyManager do not come from other processes 869b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent switch (code) { 870b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_STREAM_VOLUME: 871b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_STREAM_MUTE: 872b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_MODE: 873b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_OUTPUT: 874b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_DUPLICATE_OUTPUT: 875b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CLOSE_OUTPUT: 876b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SUSPEND_OUTPUT: 877b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RESTORE_OUTPUT: 878b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case OPEN_INPUT: 879b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CLOSE_INPUT: 880b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case INVALIDATE_STREAM: 881b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_VOICE_VOLUME: 882b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case MOVE_EFFECTS: 883b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LOAD_HW_MODULE: 884b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LIST_AUDIO_PORTS: 885b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case GET_AUDIO_PORT: 886b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case CREATE_AUDIO_PATCH: 887b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case RELEASE_AUDIO_PATCH: 888b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case LIST_AUDIO_PATCHES: 889b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent case SET_AUDIO_PORT_CONFIG: 890f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov case SET_RECORD_SILENCED: 891b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent ALOGW("%s: transaction %d received from PID %d", 892b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent __func__, code, IPCThreadState::self()->getCallingPid()); 893b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent return INVALID_OPERATION; 894b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent default: 895b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent break; 896b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent } 897b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent 8984980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent // make sure the following transactions come from system components 8994980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent switch (code) { 9004980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MASTER_VOLUME: 9014980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MASTER_MUTE: 9024980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MODE: 9034980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_MIC_MUTE: 9044980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SET_LOW_RAM_DEVICE: 9054980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent case SYSTEM_READY: 9064980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent if (IPCThreadState::self()->getCallingUid() >= AID_APP_START) { 9074980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", 9084980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent __func__, code, IPCThreadState::self()->getCallingPid(), 9094980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent IPCThreadState::self()->getCallingUid()); 9104980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent return INVALID_OPERATION; 9114980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent } 9124980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent default: 9134980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent break; 9144980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent } 9154980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent 916dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Whitelist of relevant events to trigger log merging. 917dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // Log merging should activate during audio activity of any kind. This are considered the 918dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // most relevant events. 919dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet // TODO should select more wisely the items from the list 920dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet switch (code) { 921dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_TRACK: 922f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent case CREATE_RECORD: 923dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_VOLUME: 924dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MASTER_MUTE: 925dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_MIC_MUTE: 926dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SET_PARAMETERS: 927dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case CREATE_EFFECT: 928dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet case SYSTEM_READY: { 929dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet requestLogMerge(); 930dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 931dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 932dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet default: 933dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet break; 934dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet } 935b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent 936e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten switch (code) { 93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case CREATE_TRACK: { 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 93921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 94021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackInput input; 94121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 94221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent reply->writeInt32(DEAD_OBJECT); 94321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return NO_ERROR; 9443d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent } 94521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 94621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent status_t status; 94721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent CreateTrackOutput output; 94821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 94921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent sp<IAudioTrack> track= createTrack(input, 95021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output, 95121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent &status); 95221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent 95321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 95521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent if (status != NO_ERROR) { 95621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent return NO_ERROR; 95721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent } 95806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(track)); 95921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent output.writeToParcel(reply); 96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 962f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent case CREATE_RECORD: { 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 964f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 965f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordInput input; 966f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 967f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent reply->writeInt32(DEAD_OBJECT); 968f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return NO_ERROR; 969f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 970f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 971f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent status_t status; 972f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent CreateRecordOutput output; 973f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 974f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent sp<media::IAudioRecord> record = createRecord(input, 975f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output, 976f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent &status); 977f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent 978e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32(status); 980f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent if (status != NO_ERROR) { 981f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent return NO_ERROR; 982f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent } 98306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(record)); 984f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent output.writeToParcel(reply); 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SAMPLE_RATE: { 98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 98972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 9924a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 9934a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten // RESERVED for channelCount() 9944a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten 99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FORMAT: { 99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 99772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case FRAME_COUNT: { 100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1002e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case LATENCY: { 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 100772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1010e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten case SET_MASTER_VOLUME: { 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MASTER_MUTE: { 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_VOLUME: { 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeFloat( masterVolume() ); 102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MASTER_MUTE: { 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( masterMute() ); 102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_VOLUME: { 103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1033c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent float volume = data.readFloat(); 103472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1035fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_STREAM_MUTE: { 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1041fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_VOLUME: { 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1047fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent int output = data.readInt32(); 1048fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case STREAM_MUTE: { 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int stream = data.readInt32(); 1054fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MODE: { 105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1059f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten audio_mode_t mode = (audio_mode_t) data.readInt32(); 106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMode(mode) ); 106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case SET_MIC_MUTE: { 106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int state = data.readInt32(); 106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( setMicMute(state) ); 106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_MIC_MUTE: { 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project reply->writeInt32( getMicMute() ); 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1074f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov case SET_RECORD_SILENCED: { 1075f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov CHECK_INTERFACE(IAudioFlinger, data, reply); 1076f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov uid_t uid = data.readInt32(); 1077f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov audio_source_t source; 1078f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov data.read(&source, sizeof(audio_source_t)); 1079f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov bool silenced = data.readInt32() == 1; 1080f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov setRecordSilenced(uid, silenced); 1081f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov return NO_ERROR; 1082f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov } break; 1083c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SET_PARAMETERS: { 108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 108572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keyValuePairs(data.readString8()); 1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 1089e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1090c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case GET_PARAMETERS: { 1091c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 109272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1093c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent String8 keys(data.readString8()); 1094c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 1095c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1096e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten } break; 1097c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case REGISTER_CLIENT: { 109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 110085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 110185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten data.readStrongBinder()); 110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project registerClient(client); 110389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case GET_INPUTBUFFERSIZE: { 110689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 110789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project uint32_t sampleRate = data.readInt32(); 110858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten audio_format_t format = (audio_format_t) data.readInt32(); 1109dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten audio_channel_mask_t channelMask = data.readInt32(); 1110e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 111189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_OUTPUT: { 1114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1115a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1116e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1117e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1118e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1119e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1120a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_devices_t devices = (audio_devices_t)data.readInt32(); 1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 11220ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1123983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t latencyMs = 0; 11244cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; 1125cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openOutput(module, &output, &config, 1126cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &devices, address, &latencyMs, flags); 11277074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten ALOGV("OPEN_OUTPUT output, %d", output); 1128cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)status); 1129cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1130cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t)output); 1131cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1132cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(devices); 1133cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(latencyMs); 1134cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_DUPLICATE_OUTPUT: { 1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 113972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 114072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 114172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_OUTPUT: { 1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 114672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case SUSPEND_OUTPUT: { 1150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 115172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case RESTORE_OUTPUT: { 1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 115672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case OPEN_INPUT: { 1160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1161a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1162cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1163e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia audio_config_t config = {}; 1164e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1165e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1166e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1167cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_devices_t device = (audio_devices_t)data.readInt32(); 1168cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent String8 address(data.readString8()); 1169cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent audio_source_t source = (audio_source_t)data.readInt32(); 1170ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 1172cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent status_t status = openInput(module, &input, &config, 1173cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent &device, address, source, flags); 1174cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) status); 1175cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent if (status == NO_ERROR) { 1176cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32((int32_t) input); 1177cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->write(&config, sizeof(audio_config_t)); 1178cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent reply->writeInt32(device); 1179cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent } 1180c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return NO_ERROR; 1181c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } break; 1182c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent case CLOSE_INPUT: { 118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 118472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 118589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 118689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1187d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten case INVALIDATE_STREAM: { 118889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1189d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1190d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten reply->writeInt32(invalidateStream(stream)); 119189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 119289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } break; 1193f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent case SET_VOICE_VOLUME: { 1194f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1195f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent float volume = data.readFloat(); 1196f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 1197f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent return NO_ERROR; 1198f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent } break; 1199342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent case GET_RENDER_POSITION: { 1200342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 120172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1202983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t halFrames = 0; 1203983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t dspFrames = 0; 1204342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1205342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(status); 1206342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent if (status == NO_ERROR) { 1207342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(halFrames); 1208342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent reply->writeInt32(dspFrames); 1209342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 1210342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent return NO_ERROR; 1211342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent } 121205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent case GET_INPUT_FRAMES_LOST: { 121305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 121472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 12155f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 121605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent return NO_ERROR; 121705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent } break; 12189eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten case NEW_AUDIO_UNIQUE_ID: { 1219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1220eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32())); 1221be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1222be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 12233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case ACQUIRE_AUDIO_SESSION_ID: { 12243a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1225d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1226d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1227d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen acquireAudioSessionId(audioSession, pid); 12283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12293a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 12303a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen case RELEASE_AUDIO_SESSION_ID: { 12313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen CHECK_INTERFACE(IAudioFlinger, data, reply); 1232d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t audioSession = (audio_session_t) data.readInt32(); 1233d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen int pid = data.readInt32(); 1234d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen releaseAudioSessionId(audioSession, pid); 12353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen return NO_ERROR; 12363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen } break; 1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case QUERY_NUM_EFFECTS: { 1238be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1239983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia uint32_t numEffects = 0; 1240be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = queryNumberEffects(&numEffects); 1241be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32((int32_t)numEffects); 1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1246be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1247ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case QUERY_EFFECT: { 1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1249983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1250ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 1251be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1252be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1253be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case GET_EFFECT_DESCRIPTOR: { 1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1259be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent effect_uuid_t uuid; 1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 1261983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia effect_descriptor_t desc = {}; 1262be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 1263be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1264be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent if (status == NO_ERROR) { 1265be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1267be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1268be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } 1269be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent case CREATE_EFFECT: { 1270be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1271e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia effect_descriptor_t desc = {}; 1272e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1273e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1274e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 1275be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1276be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent int32_t priority = data.readInt32(); 127772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1278d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t sessionId = (audio_session_t) data.readInt32(); 1279be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov const String16 opPackageName = data.readString16(); 1280b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent pid_t pid = (pid_t)data.readInt32(); 1281b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent 1282983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia status_t status = NO_ERROR; 1283983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int id = 0; 1284983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia int enabled = 0; 128505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent 12868d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1287b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent opPackageName, pid, &status, &id, &enabled); 1288be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(status); 1289be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(id); 1290be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->writeInt32(enabled); 129106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(effect)); 1292be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 1293be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent return NO_ERROR; 1294be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent } break; 1295de070137f11d346fba77605bd76a44c040a618fcEric Laurent case MOVE_EFFECTS: { 1296de070137f11d346fba77605bd76a44c040a618fcEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1297d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session = (audio_session_t) data.readInt32(); 129872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 129972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1300de070137f11d346fba77605bd76a44c040a618fcEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1301de070137f11d346fba77605bd76a44c040a618fcEric Laurent return NO_ERROR; 1302de070137f11d346fba77605bd76a44c040a618fcEric Laurent } break; 1303a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent case LOAD_HW_MODULE: { 1304a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1305a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent reply->writeInt32(loadHwModule(data.readCString())); 1306a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent return NO_ERROR; 1307a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent } break; 1308cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1309cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1310cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten reply->writeInt32(getPrimaryOutputSamplingRate()); 1311cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1312cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 1313cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1314cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 1315e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten reply->writeInt64(getPrimaryOutputFrameCount()); 1316cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten return NO_ERROR; 1317cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten } break; 13184182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten case SET_LOW_RAM_DEVICE: { 13194182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 13206f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung int32_t isLowRamDevice; 13216f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung int64_t totalMemory; 13226f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung const status_t status = 13236f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung data.readInt32(&isLowRamDevice) ?: 13246f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung data.readInt64(&totalMemory) ?: 13256f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung setLowRamDevice(isLowRamDevice != 0, totalMemory); 13266f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung (void)reply->writeInt32(status); 13274182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten return NO_ERROR; 13284182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten } break; 13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PORTS: { 13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1331f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPortsReq = data.readInt32(); 1332f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > MAX_ITEMS_PER_LIST) { 1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = MAX_ITEMS_PER_LIST; 1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1335f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPorts = numPortsReq; 13364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port *ports = 1337f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_port *)calloc(numPortsReq, 13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_port)); 1339f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (ports == NULL) { 1340f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1341f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1342f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1343f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1344f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPorts(&numPorts, ports); 13454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1346f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPorts); 13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1348f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPortsReq > numPorts) { 1349f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPortsReq = numPorts; 1350f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1351f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(ports, numPortsReq * sizeof(struct audio_port)); 13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(ports); 13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case GET_AUDIO_PORT: { 13574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1358e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia struct audio_port port = {}; 1359e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1360e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1361e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = getAudioPort(&port); 13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&port, sizeof(struct audio_port)); 13664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case CREATE_AUDIO_PATCH: { 13704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch patch; 13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&patch, sizeof(struct audio_patch)); 1373a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1374e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1375e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia ALOGE("b/23905951"); 1376e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia } 13774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = createAudioPatch(&patch, &handle); 13784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 13804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->write(&handle, sizeof(audio_patch_handle_t)); 13814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 13824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case RELEASE_AUDIO_PATCH: { 13854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 13864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent audio_patch_handle_t handle; 13874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&handle, sizeof(audio_patch_handle_t)); 13884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = releaseAudioPatch(handle); 13894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 13904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 13914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 13924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case LIST_AUDIO_PATCHES: { 13934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1394f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatchesReq = data.readInt32(); 1395f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1396f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = MAX_ITEMS_PER_LIST; 1397f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1398f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent unsigned int numPatches = numPatchesReq; 13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_patch *patches = 1400f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent (struct audio_patch *)calloc(numPatchesReq, 14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent sizeof(struct audio_patch)); 1402f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (patches == NULL) { 1403f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(NO_MEMORY); 1404f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(0); 1405f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent return NO_ERROR; 1406f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1407f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent status_t status = listAudioPatches(&numPatches, patches); 14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 1409f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->writeInt32(numPatches); 14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent if (status == NO_ERROR) { 1411f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent if (numPatchesReq > numPatches) { 1412f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent numPatchesReq = numPatches; 1413f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent } 1414f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 14154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } 14164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent free(patches); 14174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent case SET_AUDIO_PORT_CONFIG: { 14204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 14214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent struct audio_port_config config; 14224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent data.read(&config, sizeof(struct audio_port_config)); 14234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent status_t status = setAudioPortConfig(&config); 14244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent reply->writeInt32(status); 14254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent return NO_ERROR; 14264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent } break; 14279eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten case GET_AUDIO_HW_SYNC_FOR_SESSION: { 142893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 1429d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32())); 143093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent return NO_ERROR; 143193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent } break; 143272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent case SYSTEM_READY: { 143372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 143472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent systemReady(); 143572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent return NO_ERROR; 143672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent } break; 14374a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten case FRAME_COUNT_HAL: { 14384a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten CHECK_INTERFACE(IAudioFlinger, data, reply); 14394a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); 14404a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten return NO_ERROR; 14414a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten } break; 14429ff780e58ff96ff98acaae4166bb218880bf9e73jiabin case GET_MICROPHONES: { 144346a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin CHECK_INTERFACE(IAudioFlinger, data, reply); 144446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin std::vector<media::MicrophoneInfo> microphones; 144546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin status_t status = getMicrophones(µphones); 144646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin reply->writeInt32(status); 144746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin if (status == NO_ERROR) { 144846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin reply->writeParcelableVector(microphones); 144946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 145046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin return NO_ERROR; 145146a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin } 145289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 145389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 145489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 145589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 145689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ---------------------------------------------------------------------------- 145889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android 1460