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