IAudioFlinger.cpp revision ffe9c25ce85e1af55d58ec025adc6367d70db7e8
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,
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
66be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    NEW_AUDIO_SESSION_ID,
67be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    LOAD_EFFECT_LIBRARY,
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    UNLOAD_EFFECT_LIBRARY,
69be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
70ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
71be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
72be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    CREATE_EFFECT
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int streamType,
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int format,
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int channelCount,
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t flags,
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
92fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                int output,
93be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
975841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(streamType);
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(channelCount);
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(sharedBuffer->asBinder());
107fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
108be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int lSessionId = 0;
109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("createTrack error: %s", strerror(-lStatus));
1165841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1215841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1225841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1275841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
132fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                int input,
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int format,
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int channelCount,
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t flags,
138be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1425841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
145fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(channelCount);
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
151be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int lSessionId = 0;
152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
153be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
154be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
155be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
1565841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1575841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
1585841db78dff14898538200287d246577b1fc37e2Eric Laurent            LOGE("openRecord error: %s", strerror(-lStatus));
1595841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
160be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
161be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
162be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1645841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1655841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
1665841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1705841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
173fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual uint32_t sampleRate(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(SAMPLE_RATE, data, &reply);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
182fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int channelCount(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(CHANNEL_COUNT, data, &reply);
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
191fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int format(int output) const
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
195fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
200fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual size_t frameCount(int output) const
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
204fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
209fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual uint32_t latency(int output) const
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
213fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, 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 float masterVolume() const
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        remote()->transact(MASTER_VOLUME, data, &reply);
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
252fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t setStreamVolume(int stream, float value, int output)
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
258fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setStreamMute(int stream, bool muted)
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
273fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual float streamVolume(int stream, int output) const
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
278fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool streamMute(int stream) const
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMode(int mode)
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
318b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent    virtual bool isStreamActive(int stream) const
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
322b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent        data.writeInt32(stream);
323b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
327fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
331fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(ioHandle);
332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
337fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual String8 getParameters(int ioHandle, const String8& keys)
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
341fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(ioHandle);
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(client->asBinder());
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channelCount);
362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
366fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int openOutput(uint32_t *pDevices,
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pSamplingRate,
368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pFormat,
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pChannels,
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pLatencyMs,
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t flags)
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channels);
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(latency);
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(flags);
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
388fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        int  output = reply.readInt32();
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        LOGV("openOutput() returned output, %p", output);
390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        devices = reply.readInt32();
391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        format = reply.readInt32();
395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        channels = reply.readInt32();
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pChannels) *pChannels = channels;
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        latency = reply.readInt32();
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pLatencyMs) *pLatencyMs = latency;
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return output;
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
403fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int openDuplicateOutput(int output1, int output2)
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
407fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output1);
408fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output2);
409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
410fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return reply.readInt32();
411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
413fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeOutput(int output)
414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
415c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
417fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
418c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
422fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t suspendOutput(int output)
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
426fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
431fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t restoreOutput(int output)
43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
435fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
440fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual int openInput(uint32_t *pDevices,
441fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t *pSamplingRate,
442fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t *pFormat,
443fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t *pChannels,
444fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                            uint32_t acoustics)
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
448c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
453c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
456c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channels);
457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(acoustics);
458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
459fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        int input = reply.readInt32();
460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        devices = reply.readInt32();
461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
462c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
463c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        format = reply.readInt32();
465c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
466c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        channels = reply.readInt32();
467c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pChannels) *pChannels = channels;
468c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return input;
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
470c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
471fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
475fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
476c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
480fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t setStreamOutput(uint32_t stream, int output)
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
484c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(stream);
485fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(output);
486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
487c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
489f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
490f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
491f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
492f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
493f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
494f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
495f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
496f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
497f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
500342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInt32(output);
504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (halFrames) {
509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
510342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
512342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (dspFrames) {
513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
514342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
515342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
516342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
517342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
51805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
51905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    virtual unsigned int getInputFramesLost(int ioHandle)
52005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
52105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
52205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
52305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInt32(ioHandle);
52405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
52505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        return reply.readInt32();
52605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual int newAudioSessionId()
529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
531be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
533be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int id = 0;
534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
535be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
536be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
537be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
538be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
539be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
540be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t loadEffectLibrary(const char *libPath, int *handle)
541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
542be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (libPath == NULL || handle == NULL) {
543be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
544be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
545be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        *handle = 0;
546be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
547be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
548be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeCString(libPath);
549be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply);
550be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
551be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status = reply.readInt32();
552be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
553be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *handle = reply.readInt32();
554be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
555be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return status;
557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t unloadEffectLibrary(int handle)
560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
562be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(handle);
564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply);
565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status = reply.readInt32();
567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return status;
569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t queryNumberEffects(uint32_t *numEffects)
572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (numEffects) {
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
589ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor)
590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
596ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
597ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor)
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual sp<IEffect> createEffect(pid_t pid,
630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int output,
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int sessionId,
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent             return effect;
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent             if (status) {
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                 *status = BAD_VALUE;
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent             }
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent         }
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(pid);
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeStrongBinder(client->asBinder());
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(output);
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            LOGE("createEffect error: %s", strerror(-lStatus));
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (id) {
664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (enabled) {
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status) {
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
67989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
68089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
68289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
68689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch(code) {
68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
69089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
69189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
69289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
69689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t flags = data.readInt32();
69889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
699fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
70189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioTrack> track = createTrack(pid,
70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    streamType, sampleRate, format,
704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                    channelCount, bufferCount, flags, buffer, output, &sessionId, &status);
705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
70689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
70789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
70889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
70989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
71089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
71189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
71289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
713fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int input = data.readInt32();
71489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
71589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
71789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t flags = data.readInt32();
719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            sp<IAudioRecord> record = openRecord(pid, input,
722be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                    sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status);
723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
72589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
72689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
72789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
730fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( sampleRate(data.readInt32()) );
73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
73289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CHANNEL_COUNT: {
73489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
735fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( channelCount(data.readInt32()) );
73689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
73789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
73989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
740fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( format(data.readInt32()) );
74189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
74289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
74389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
74489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
745fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( frameCount(data.readInt32()) );
74689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
74789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
74989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
750fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32( latency(data.readInt32()) );
75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         case SET_MASTER_VOLUME: {
75489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
75689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
75789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
75889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
75989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
76089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
76189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
76389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
76489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
76589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
77189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
776c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
777fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
778c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32( setStreamVolume(stream, volume, output) );
77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
78289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setStreamMute(stream, data.readInt32()) );
78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
790fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
791c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeFloat( streamVolume(stream, output) );
79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
79489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( streamMute(stream) );
79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int mode = data.readInt32();
80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
81489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
81589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
817b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent        case IS_STREAM_ACTIVE: {
81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
819b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent            int stream = data.readInt32();
820b72a396826da8bd934b9531bbd40f86d7509e71cEric Laurent            reply->writeInt32( isStreamActive(stream) );
82189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
823c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
825fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int ioHandle = data.readInt32();
826c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
827c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent         } break;
830c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
832fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int ioHandle = data.readInt32();
833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
834c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
836c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent         } break;
837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
852c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t devices = data.readInt32();
855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t format = data.readInt32();
857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t channels = data.readInt32();
858c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t latency = data.readInt32();
859c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t flags = data.readInt32();
860fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = openOutput(&devices,
861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &samplingRate,
862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &format,
863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &channels,
864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &latency,
865c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     flags);
866c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            LOGV("OPEN_OUTPUT output, %p", output);
867fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(output);
868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
870c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
871c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(channels);
872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(latency);
873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
877fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output1 = data.readInt32();
878fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output2 = data.readInt32();
879fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(openDuplicateOutput(output1, output2));
880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
884fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(closeOutput(data.readInt32()));
885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
889fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(suspendOutput(data.readInt32()));
890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
894fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(restoreOutput(data.readInt32()));
895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
899c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t devices = data.readInt32();
900c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
901c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t format = data.readInt32();
902c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t channels = data.readInt32();
903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t acoutics = data.readInt32();
904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
905fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int input = openInput(&devices,
906c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &samplingRate,
907c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &format,
908c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &channels,
909c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     acoutics);
910fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(input);
911c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
914c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(channels);
915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
917c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
919fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            reply->writeInt32(closeInput(data.readInt32()));
92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_OUTPUT: {
92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
924c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t stream = data.readInt32();
925fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
926c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setStreamOutput(stream, output));
92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
929f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
930f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
931f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
932f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
933f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
934f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
935342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
936342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
937342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            int output = data.readInt32();
938342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t halFrames;
939342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t dspFrames;
940342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
941342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
942342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
943342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
944342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
945342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
946342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
947342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
94805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
94905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
95005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            int ioHandle = data.readInt32();
95105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            reply->writeInt32(getInputFramesLost(ioHandle));
95205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
95305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
956be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(newAudioSessionId());
957be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
958be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
959be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case LOAD_EFFECT_LIBRARY: {
960be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
961be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int handle;
962be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = loadEffectLibrary(data.readCString(), &handle);
963be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
964be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
965be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32(handle);
966be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
967be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
968be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
969be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case UNLOAD_EFFECT_LIBRARY: {
970be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(unloadEffectLibrary(data.readInt32()));
972be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
973be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
974be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
975be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
976be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            uint32_t numEffects;
977be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
978be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
979be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
980be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
981be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
982be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
983be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
984ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
985be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
986be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
987ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
988be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
989be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
990be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
991be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
992be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
993be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
994be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
995be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
996be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
997be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
998be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
999be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1000be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1001be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1002be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1003be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1004be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1005be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1006be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1007be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1008be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            pid_t pid = data.readInt32();
1009be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1010be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
1011be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1012be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
1013be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int output = data.readInt32();
1014be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
1015be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status;
1016be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int id;
1017be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int enabled;
101805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
1019be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
1020be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1021be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1022be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
1023be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeStrongBinder(effect->asBinder());
1024be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1025be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1026be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
1035