IAudioFlinger.cpp revision f0ee6f4055e26fb35d9c526a596668a4dc9da5ba
1e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu/* //device/extlibs/pv/android/IAudioflinger.cpp 2e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** 3e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** Copyright 2007, The Android Open Source Project 4e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** 5e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** Licensed under the Apache License, Version 2.0 (the "License"); 6e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** you may not use this file except in compliance with the License. 7e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** You may obtain a copy of the License at 8e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** 9e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** http://www.apache.org/licenses/LICENSE-2.0 10e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** 11e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** Unless required by applicable law or agreed to in writing, software 12e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** distributed under the License is distributed on an "AS IS" BASIS, 13e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** See the License for the specific language governing permissions and 15e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu** limitations under the License. 16e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu*/ 17e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 18b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu#define LOG_TAG "IAudioFlinger" 19def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas//#define LOG_NDEBUG 0 20def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas#include <utils/Log.h> 21def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 22def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas#include <stdint.h> 23ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas#include <sys/types.h> 24ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas 25ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas#include <binder/Parcel.h> 26ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas 27ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas#include <media/IAudioFlinger.h> 28ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas 29ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasnamespace android { 30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas 31e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Guenum { 32e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 33e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu OPEN_RECORD, 34e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SAMPLE_RATE, 35ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas CHANNEL_COUNT, 36e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu FORMAT, 37e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu FRAME_COUNT, 38e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu LATENCY, 39e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SET_MASTER_VOLUME, 40e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SET_MASTER_MUTE, 41e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu MASTER_VOLUME, 42e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu MASTER_MUTE, 43e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SET_STREAM_VOLUME, 44d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu SET_STREAM_MUTE, 45e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu STREAM_VOLUME, 46d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu STREAM_MUTE, 47e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SET_MODE, 48e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SET_MIC_MUTE, 49e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu GET_MIC_MUTE, 50e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu IS_MUSIC_ACTIVE, 51e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SET_PARAMETERS, 52e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu GET_PARAMETERS, 53e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu REGISTER_CLIENT, 54e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu GET_INPUTBUFFERSIZE, 55e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu OPEN_OUTPUT, 56e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu OPEN_DUPLICATE_OUTPUT, 57e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu CLOSE_OUTPUT, 58e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu SUSPEND_OUTPUT, 59e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu RESTORE_OUTPUT, 60e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu OPEN_INPUT, 61e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu CLOSE_INPUT, 62b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu SET_STREAM_OUTPUT, 63b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu SET_VOICE_VOLUME 644b331a8f2b6e99863c7ae0428bb4893320c452fcCraig Stout}; 654b331a8f2b6e99863c7ae0428bb4893320c452fcCraig Stout 66e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Guclass BpAudioFlinger : public BpInterface<IAudioFlinger> 67e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu{ 68e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gupublic: 69e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu BpAudioFlinger(const sp<IBinder>& impl) 70e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu : BpInterface<IAudioFlinger>(impl) 71e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 72e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 73e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 74e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual sp<IAudioTrack> createTrack( 75e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu pid_t pid, 76d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu int streamType, 77e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu uint32_t sampleRate, 78e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int format, 79e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int channelCount, 80e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int frameCount, 81e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu uint32_t flags, 82e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu const sp<IMemory>& sharedBuffer, 83e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int output, 840a0bb90f4784d00ef2827ef300602744c37a02bdCraig Stout status_t *status) 85e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 86e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 87e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu sp<IAudioTrack> track; 88e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 89e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(pid); 90b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout data.writeInt32(streamType); 91e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(sampleRate); 92e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(format); 93d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInt32(channelCount); 94e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(frameCount); 95d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInt32(flags); 96d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeStrongBinder(sharedBuffer->asBinder()); 97e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(output); 98e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 99e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu if (lStatus != NO_ERROR) { 100e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu LOGE("createTrack error: %s", strerror(-lStatus)); 101e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } else { 102c0b9d00a24576e7549e9ebc43ad591df3644f774Dake Gu lStatus = reply.readInt32(); 103e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 104e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 105e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu if (status) { 106e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu *status = lStatus; 107e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 108d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu return track; 109e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 110d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu 111d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu virtual sp<IAudioRecord> openRecord( 112e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu pid_t pid, 113e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int input, 114e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu uint32_t sampleRate, 115e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int format, 116e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int channelCount, 117e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu int frameCount, 118e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu uint32_t flags, 119e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu status_t *status) 120e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 121e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 122e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu sp<IAudioRecord> record; 123d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 124e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(pid); 125d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInt32(input); 126d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInt32(sampleRate); 127e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(format); 128e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(channelCount); 129e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(frameCount); 130e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(flags); 131e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 132e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu if (lStatus != NO_ERROR) { 133e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu LOGE("openRecord error: %s", strerror(-lStatus)); 134e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } else { 135e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu lStatus = reply.readInt32(); 136d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 137e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 138d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu if (status) { 139d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu *status = lStatus; 140e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 141e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return record; 142e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 143e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 144e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual uint32_t sampleRate(int output) const 145e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 146d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu Parcel data, reply; 147e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 148d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInt32(output); 149d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu remote()->transact(SAMPLE_RATE, data, &reply); 150e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 151e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 152e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 153e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual int channelCount(int output) const 154e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 155e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 156e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 157e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(output); 158e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(CHANNEL_COUNT, data, &reply); 159d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu return reply.readInt32(); 160e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 161d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu 162d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu virtual int format(int output) const 163e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 164e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 165e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 166e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(output); 167e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(FORMAT, data, &reply); 168e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 169e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 170e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 171e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual size_t frameCount(int output) const 172e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 173d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu Parcel data, reply; 174e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 175d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInt32(output); 176d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu remote()->transact(FRAME_COUNT, data, &reply); 177e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 178e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 179e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 180e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual uint32_t latency(int output) const 181e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 182e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 183e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 184e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(output); 185e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(LATENCY, data, &reply); 186e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 187e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 188e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 189e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual status_t setMasterVolume(float value) 190d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu { 191e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 192d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 193d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeFloat(value); 194e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(SET_MASTER_VOLUME, data, &reply); 195e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 196e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 197e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 198e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual status_t setMasterMute(bool muted) 199e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 200e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 201e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 202e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(muted); 203e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(SET_MASTER_MUTE, data, &reply); 204e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 205e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 206e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 207d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu virtual float masterVolume() const 208e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 209d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu Parcel data, reply; 210d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 211e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(MASTER_VOLUME, data, &reply); 212e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readFloat(); 213e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 214e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 2150a0bb90f4784d00ef2827ef300602744c37a02bdCraig Stout virtual bool masterMute() const 216e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 217e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 218e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 219e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(MASTER_MUTE, data, &reply); 220d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu return reply.readInt32(); 221e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 222d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu 223d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu virtual status_t setStreamVolume(int stream, float value, int output) 224e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 225e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 226e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 227e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(stream); 228e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeFloat(value); 2290a0bb90f4784d00ef2827ef300602744c37a02bdCraig Stout data.writeInt32(output); 230e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(SET_STREAM_VOLUME, data, &reply); 231e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 232e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 233e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 234d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu virtual status_t setStreamMute(int stream, bool muted) 235e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 236d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu Parcel data, reply; 237d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 238e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(stream); 239e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(muted); 240e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(SET_STREAM_MUTE, data, &reply); 241e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 242d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu } 243e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 244d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu virtual float streamVolume(int stream, int output) const 245d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu { 246e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu Parcel data, reply; 247e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 248e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(stream); 249e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(output); 250e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(STREAM_VOLUME, data, &reply); 251e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readFloat(); 252e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 253d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu 254e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual bool streamMute(int stream) const 255d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu { 256d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu Parcel data, reply; 257e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 258e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(stream); 259e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(STREAM_MUTE, data, &reply); 260e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 261e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 262e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 263b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu virtual status_t setMode(int mode) 264d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu { 265b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu Parcel data, reply; 266d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 267d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInt32(mode); 268b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu remote()->transact(SET_MODE, data, &reply); 269b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu return reply.readInt32(); 270b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu } 271b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu 272b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu virtual status_t setMicMute(bool state) 273b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu { 274b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu Parcel data, reply; 275b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 276b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu data.writeInt32(state); 277b38f24f4145d1a5be6843613aa89295d99826ad4Dake Gu remote()->transact(SET_MIC_MUTE, data, &reply); 278b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout return reply.readInt32(); 279d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu } 280b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout 281d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu virtual bool getMicMute() const 282d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu { 283b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout Parcel data, reply; 284b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 285b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout remote()->transact(GET_MIC_MUTE, data, &reply); 286b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout return reply.readInt32(); 287b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout } 288b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout 289b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout virtual bool isMusicActive() const 290b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout { 291b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout Parcel data, reply; 292b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 293b1978e643e378c8fac668984ad07bf87a6b8f337Craig Stout remote()->transact(IS_MUSIC_ACTIVE, data, &reply); 294e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 295e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 296e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu 297e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual status_t setParameters(int ioHandle, const String8& keyValuePairs) 298e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu { 299c0b9d00a24576e7549e9ebc43ad591df3644f774Dake Gu Parcel data, reply; 300e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 301e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(ioHandle); 302e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeString8(keyValuePairs); 303e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(SET_PARAMETERS, data, &reply); 304e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu return reply.readInt32(); 305e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu } 306d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu 307e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu virtual String8 getParameters(int ioHandle, const String8& keys) 308d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu { 309d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu Parcel data, reply; 310d859d438fbcd008ca0eac3ebbdaaea571411c487Dake Gu data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 311e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeInt32(ioHandle); 312e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu data.writeString8(keys); 313e54b66b0d6dc081bff26b65853d858e5acf2aa31Dake Gu remote()->transact(GET_PARAMETERS, data, &reply); 314 return reply.readString8(); 315 } 316 317 virtual void registerClient(const sp<IAudioFlingerClient>& client) 318 { 319 Parcel data, reply; 320 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 321 data.writeStrongBinder(client->asBinder()); 322 remote()->transact(REGISTER_CLIENT, data, &reply); 323 } 324 325 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 326 { 327 Parcel data, reply; 328 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 329 data.writeInt32(sampleRate); 330 data.writeInt32(format); 331 data.writeInt32(channelCount); 332 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 333 return reply.readInt32(); 334 } 335 336 virtual int openOutput(uint32_t *pDevices, 337 uint32_t *pSamplingRate, 338 uint32_t *pFormat, 339 uint32_t *pChannels, 340 uint32_t *pLatencyMs, 341 uint32_t flags) 342 { 343 Parcel data, reply; 344 uint32_t devices = pDevices ? *pDevices : 0; 345 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 346 uint32_t format = pFormat ? *pFormat : 0; 347 uint32_t channels = pChannels ? *pChannels : 0; 348 uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 349 350 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 351 data.writeInt32(devices); 352 data.writeInt32(samplingRate); 353 data.writeInt32(format); 354 data.writeInt32(channels); 355 data.writeInt32(latency); 356 data.writeInt32(flags); 357 remote()->transact(OPEN_OUTPUT, data, &reply); 358 int output = reply.readInt32(); 359 LOGV("openOutput() returned output, %p", output); 360 devices = reply.readInt32(); 361 if (pDevices) *pDevices = devices; 362 samplingRate = reply.readInt32(); 363 if (pSamplingRate) *pSamplingRate = samplingRate; 364 format = reply.readInt32(); 365 if (pFormat) *pFormat = format; 366 channels = reply.readInt32(); 367 if (pChannels) *pChannels = channels; 368 latency = reply.readInt32(); 369 if (pLatencyMs) *pLatencyMs = latency; 370 return output; 371 } 372 373 virtual int openDuplicateOutput(int output1, int output2) 374 { 375 Parcel data, reply; 376 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 377 data.writeInt32(output1); 378 data.writeInt32(output2); 379 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 380 return reply.readInt32(); 381 } 382 383 virtual status_t closeOutput(int output) 384 { 385 Parcel data, reply; 386 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 387 data.writeInt32(output); 388 remote()->transact(CLOSE_OUTPUT, data, &reply); 389 return reply.readInt32(); 390 } 391 392 virtual status_t suspendOutput(int output) 393 { 394 Parcel data, reply; 395 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 396 data.writeInt32(output); 397 remote()->transact(SUSPEND_OUTPUT, data, &reply); 398 return reply.readInt32(); 399 } 400 401 virtual status_t restoreOutput(int output) 402 { 403 Parcel data, reply; 404 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 405 data.writeInt32(output); 406 remote()->transact(RESTORE_OUTPUT, data, &reply); 407 return reply.readInt32(); 408 } 409 410 virtual int openInput(uint32_t *pDevices, 411 uint32_t *pSamplingRate, 412 uint32_t *pFormat, 413 uint32_t *pChannels, 414 uint32_t acoustics) 415 { 416 Parcel data, reply; 417 uint32_t devices = pDevices ? *pDevices : 0; 418 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 419 uint32_t format = pFormat ? *pFormat : 0; 420 uint32_t channels = pChannels ? *pChannels : 0; 421 422 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 423 data.writeInt32(devices); 424 data.writeInt32(samplingRate); 425 data.writeInt32(format); 426 data.writeInt32(channels); 427 data.writeInt32(acoustics); 428 remote()->transact(OPEN_INPUT, data, &reply); 429 int input = reply.readInt32(); 430 devices = reply.readInt32(); 431 if (pDevices) *pDevices = devices; 432 samplingRate = reply.readInt32(); 433 if (pSamplingRate) *pSamplingRate = samplingRate; 434 format = reply.readInt32(); 435 if (pFormat) *pFormat = format; 436 channels = reply.readInt32(); 437 if (pChannels) *pChannels = channels; 438 return input; 439 } 440 441 virtual status_t closeInput(int input) 442 { 443 Parcel data, reply; 444 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 445 data.writeInt32(input); 446 remote()->transact(CLOSE_INPUT, data, &reply); 447 return reply.readInt32(); 448 } 449 450 virtual status_t setStreamOutput(uint32_t stream, int output) 451 { 452 Parcel data, reply; 453 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 454 data.writeInt32(stream); 455 data.writeInt32(output); 456 remote()->transact(SET_STREAM_OUTPUT, data, &reply); 457 return reply.readInt32(); 458 } 459 460 virtual status_t setVoiceVolume(float volume) 461 { 462 Parcel data, reply; 463 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 464 data.writeFloat(volume); 465 remote()->transact(SET_VOICE_VOLUME, data, &reply); 466 return reply.readInt32(); 467 } 468}; 469 470IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 471 472// ---------------------------------------------------------------------- 473 474status_t BnAudioFlinger::onTransact( 475 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 476{ 477 switch(code) { 478 case CREATE_TRACK: { 479 CHECK_INTERFACE(IAudioFlinger, data, reply); 480 pid_t pid = data.readInt32(); 481 int streamType = data.readInt32(); 482 uint32_t sampleRate = data.readInt32(); 483 int format = data.readInt32(); 484 int channelCount = data.readInt32(); 485 size_t bufferCount = data.readInt32(); 486 uint32_t flags = data.readInt32(); 487 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 488 int output = data.readInt32(); 489 status_t status; 490 sp<IAudioTrack> track = createTrack(pid, 491 streamType, sampleRate, format, 492 channelCount, bufferCount, flags, buffer, output, &status); 493 reply->writeInt32(status); 494 reply->writeStrongBinder(track->asBinder()); 495 return NO_ERROR; 496 } break; 497 case OPEN_RECORD: { 498 CHECK_INTERFACE(IAudioFlinger, data, reply); 499 pid_t pid = data.readInt32(); 500 int input = data.readInt32(); 501 uint32_t sampleRate = data.readInt32(); 502 int format = data.readInt32(); 503 int channelCount = data.readInt32(); 504 size_t bufferCount = data.readInt32(); 505 uint32_t flags = data.readInt32(); 506 status_t status; 507 sp<IAudioRecord> record = openRecord(pid, input, 508 sampleRate, format, channelCount, bufferCount, flags, &status); 509 reply->writeInt32(status); 510 reply->writeStrongBinder(record->asBinder()); 511 return NO_ERROR; 512 } break; 513 case SAMPLE_RATE: { 514 CHECK_INTERFACE(IAudioFlinger, data, reply); 515 reply->writeInt32( sampleRate(data.readInt32()) ); 516 return NO_ERROR; 517 } break; 518 case CHANNEL_COUNT: { 519 CHECK_INTERFACE(IAudioFlinger, data, reply); 520 reply->writeInt32( channelCount(data.readInt32()) ); 521 return NO_ERROR; 522 } break; 523 case FORMAT: { 524 CHECK_INTERFACE(IAudioFlinger, data, reply); 525 reply->writeInt32( format(data.readInt32()) ); 526 return NO_ERROR; 527 } break; 528 case FRAME_COUNT: { 529 CHECK_INTERFACE(IAudioFlinger, data, reply); 530 reply->writeInt32( frameCount(data.readInt32()) ); 531 return NO_ERROR; 532 } break; 533 case LATENCY: { 534 CHECK_INTERFACE(IAudioFlinger, data, reply); 535 reply->writeInt32( latency(data.readInt32()) ); 536 return NO_ERROR; 537 } break; 538 case SET_MASTER_VOLUME: { 539 CHECK_INTERFACE(IAudioFlinger, data, reply); 540 reply->writeInt32( setMasterVolume(data.readFloat()) ); 541 return NO_ERROR; 542 } break; 543 case SET_MASTER_MUTE: { 544 CHECK_INTERFACE(IAudioFlinger, data, reply); 545 reply->writeInt32( setMasterMute(data.readInt32()) ); 546 return NO_ERROR; 547 } break; 548 case MASTER_VOLUME: { 549 CHECK_INTERFACE(IAudioFlinger, data, reply); 550 reply->writeFloat( masterVolume() ); 551 return NO_ERROR; 552 } break; 553 case MASTER_MUTE: { 554 CHECK_INTERFACE(IAudioFlinger, data, reply); 555 reply->writeInt32( masterMute() ); 556 return NO_ERROR; 557 } break; 558 case SET_STREAM_VOLUME: { 559 CHECK_INTERFACE(IAudioFlinger, data, reply); 560 int stream = data.readInt32(); 561 float volume = data.readFloat(); 562 int output = data.readInt32(); 563 reply->writeInt32( setStreamVolume(stream, volume, output) ); 564 return NO_ERROR; 565 } break; 566 case SET_STREAM_MUTE: { 567 CHECK_INTERFACE(IAudioFlinger, data, reply); 568 int stream = data.readInt32(); 569 reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 570 return NO_ERROR; 571 } break; 572 case STREAM_VOLUME: { 573 CHECK_INTERFACE(IAudioFlinger, data, reply); 574 int stream = data.readInt32(); 575 int output = data.readInt32(); 576 reply->writeFloat( streamVolume(stream, output) ); 577 return NO_ERROR; 578 } break; 579 case STREAM_MUTE: { 580 CHECK_INTERFACE(IAudioFlinger, data, reply); 581 int stream = data.readInt32(); 582 reply->writeInt32( streamMute(stream) ); 583 return NO_ERROR; 584 } break; 585 case SET_MODE: { 586 CHECK_INTERFACE(IAudioFlinger, data, reply); 587 int mode = data.readInt32(); 588 reply->writeInt32( setMode(mode) ); 589 return NO_ERROR; 590 } break; 591 case SET_MIC_MUTE: { 592 CHECK_INTERFACE(IAudioFlinger, data, reply); 593 int state = data.readInt32(); 594 reply->writeInt32( setMicMute(state) ); 595 return NO_ERROR; 596 } break; 597 case GET_MIC_MUTE: { 598 CHECK_INTERFACE(IAudioFlinger, data, reply); 599 reply->writeInt32( getMicMute() ); 600 return NO_ERROR; 601 } break; 602 case IS_MUSIC_ACTIVE: { 603 CHECK_INTERFACE(IAudioFlinger, data, reply); 604 reply->writeInt32( isMusicActive() ); 605 return NO_ERROR; 606 } break; 607 case SET_PARAMETERS: { 608 CHECK_INTERFACE(IAudioFlinger, data, reply); 609 int ioHandle = data.readInt32(); 610 String8 keyValuePairs(data.readString8()); 611 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 612 return NO_ERROR; 613 } break; 614 case GET_PARAMETERS: { 615 CHECK_INTERFACE(IAudioFlinger, data, reply); 616 int ioHandle = data.readInt32(); 617 String8 keys(data.readString8()); 618 reply->writeString8(getParameters(ioHandle, keys)); 619 return NO_ERROR; 620 } break; 621 622 case REGISTER_CLIENT: { 623 CHECK_INTERFACE(IAudioFlinger, data, reply); 624 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 625 registerClient(client); 626 return NO_ERROR; 627 } break; 628 case GET_INPUTBUFFERSIZE: { 629 CHECK_INTERFACE(IAudioFlinger, data, reply); 630 uint32_t sampleRate = data.readInt32(); 631 int format = data.readInt32(); 632 int channelCount = data.readInt32(); 633 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 634 return NO_ERROR; 635 } break; 636 case OPEN_OUTPUT: { 637 CHECK_INTERFACE(IAudioFlinger, data, reply); 638 uint32_t devices = data.readInt32(); 639 uint32_t samplingRate = data.readInt32(); 640 uint32_t format = data.readInt32(); 641 uint32_t channels = data.readInt32(); 642 uint32_t latency = data.readInt32(); 643 uint32_t flags = data.readInt32(); 644 int output = openOutput(&devices, 645 &samplingRate, 646 &format, 647 &channels, 648 &latency, 649 flags); 650 LOGV("OPEN_OUTPUT output, %p", output); 651 reply->writeInt32(output); 652 reply->writeInt32(devices); 653 reply->writeInt32(samplingRate); 654 reply->writeInt32(format); 655 reply->writeInt32(channels); 656 reply->writeInt32(latency); 657 return NO_ERROR; 658 } break; 659 case OPEN_DUPLICATE_OUTPUT: { 660 CHECK_INTERFACE(IAudioFlinger, data, reply); 661 int output1 = data.readInt32(); 662 int output2 = data.readInt32(); 663 reply->writeInt32(openDuplicateOutput(output1, output2)); 664 return NO_ERROR; 665 } break; 666 case CLOSE_OUTPUT: { 667 CHECK_INTERFACE(IAudioFlinger, data, reply); 668 reply->writeInt32(closeOutput(data.readInt32())); 669 return NO_ERROR; 670 } break; 671 case SUSPEND_OUTPUT: { 672 CHECK_INTERFACE(IAudioFlinger, data, reply); 673 reply->writeInt32(suspendOutput(data.readInt32())); 674 return NO_ERROR; 675 } break; 676 case RESTORE_OUTPUT: { 677 CHECK_INTERFACE(IAudioFlinger, data, reply); 678 reply->writeInt32(restoreOutput(data.readInt32())); 679 return NO_ERROR; 680 } break; 681 case OPEN_INPUT: { 682 CHECK_INTERFACE(IAudioFlinger, data, reply); 683 uint32_t devices = data.readInt32(); 684 uint32_t samplingRate = data.readInt32(); 685 uint32_t format = data.readInt32(); 686 uint32_t channels = data.readInt32(); 687 uint32_t acoutics = data.readInt32(); 688 689 int input = openInput(&devices, 690 &samplingRate, 691 &format, 692 &channels, 693 acoutics); 694 reply->writeInt32(input); 695 reply->writeInt32(devices); 696 reply->writeInt32(samplingRate); 697 reply->writeInt32(format); 698 reply->writeInt32(channels); 699 return NO_ERROR; 700 } break; 701 case CLOSE_INPUT: { 702 CHECK_INTERFACE(IAudioFlinger, data, reply); 703 reply->writeInt32(closeInput(data.readInt32())); 704 return NO_ERROR; 705 } break; 706 case SET_STREAM_OUTPUT: { 707 CHECK_INTERFACE(IAudioFlinger, data, reply); 708 uint32_t stream = data.readInt32(); 709 int output = data.readInt32(); 710 reply->writeInt32(setStreamOutput(stream, output)); 711 return NO_ERROR; 712 } break; 713 case SET_VOICE_VOLUME: { 714 CHECK_INTERFACE(IAudioFlinger, data, reply); 715 float volume = data.readFloat(); 716 reply->writeInt32( setVoiceVolume(volume) ); 717 return NO_ERROR; 718 } break; 719 default: 720 return BBinder::onTransact(code, data, reply, flags); 721 } 722} 723 724// ---------------------------------------------------------------------------- 725 726}; // namespace android 727