IAudioFlinger.cpp revision 05bca2fde53bfe3063d2a0a877f2b6bfdd6052cf
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* //device/extlibs/pv/android/IAudioflinger.cpp
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger"
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OPEN_RECORD,
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SAMPLE_RATE,
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CHANNEL_COUNT,
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
50b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent    IS_STREAM_ACTIVE,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
62f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    SET_STREAM_OUTPUT,
63342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
6505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_INPUT_FRAMES_LOST
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int streamType,
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int format,
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int channelCount,
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t flags,
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
85fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                int output,
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
895841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(streamType);
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(channelCount);
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(sharedBuffer->asBinder());
99fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("createTrack error: %s", strerror(-lStatus));
1035841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
1045841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1055841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1105841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
115fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                int input,
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int format,
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int channelCount,
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t flags,
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1245841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
127fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(channelCount);
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
1335841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1345841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
1355841db78dff14898538200287d246577b1fc37e2Eric Laurent            LOGE("openRecord error: %s", strerror(-lStatus));
1365841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
1375841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1385841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
1395841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1435841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
146fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual uint32_t sampleRate(int output) const
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
150fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
155fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int channelCount(int output) const
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
159fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CHANNEL_COUNT, data, &reply);
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
164fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int format(int output) const
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
168fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
173fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual size_t frameCount(int output) const
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
177fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
182fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual uint32_t latency(int output) const
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
186fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
225fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t setStreamVolume(int stream, float value, int output)
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
231fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setStreamMute(int stream, bool muted)
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
246fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual float streamVolume(int stream, int output) const
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
251fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool streamMute(int stream) const
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
265c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMode(int mode)
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
270c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
274c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
278c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
291b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent    virtual bool isStreamActive(int stream) const
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
295b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent        data.writeInt32(stream);
296b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
300fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
304fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(ioHandle);
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
310fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual String8 getParameters(int ioHandle, const String8& keys)
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
314fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(ioHandle);
315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(client->asBinder());
325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channelCount);
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
339fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int openOutput(uint32_t *pDevices,
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pSamplingRate,
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pFormat,
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pChannels,
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pLatencyMs,
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t flags)
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channels);
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(latency);
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(flags);
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
361fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        int  output = reply.readInt32();
362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        LOGV("openOutput() returned output, %p", output);
363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        devices = reply.readInt32();
364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        format = reply.readInt32();
368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        channels = reply.readInt32();
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pChannels) *pChannels = channels;
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        latency = reply.readInt32();
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pLatencyMs) *pLatencyMs = latency;
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return output;
374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
376fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int openDuplicateOutput(int output1, int output2)
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
380fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output1);
381fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output2);
382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
383fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return reply.readInt32();
384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
386fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeOutput(int output)
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
390fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
395fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t suspendOutput(int output)
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
399fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
404fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t restoreOutput(int output)
40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
408fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
413fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int openInput(uint32_t *pDevices,
414fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t *pSamplingRate,
415fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t *pFormat,
416fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t *pChannels,
417fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t acoustics)
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
429c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channels);
430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(acoustics);
431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
432fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        int input = reply.readInt32();
433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        devices = reply.readInt32();
434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        format = reply.readInt32();
438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        channels = reply.readInt32();
440c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pChannels) *pChannels = channels;
441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return input;
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
443c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
444fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
448fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
453fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t setStreamOutput(uint32_t stream, int output)
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(stream);
458fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
462f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
463f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
464f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
465f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
466f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
467f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
468f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
469f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
470f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
471342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
472342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
473342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
474342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
475342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
476342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInt32(output);
477342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
478342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
479342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
480342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
481342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (halFrames) {
482342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
483342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
484342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
485342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (dspFrames) {
486342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
487342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
488342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
489342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
490342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
49105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
49205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    virtual unsigned int getInputFramesLost(int ioHandle)
49305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
49405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
49505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
49605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInt32(ioHandle);
49705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
49805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        return reply.readInt32();
49905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch(code) {
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t flags = data.readInt32();
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
520fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioTrack> track = createTrack(pid,
52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    streamType, sampleRate, format,
524c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                    channelCount, bufferCount, flags, buffer, output, &status);
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
532fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int input = data.readInt32();
53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t flags = data.readInt32();
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
539c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            sp<IAudioRecord> record = openRecord(pid, input,
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    sampleRate, format, channelCount, bufferCount, flags, &status);
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
547fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( sampleRate(data.readInt32()) );
54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CHANNEL_COUNT: {
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
552fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( channelCount(data.readInt32()) );
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
557fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( format(data.readInt32()) );
55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
562fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( frameCount(data.readInt32()) );
56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
567fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( latency(data.readInt32()) );
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         case SET_MASTER_VOLUME: {
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
593c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
594fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
595c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32( setStreamVolume(stream, volume, output) );
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setStreamMute(stream, data.readInt32()) );
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
607fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
608c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeFloat( streamVolume(stream, output) );
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( streamMute(stream) );
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
61789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
61889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int mode = data.readInt32();
62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
62189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
634b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent        case IS_STREAM_ACTIVE: {
63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
636b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent            int stream = data.readInt32();
637b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent            reply->writeInt32( isStreamActive(stream) );
63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
640c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
642fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int ioHandle = data.readInt32();
643c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
644c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
64589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
646c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent         } break;
647c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
648c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
649fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int ioHandle = data.readInt32();
650c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
651c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
652c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
653c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent         } break;
654c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
669c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
670c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
671c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t devices = data.readInt32();
672c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
673c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t format = data.readInt32();
674c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t channels = data.readInt32();
675c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t latency = data.readInt32();
676c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t flags = data.readInt32();
677fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = openOutput(&devices,
678c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &samplingRate,
679c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &format,
680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &channels,
681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &latency,
682c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     flags);
683c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            LOGV("OPEN_OUTPUT output, %p", output);
684fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(output);
685c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
686c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
687c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
688c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(channels);
689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(latency);
690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
691c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
692c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
693c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
694fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output1 = data.readInt32();
695fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output2 = data.readInt32();
696fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(openDuplicateOutput(output1, output2));
697c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
698c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
699c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
700c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
701fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(closeOutput(data.readInt32()));
702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
704c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
705c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
706fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(suspendOutput(data.readInt32()));
707c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
708c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
711fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(restoreOutput(data.readInt32()));
712c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
713c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
714c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
715c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
716c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t devices = data.readInt32();
717c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
718c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t format = data.readInt32();
719c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t channels = data.readInt32();
720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t acoutics = data.readInt32();
721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
722fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int input = openInput(&devices,
723c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &samplingRate,
724c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &format,
725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &channels,
726c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     acoutics);
727fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(input);
728c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
729c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
730c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
731c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(channels);
732c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
733c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
734c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
736fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(closeInput(data.readInt32()));
73789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
739c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_OUTPUT: {
74089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
741c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t stream = data.readInt32();
742fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
743c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setStreamOutput(stream, output));
74489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
74589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
746f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
747f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
748f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
749f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
750f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
751f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
752342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
753342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
754342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            int output = data.readInt32();
755342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t halFrames;
756342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t dspFrames;
757342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
758342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
759342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
760342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
761342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
762342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
763342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
764342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
76505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
76605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
76705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            int ioHandle = data.readInt32();
76805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            reply->writeInt32(getInputFramesLost(ioHandle));
76905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
77005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
77105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
77789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
780