IAudioFlinger.cpp revision 9d1f02d74fd395ec4de6861147da289423f0ab6f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "IAudioFlinger" 19b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn//#define LOG_NDEBUG 0 204887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey#include <utils/Log.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 224887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey#include <stdint.h> 234887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey#include <sys/types.h> 24cb64d430627b71221c588ef5f23599dd34a89ee9Elliott Hughes 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <binder/Parcel.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27a0f8bc51aff98c2e23e73069e447f63397471a0aJesse Wilson#include <media/IAudioFlinger.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 30a0f8bc51aff98c2e23e73069e447f63397471a0aJesse Wilson 31a0f8bc51aff98c2e23e73069e447f63397471a0aJesse Wilsonenum { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_RECORD, 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SAMPLE_RATE, 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHANNEL_COUNT, 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FORMAT, 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FRAME_COUNT, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LATENCY, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MASTER_VOLUME, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MASTER_MUTE, 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MASTER_VOLUME, 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MASTER_MUTE, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_VOLUME, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_MUTE, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STREAM_VOLUME, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STREAM_MUTE, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MODE, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MIC_MUTE, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_MIC_MUTE, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_PARAMETERS, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_PARAMETERS, 5234f1ca7b79ff678a651aea4b82e032b798506b37Dave Bort REGISTER_CLIENT, 5334f1ca7b79ff678a651aea4b82e032b798506b37Dave Bort GET_INPUTBUFFERSIZE, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_OUTPUT, 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_DUPLICATE_OUTPUT, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_OUTPUT, 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SUSPEND_OUTPUT, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESTORE_OUTPUT, 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_INPUT, 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_INPUT, 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_OUTPUT, 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_VOICE_VOLUME, 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_RENDER_POSITION, 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_INPUT_FRAMES_LOST, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEW_AUDIO_SESSION_ID, 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ACQUIRE_AUDIO_SESSION_ID, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RELEASE_AUDIO_SESSION_ID, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project QUERY_NUM_EFFECTS, 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project QUERY_EFFECT, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_EFFECT_DESCRIPTOR, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_EFFECT, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MOVE_EFFECTS 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioTrack> createTrack( 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 85cb64d430627b71221c588ef5f23599dd34a89ee9Elliott Hughes audio_stream_type_t streamType, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_format_t format, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t channelMask, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output, 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int *sessionId, 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioTrack> track; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(pid); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) streamType); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(sampleRate); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(format); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(channelMask); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(frameCount); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(flags); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStrongBinder(sharedBuffer->asBinder()); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) output); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lSessionId = 0; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sessionId != NULL) { 110a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn lSessionId = *sessionId; 111a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn } 112a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn data.writeInt32(lSessionId); 113a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 114a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn if (lStatus != NO_ERROR) { 115a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn ALOGE("createTrack error: %s", strerror(-lStatus)); 116a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn } else { 117a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn lSessionId = reply.readInt32(); 118a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn if (sessionId != NULL) { 119a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn *sessionId = lSessionId; 120a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn } 121a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn lStatus = reply.readInt32(); 122a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 123a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn } 124a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn if (status) { 125a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn *status = lStatus; 126a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn } 127a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn return track; 128a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn } 129b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 130b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn virtual sp<IAudioRecord> openRecord( 131b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn pid_t pid, 132b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn audio_io_handle_t input, 133b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn uint32_t sampleRate, 134b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn audio_format_t format, 135b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn uint32_t channelMask, 136b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn int frameCount, 137b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn uint32_t flags, 138b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn int *sessionId, 139b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn status_t *status) 140b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn { 141b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn Parcel data, reply; 142b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn sp<IAudioRecord> record; 143b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 144b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32(pid); 145b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32((int32_t) input); 146b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32(sampleRate); 147b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32(format); 148b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32(channelMask); 149b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32(frameCount); 150b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32(flags); 151b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn int lSessionId = 0; 152b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn if (sessionId != NULL) { 153b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn lSessionId = *sessionId; 154b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 155b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32(lSessionId); 156b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 157b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn if (lStatus != NO_ERROR) { 158b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn ALOGE("openRecord error: %s", strerror(-lStatus)); 159b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } else { 160b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn lSessionId = reply.readInt32(); 161b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn if (sessionId != NULL) { 162b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn *sessionId = lSessionId; 163b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 164b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn lStatus = reply.readInt32(); 165b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 166b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 167b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn if (status) { 168b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn *status = lStatus; 169b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 170b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return record; 171b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 172b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 173b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn virtual uint32_t sampleRate(audio_io_handle_t output) const 174b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn { 175b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn Parcel data, reply; 176b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 177b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32((int32_t) output); 178b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn remote()->transact(SAMPLE_RATE, data, &reply); 179b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return reply.readInt32(); 180b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 181b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 182b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn virtual int channelCount(audio_io_handle_t output) const 183b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn { 184b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn Parcel data, reply; 185b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 186b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32((int32_t) output); 187b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn remote()->transact(CHANNEL_COUNT, data, &reply); 188b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return reply.readInt32(); 189b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 190b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 191b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn virtual audio_format_t format(audio_io_handle_t output) const 192b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn { 193b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn Parcel data, reply; 194b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 195b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32((int32_t) output); 196b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn remote()->transact(FORMAT, data, &reply); 197b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return (audio_format_t) reply.readInt32(); 198b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 199b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 200b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn virtual size_t frameCount(audio_io_handle_t output) const 201b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn { 202b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn Parcel data, reply; 203b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 204b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn data.writeInt32((int32_t) output); 205b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn remote()->transact(FRAME_COUNT, data, &reply); 206b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn return reply.readInt32(); 207b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn } 2084887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey 2094887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey virtual uint32_t latency(audio_io_handle_t output) const 2104887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey { 2114887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey Parcel data, reply; 2124887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2134887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInt32((int32_t) output); 2144887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey remote()->transact(LATENCY, data, &reply); 2154887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey return reply.readInt32(); 2164887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey } 2174887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey 2184887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey virtual status_t setMasterVolume(float value) 2194887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey { 2204887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey Parcel data, reply; 2214887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 22218e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla data.writeFloat(value); 2234887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey remote()->transact(SET_MASTER_VOLUME, data, &reply); 2244887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey return reply.readInt32(); 2254887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey } 2264887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey 2274887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey virtual status_t setMasterMute(bool muted) 2284887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey { 2294887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey Parcel data, reply; 2304887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2314887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInt32(muted); 2324887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey remote()->transact(SET_MASTER_MUTE, data, &reply); 2334887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey return reply.readInt32(); 2344887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey } 2354887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey 2364887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey virtual float masterVolume() const 2374887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey { 2384887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey Parcel data, reply; 23918e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2404887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey remote()->transact(MASTER_VOLUME, data, &reply); 2414887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey return reply.readFloat(); 2424887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey } 2434887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey 2444887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey virtual bool masterMute() const 2454887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey { 2464887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey Parcel data, reply; 24718e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 24818e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla remote()->transact(MASTER_MUTE, data, &reply); 24918e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla return reply.readInt32(); 2504887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey } 2514887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey 25218e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 2534887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey audio_io_handle_t output) 2544887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey { 2554887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey Parcel data, reply; 2564887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2574887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInt32((int32_t) stream); 2584887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeFloat(value); 2594887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey data.writeInt32((int32_t) output); 2604887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey remote()->transact(SET_STREAM_VOLUME, data, &reply); 2614887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey return reply.readInt32(); 2624887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey } 2634887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey 2644887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 26518e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla { 26618e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla Parcel data, reply; 26718e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 26818e7fc1114b138e9212db2d034013e40fb2cb7efEugene Susla data.writeInt32((int32_t) stream); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(muted); 270 remote()->transact(SET_STREAM_MUTE, data, &reply); 271 return reply.readInt32(); 272 } 273 274 virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 275 { 276 Parcel data, reply; 277 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 278 data.writeInt32((int32_t) stream); 279 data.writeInt32((int32_t) output); 280 remote()->transact(STREAM_VOLUME, data, &reply); 281 return reply.readFloat(); 282 } 283 284 virtual bool streamMute(audio_stream_type_t stream) const 285 { 286 Parcel data, reply; 287 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 288 data.writeInt32((int32_t) stream); 289 remote()->transact(STREAM_MUTE, data, &reply); 290 return reply.readInt32(); 291 } 292 293 virtual status_t setMode(audio_mode_t mode) 294 { 295 Parcel data, reply; 296 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 297 data.writeInt32(mode); 298 remote()->transact(SET_MODE, data, &reply); 299 return reply.readInt32(); 300 } 301 302 virtual status_t setMicMute(bool state) 303 { 304 Parcel data, reply; 305 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 306 data.writeInt32(state); 307 remote()->transact(SET_MIC_MUTE, data, &reply); 308 return reply.readInt32(); 309 } 310 311 virtual bool getMicMute() const 312 { 313 Parcel data, reply; 314 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 315 remote()->transact(GET_MIC_MUTE, data, &reply); 316 return reply.readInt32(); 317 } 318 319 virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 320 { 321 Parcel data, reply; 322 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 323 data.writeInt32((int32_t) ioHandle); 324 data.writeString8(keyValuePairs); 325 remote()->transact(SET_PARAMETERS, data, &reply); 326 return reply.readInt32(); 327 } 328 329 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 330 { 331 Parcel data, reply; 332 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 333 data.writeInt32((int32_t) ioHandle); 334 data.writeString8(keys); 335 remote()->transact(GET_PARAMETERS, data, &reply); 336 return reply.readString8(); 337 } 338 339 virtual void registerClient(const sp<IAudioFlingerClient>& client) 340 { 341 Parcel data, reply; 342 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 343 data.writeStrongBinder(client->asBinder()); 344 remote()->transact(REGISTER_CLIENT, data, &reply); 345 } 346 347 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, int channelCount) const 348 { 349 Parcel data, reply; 350 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 351 data.writeInt32(sampleRate); 352 data.writeInt32(format); 353 data.writeInt32(channelCount); 354 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 355 return reply.readInt32(); 356 } 357 358 virtual audio_io_handle_t openOutput(uint32_t *pDevices, 359 uint32_t *pSamplingRate, 360 audio_format_t *pFormat, 361 uint32_t *pChannels, 362 uint32_t *pLatencyMs, 363 uint32_t flags) 364 { 365 Parcel data, reply; 366 uint32_t devices = pDevices ? *pDevices : 0; 367 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 368 audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT; 369 uint32_t channels = pChannels ? *pChannels : 0; 370 uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 371 372 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 373 data.writeInt32(devices); 374 data.writeInt32(samplingRate); 375 data.writeInt32(format); 376 data.writeInt32(channels); 377 data.writeInt32(latency); 378 data.writeInt32(flags); 379 remote()->transact(OPEN_OUTPUT, data, &reply); 380 audio_io_handle_t output = (audio_io_handle_t) reply.readInt32(); 381 ALOGV("openOutput() returned output, %d", output); 382 devices = reply.readInt32(); 383 if (pDevices) *pDevices = devices; 384 samplingRate = reply.readInt32(); 385 if (pSamplingRate) *pSamplingRate = samplingRate; 386 format = (audio_format_t) reply.readInt32(); 387 if (pFormat) *pFormat = format; 388 channels = reply.readInt32(); 389 if (pChannels) *pChannels = channels; 390 latency = reply.readInt32(); 391 if (pLatencyMs) *pLatencyMs = latency; 392 return output; 393 } 394 395 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 396 audio_io_handle_t output2) 397 { 398 Parcel data, reply; 399 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 400 data.writeInt32((int32_t) output1); 401 data.writeInt32((int32_t) output2); 402 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 403 return (audio_io_handle_t) reply.readInt32(); 404 } 405 406 virtual status_t closeOutput(audio_io_handle_t output) 407 { 408 Parcel data, reply; 409 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 410 data.writeInt32((int32_t) output); 411 remote()->transact(CLOSE_OUTPUT, data, &reply); 412 return reply.readInt32(); 413 } 414 415 virtual status_t suspendOutput(audio_io_handle_t output) 416 { 417 Parcel data, reply; 418 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 419 data.writeInt32((int32_t) output); 420 remote()->transact(SUSPEND_OUTPUT, data, &reply); 421 return reply.readInt32(); 422 } 423 424 virtual status_t restoreOutput(audio_io_handle_t output) 425 { 426 Parcel data, reply; 427 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 428 data.writeInt32((int32_t) output); 429 remote()->transact(RESTORE_OUTPUT, data, &reply); 430 return reply.readInt32(); 431 } 432 433 virtual audio_io_handle_t openInput(uint32_t *pDevices, 434 uint32_t *pSamplingRate, 435 audio_format_t *pFormat, 436 uint32_t *pChannels, 437 audio_in_acoustics_t acoustics) 438 { 439 Parcel data, reply; 440 uint32_t devices = pDevices ? *pDevices : 0; 441 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 442 audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT; 443 uint32_t channels = pChannels ? *pChannels : 0; 444 445 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 446 data.writeInt32(devices); 447 data.writeInt32(samplingRate); 448 data.writeInt32(format); 449 data.writeInt32(channels); 450 data.writeInt32((int32_t) acoustics); 451 remote()->transact(OPEN_INPUT, data, &reply); 452 audio_io_handle_t input = (audio_io_handle_t) reply.readInt32(); 453 devices = reply.readInt32(); 454 if (pDevices) *pDevices = devices; 455 samplingRate = reply.readInt32(); 456 if (pSamplingRate) *pSamplingRate = samplingRate; 457 format = (audio_format_t) reply.readInt32(); 458 if (pFormat) *pFormat = format; 459 channels = reply.readInt32(); 460 if (pChannels) *pChannels = channels; 461 return input; 462 } 463 464 virtual status_t closeInput(int input) 465 { 466 Parcel data, reply; 467 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 468 data.writeInt32(input); 469 remote()->transact(CLOSE_INPUT, data, &reply); 470 return reply.readInt32(); 471 } 472 473 virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output) 474 { 475 Parcel data, reply; 476 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 477 data.writeInt32((int32_t) stream); 478 data.writeInt32((int32_t) output); 479 remote()->transact(SET_STREAM_OUTPUT, data, &reply); 480 return reply.readInt32(); 481 } 482 483 virtual status_t setVoiceVolume(float volume) 484 { 485 Parcel data, reply; 486 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 487 data.writeFloat(volume); 488 remote()->transact(SET_VOICE_VOLUME, data, &reply); 489 return reply.readInt32(); 490 } 491 492 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 493 audio_io_handle_t output) const 494 { 495 Parcel data, reply; 496 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 497 data.writeInt32((int32_t) output); 498 remote()->transact(GET_RENDER_POSITION, data, &reply); 499 status_t status = reply.readInt32(); 500 if (status == NO_ERROR) { 501 uint32_t tmp = reply.readInt32(); 502 if (halFrames) { 503 *halFrames = tmp; 504 } 505 tmp = reply.readInt32(); 506 if (dspFrames) { 507 *dspFrames = tmp; 508 } 509 } 510 return status; 511 } 512 513 virtual unsigned int getInputFramesLost(audio_io_handle_t ioHandle) const 514 { 515 Parcel data, reply; 516 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 517 data.writeInt32((int32_t) ioHandle); 518 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 519 return reply.readInt32(); 520 } 521 522 virtual int newAudioSessionId() 523 { 524 Parcel data, reply; 525 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 526 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 527 int id = 0; 528 if (status == NO_ERROR) { 529 id = reply.readInt32(); 530 } 531 return id; 532 } 533 534 virtual void acquireAudioSessionId(int audioSession) 535 { 536 Parcel data, reply; 537 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 538 data.writeInt32(audioSession); 539 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 540 } 541 542 virtual void releaseAudioSessionId(int audioSession) 543 { 544 Parcel data, reply; 545 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 546 data.writeInt32(audioSession); 547 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 548 } 549 550 virtual status_t queryNumberEffects(uint32_t *numEffects) const 551 { 552 Parcel data, reply; 553 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 554 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 555 if (status != NO_ERROR) { 556 return status; 557 } 558 status = reply.readInt32(); 559 if (status != NO_ERROR) { 560 return status; 561 } 562 if (numEffects != NULL) { 563 *numEffects = (uint32_t)reply.readInt32(); 564 } 565 return NO_ERROR; 566 } 567 568 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 569 { 570 if (pDescriptor == NULL) { 571 return BAD_VALUE; 572 } 573 Parcel data, reply; 574 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 575 data.writeInt32(index); 576 status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 577 if (status != NO_ERROR) { 578 return status; 579 } 580 status = reply.readInt32(); 581 if (status != NO_ERROR) { 582 return status; 583 } 584 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 585 return NO_ERROR; 586 } 587 588 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 589 effect_descriptor_t *pDescriptor) const 590 { 591 if (pUuid == NULL || pDescriptor == NULL) { 592 return BAD_VALUE; 593 } 594 Parcel data, reply; 595 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 596 data.write(pUuid, sizeof(effect_uuid_t)); 597 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 598 if (status != NO_ERROR) { 599 return status; 600 } 601 status = reply.readInt32(); 602 if (status != NO_ERROR) { 603 return status; 604 } 605 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 606 return NO_ERROR; 607 } 608 609 virtual sp<IEffect> createEffect(pid_t pid, 610 effect_descriptor_t *pDesc, 611 const sp<IEffectClient>& client, 612 int32_t priority, 613 audio_io_handle_t output, 614 int sessionId, 615 status_t *status, 616 int *id, 617 int *enabled) 618 { 619 Parcel data, reply; 620 sp<IEffect> effect; 621 622 if (pDesc == NULL) { 623 return effect; 624 if (status) { 625 *status = BAD_VALUE; 626 } 627 } 628 629 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 630 data.writeInt32(pid); 631 data.write(pDesc, sizeof(effect_descriptor_t)); 632 data.writeStrongBinder(client->asBinder()); 633 data.writeInt32(priority); 634 data.writeInt32((int32_t) output); 635 data.writeInt32(sessionId); 636 637 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 638 if (lStatus != NO_ERROR) { 639 ALOGE("createEffect error: %s", strerror(-lStatus)); 640 } else { 641 lStatus = reply.readInt32(); 642 int tmp = reply.readInt32(); 643 if (id) { 644 *id = tmp; 645 } 646 tmp = reply.readInt32(); 647 if (enabled != NULL) { 648 *enabled = tmp; 649 } 650 effect = interface_cast<IEffect>(reply.readStrongBinder()); 651 reply.read(pDesc, sizeof(effect_descriptor_t)); 652 } 653 if (status) { 654 *status = lStatus; 655 } 656 657 return effect; 658 } 659 660 virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, 661 audio_io_handle_t dstOutput) 662 { 663 Parcel data, reply; 664 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 665 data.writeInt32(session); 666 data.writeInt32((int32_t) srcOutput); 667 data.writeInt32((int32_t) dstOutput); 668 remote()->transact(MOVE_EFFECTS, data, &reply); 669 return reply.readInt32(); 670 } 671}; 672 673IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 674 675// ---------------------------------------------------------------------- 676 677status_t BnAudioFlinger::onTransact( 678 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 679{ 680 switch(code) { 681 case CREATE_TRACK: { 682 CHECK_INTERFACE(IAudioFlinger, data, reply); 683 pid_t pid = data.readInt32(); 684 int streamType = data.readInt32(); 685 uint32_t sampleRate = data.readInt32(); 686 audio_format_t format = (audio_format_t) data.readInt32(); 687 int channelCount = data.readInt32(); 688 size_t bufferCount = data.readInt32(); 689 uint32_t flags = data.readInt32(); 690 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 691 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 692 int sessionId = data.readInt32(); 693 status_t status; 694 sp<IAudioTrack> track = createTrack(pid, 695 (audio_stream_type_t) streamType, sampleRate, format, 696 channelCount, bufferCount, flags, buffer, output, &sessionId, &status); 697 reply->writeInt32(sessionId); 698 reply->writeInt32(status); 699 reply->writeStrongBinder(track->asBinder()); 700 return NO_ERROR; 701 } break; 702 case OPEN_RECORD: { 703 CHECK_INTERFACE(IAudioFlinger, data, reply); 704 pid_t pid = data.readInt32(); 705 audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 706 uint32_t sampleRate = data.readInt32(); 707 audio_format_t format = (audio_format_t) data.readInt32(); 708 int channelCount = data.readInt32(); 709 size_t bufferCount = data.readInt32(); 710 uint32_t flags = data.readInt32(); 711 int sessionId = data.readInt32(); 712 status_t status; 713 sp<IAudioRecord> record = openRecord(pid, input, 714 sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status); 715 reply->writeInt32(sessionId); 716 reply->writeInt32(status); 717 reply->writeStrongBinder(record->asBinder()); 718 return NO_ERROR; 719 } break; 720 case SAMPLE_RATE: { 721 CHECK_INTERFACE(IAudioFlinger, data, reply); 722 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 723 return NO_ERROR; 724 } break; 725 case CHANNEL_COUNT: { 726 CHECK_INTERFACE(IAudioFlinger, data, reply); 727 reply->writeInt32( channelCount((audio_io_handle_t) data.readInt32()) ); 728 return NO_ERROR; 729 } break; 730 case FORMAT: { 731 CHECK_INTERFACE(IAudioFlinger, data, reply); 732 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 733 return NO_ERROR; 734 } break; 735 case FRAME_COUNT: { 736 CHECK_INTERFACE(IAudioFlinger, data, reply); 737 reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) ); 738 return NO_ERROR; 739 } break; 740 case LATENCY: { 741 CHECK_INTERFACE(IAudioFlinger, data, reply); 742 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 743 return NO_ERROR; 744 } break; 745 case SET_MASTER_VOLUME: { 746 CHECK_INTERFACE(IAudioFlinger, data, reply); 747 reply->writeInt32( setMasterVolume(data.readFloat()) ); 748 return NO_ERROR; 749 } break; 750 case SET_MASTER_MUTE: { 751 CHECK_INTERFACE(IAudioFlinger, data, reply); 752 reply->writeInt32( setMasterMute(data.readInt32()) ); 753 return NO_ERROR; 754 } break; 755 case MASTER_VOLUME: { 756 CHECK_INTERFACE(IAudioFlinger, data, reply); 757 reply->writeFloat( masterVolume() ); 758 return NO_ERROR; 759 } break; 760 case MASTER_MUTE: { 761 CHECK_INTERFACE(IAudioFlinger, data, reply); 762 reply->writeInt32( masterMute() ); 763 return NO_ERROR; 764 } break; 765 case SET_STREAM_VOLUME: { 766 CHECK_INTERFACE(IAudioFlinger, data, reply); 767 int stream = data.readInt32(); 768 float volume = data.readFloat(); 769 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 770 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 771 return NO_ERROR; 772 } break; 773 case SET_STREAM_MUTE: { 774 CHECK_INTERFACE(IAudioFlinger, data, reply); 775 int stream = data.readInt32(); 776 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 777 return NO_ERROR; 778 } break; 779 case STREAM_VOLUME: { 780 CHECK_INTERFACE(IAudioFlinger, data, reply); 781 int stream = data.readInt32(); 782 int output = data.readInt32(); 783 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 784 return NO_ERROR; 785 } break; 786 case STREAM_MUTE: { 787 CHECK_INTERFACE(IAudioFlinger, data, reply); 788 int stream = data.readInt32(); 789 reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 790 return NO_ERROR; 791 } break; 792 case SET_MODE: { 793 CHECK_INTERFACE(IAudioFlinger, data, reply); 794 audio_mode_t mode = (audio_mode_t) data.readInt32(); 795 reply->writeInt32( setMode(mode) ); 796 return NO_ERROR; 797 } break; 798 case SET_MIC_MUTE: { 799 CHECK_INTERFACE(IAudioFlinger, data, reply); 800 int state = data.readInt32(); 801 reply->writeInt32( setMicMute(state) ); 802 return NO_ERROR; 803 } break; 804 case GET_MIC_MUTE: { 805 CHECK_INTERFACE(IAudioFlinger, data, reply); 806 reply->writeInt32( getMicMute() ); 807 return NO_ERROR; 808 } break; 809 case SET_PARAMETERS: { 810 CHECK_INTERFACE(IAudioFlinger, data, reply); 811 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 812 String8 keyValuePairs(data.readString8()); 813 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 814 return NO_ERROR; 815 } break; 816 case GET_PARAMETERS: { 817 CHECK_INTERFACE(IAudioFlinger, data, reply); 818 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 819 String8 keys(data.readString8()); 820 reply->writeString8(getParameters(ioHandle, keys)); 821 return NO_ERROR; 822 } break; 823 824 case REGISTER_CLIENT: { 825 CHECK_INTERFACE(IAudioFlinger, data, reply); 826 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 827 registerClient(client); 828 return NO_ERROR; 829 } break; 830 case GET_INPUTBUFFERSIZE: { 831 CHECK_INTERFACE(IAudioFlinger, data, reply); 832 uint32_t sampleRate = data.readInt32(); 833 audio_format_t format = (audio_format_t) data.readInt32(); 834 int channelCount = data.readInt32(); 835 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 836 return NO_ERROR; 837 } break; 838 case OPEN_OUTPUT: { 839 CHECK_INTERFACE(IAudioFlinger, data, reply); 840 uint32_t devices = data.readInt32(); 841 uint32_t samplingRate = data.readInt32(); 842 audio_format_t format = (audio_format_t) data.readInt32(); 843 uint32_t channels = data.readInt32(); 844 uint32_t latency = data.readInt32(); 845 uint32_t flags = data.readInt32(); 846 audio_io_handle_t output = openOutput(&devices, 847 &samplingRate, 848 &format, 849 &channels, 850 &latency, 851 flags); 852 ALOGV("OPEN_OUTPUT output, %p", output); 853 reply->writeInt32((int32_t) output); 854 reply->writeInt32(devices); 855 reply->writeInt32(samplingRate); 856 reply->writeInt32(format); 857 reply->writeInt32(channels); 858 reply->writeInt32(latency); 859 return NO_ERROR; 860 } break; 861 case OPEN_DUPLICATE_OUTPUT: { 862 CHECK_INTERFACE(IAudioFlinger, data, reply); 863 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 864 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 865 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 866 return NO_ERROR; 867 } break; 868 case CLOSE_OUTPUT: { 869 CHECK_INTERFACE(IAudioFlinger, data, reply); 870 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 871 return NO_ERROR; 872 } break; 873 case SUSPEND_OUTPUT: { 874 CHECK_INTERFACE(IAudioFlinger, data, reply); 875 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 876 return NO_ERROR; 877 } break; 878 case RESTORE_OUTPUT: { 879 CHECK_INTERFACE(IAudioFlinger, data, reply); 880 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 881 return NO_ERROR; 882 } break; 883 case OPEN_INPUT: { 884 CHECK_INTERFACE(IAudioFlinger, data, reply); 885 uint32_t devices = data.readInt32(); 886 uint32_t samplingRate = data.readInt32(); 887 audio_format_t format = (audio_format_t) data.readInt32(); 888 uint32_t channels = data.readInt32(); 889 audio_in_acoustics_t acoustics = (audio_in_acoustics_t) data.readInt32(); 890 891 audio_io_handle_t input = openInput(&devices, 892 &samplingRate, 893 &format, 894 &channels, 895 acoustics); 896 reply->writeInt32((int32_t) input); 897 reply->writeInt32(devices); 898 reply->writeInt32(samplingRate); 899 reply->writeInt32(format); 900 reply->writeInt32(channels); 901 return NO_ERROR; 902 } break; 903 case CLOSE_INPUT: { 904 CHECK_INTERFACE(IAudioFlinger, data, reply); 905 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 906 return NO_ERROR; 907 } break; 908 case SET_STREAM_OUTPUT: { 909 CHECK_INTERFACE(IAudioFlinger, data, reply); 910 uint32_t stream = data.readInt32(); 911 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 912 reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output)); 913 return NO_ERROR; 914 } break; 915 case SET_VOICE_VOLUME: { 916 CHECK_INTERFACE(IAudioFlinger, data, reply); 917 float volume = data.readFloat(); 918 reply->writeInt32( setVoiceVolume(volume) ); 919 return NO_ERROR; 920 } break; 921 case GET_RENDER_POSITION: { 922 CHECK_INTERFACE(IAudioFlinger, data, reply); 923 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 924 uint32_t halFrames; 925 uint32_t dspFrames; 926 status_t status = getRenderPosition(&halFrames, &dspFrames, output); 927 reply->writeInt32(status); 928 if (status == NO_ERROR) { 929 reply->writeInt32(halFrames); 930 reply->writeInt32(dspFrames); 931 } 932 return NO_ERROR; 933 } 934 case GET_INPUT_FRAMES_LOST: { 935 CHECK_INTERFACE(IAudioFlinger, data, reply); 936 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 937 reply->writeInt32(getInputFramesLost(ioHandle)); 938 return NO_ERROR; 939 } break; 940 case NEW_AUDIO_SESSION_ID: { 941 CHECK_INTERFACE(IAudioFlinger, data, reply); 942 reply->writeInt32(newAudioSessionId()); 943 return NO_ERROR; 944 } break; 945 case ACQUIRE_AUDIO_SESSION_ID: { 946 CHECK_INTERFACE(IAudioFlinger, data, reply); 947 int audioSession = data.readInt32(); 948 acquireAudioSessionId(audioSession); 949 return NO_ERROR; 950 } break; 951 case RELEASE_AUDIO_SESSION_ID: { 952 CHECK_INTERFACE(IAudioFlinger, data, reply); 953 int audioSession = data.readInt32(); 954 releaseAudioSessionId(audioSession); 955 return NO_ERROR; 956 } break; 957 case QUERY_NUM_EFFECTS: { 958 CHECK_INTERFACE(IAudioFlinger, data, reply); 959 uint32_t numEffects; 960 status_t status = queryNumberEffects(&numEffects); 961 reply->writeInt32(status); 962 if (status == NO_ERROR) { 963 reply->writeInt32((int32_t)numEffects); 964 } 965 return NO_ERROR; 966 } 967 case QUERY_EFFECT: { 968 CHECK_INTERFACE(IAudioFlinger, data, reply); 969 effect_descriptor_t desc; 970 status_t status = queryEffect(data.readInt32(), &desc); 971 reply->writeInt32(status); 972 if (status == NO_ERROR) { 973 reply->write(&desc, sizeof(effect_descriptor_t)); 974 } 975 return NO_ERROR; 976 } 977 case GET_EFFECT_DESCRIPTOR: { 978 CHECK_INTERFACE(IAudioFlinger, data, reply); 979 effect_uuid_t uuid; 980 data.read(&uuid, sizeof(effect_uuid_t)); 981 effect_descriptor_t desc; 982 status_t status = getEffectDescriptor(&uuid, &desc); 983 reply->writeInt32(status); 984 if (status == NO_ERROR) { 985 reply->write(&desc, sizeof(effect_descriptor_t)); 986 } 987 return NO_ERROR; 988 } 989 case CREATE_EFFECT: { 990 CHECK_INTERFACE(IAudioFlinger, data, reply); 991 pid_t pid = data.readInt32(); 992 effect_descriptor_t desc; 993 data.read(&desc, sizeof(effect_descriptor_t)); 994 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 995 int32_t priority = data.readInt32(); 996 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 997 int sessionId = data.readInt32(); 998 status_t status; 999 int id; 1000 int enabled; 1001 1002 sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled); 1003 reply->writeInt32(status); 1004 reply->writeInt32(id); 1005 reply->writeInt32(enabled); 1006 reply->writeStrongBinder(effect->asBinder()); 1007 reply->write(&desc, sizeof(effect_descriptor_t)); 1008 return NO_ERROR; 1009 } break; 1010 case MOVE_EFFECTS: { 1011 CHECK_INTERFACE(IAudioFlinger, data, reply); 1012 int session = data.readInt32(); 1013 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 1014 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1015 reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1016 return NO_ERROR; 1017 } break; 1018 default: 1019 return BBinder::onTransact(code, data, reply, flags); 1020 } 1021} 1022 1023// ---------------------------------------------------------------------------- 1024 1025}; // namespace android 1026