19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/extlibs/pv/android/IAudioflinger.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "IAudioFlinger"
19a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent//#define LOG_NDEBUG 0
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
250795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OPEN_RECORD,
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SAMPLE_RATE,
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CHANNEL_COUNT,
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FORMAT,
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    FRAME_COUNT,
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LATENCY,
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_MASTER_VOLUME,
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_MASTER_MUTE,
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MASTER_VOLUME,
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MASTER_MUTE,
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_STREAM_VOLUME,
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_STREAM_MUTE,
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STREAM_VOLUME,
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STREAM_MUTE,
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_MODE,
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_MIC_MUTE,
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GET_MIC_MUTE,
5023f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent    IS_STREAM_ACTIVE,
51a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    SET_PARAMETERS,
52a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    GET_PARAMETERS,
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REGISTER_CLIENT,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GET_INPUTBUFFERSIZE,
55a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    OPEN_OUTPUT,
56a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    OPEN_DUPLICATE_OUTPUT,
57a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    CLOSE_OUTPUT,
58a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    SUSPEND_OUTPUT,
59a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    RESTORE_OUTPUT,
60a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    OPEN_INPUT,
61a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    CLOSE_INPUT,
62415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent    SET_STREAM_OUTPUT,
630986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent    SET_VOICE_VOLUME,
6447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent    GET_RENDER_POSITION,
6565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    GET_INPUT_FRAMES_LOST,
6665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    NEW_AUDIO_SESSION_ID,
6765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    LOAD_EFFECT_LIBRARY,
6865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    UNLOAD_EFFECT_LIBRARY,
6965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    QUERY_NUM_EFFECTS,
7053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent    QUERY_EFFECT,
7165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    GET_EFFECT_DESCRIPTOR,
728ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent    CREATE_EFFECT,
738ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent    MOVE_EFFECTS
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int streamType,
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
93ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int output,
9465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                int *sessionId,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status)
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
988a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        sp<IAudioTrack> track;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(pid);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(streamType);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(sampleRate);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(channelCount);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(frameCount);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(flags);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStrongBinder(sharedBuffer->asBinder());
108ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
10965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int lSessionId = 0;
11065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (sessionId != NULL) {
11165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            lSessionId = *sessionId;
11265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
11365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInt32(lSessionId);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lStatus != NO_ERROR) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("createTrack error: %s", strerror(-lStatus));
1178a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        } else {
11865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            lSessionId = reply.readInt32();
11965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (sessionId != NULL) {
12065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                *sessionId = lSessionId;
12165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
1228a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            lStatus = reply.readInt32();
1238a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (status) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *status = lStatus;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1288a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        return track;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
133ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int input,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
13965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                int *sessionId,
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status)
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1438a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        sp<IAudioRecord> record;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(pid);
146ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(input);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(sampleRate);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(channelCount);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(frameCount);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(flags);
15265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int lSessionId = 0;
15365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (sessionId != NULL) {
15465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            lSessionId = *sessionId;
15565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
15665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInt32(lSessionId);
1578a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1588a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        if (lStatus != NO_ERROR) {
1598a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            LOGE("openRecord error: %s", strerror(-lStatus));
1608a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        } else {
16165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            lSessionId = reply.readInt32();
16265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (sessionId != NULL) {
16365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                *sessionId = lSessionId;
16465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
1658a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            lStatus = reply.readInt32();
1668a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
1678a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (status) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *status = lStatus;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1718a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        return record;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
174ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual uint32_t sampleRate(int output) const
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
178ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
183ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int channelCount(int output) const
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
187ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(CHANNEL_COUNT, data, &reply);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
192ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int format(int output) const
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
196ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
201ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual size_t frameCount(int output) const
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
205ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
210ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual uint32_t latency(int output) const
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
214ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setMasterVolume(float value)
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFloat(value);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setMasterMute(bool muted)
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(muted);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual float masterVolume() const
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readFloat();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool masterMute() const
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
253ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setStreamVolume(int stream, float value, int output)
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFloat(value);
259ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setStreamMute(int stream, bool muted)
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(muted);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
274ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual float streamVolume(int stream, int output) const
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
279ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readFloat();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool streamMute(int stream) const
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual status_t setMode(int mode)
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(mode);
298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_MODE, data, &reply);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
302a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual status_t setMicMute(bool state)
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
306a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(state);
307a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual bool getMicMute() const
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31923f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent    virtual bool isStreamActive(int stream) const
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32323f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent        data.writeInt32(stream);
32423f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent        remote()->transact(IS_STREAM_ACTIVE, data, &reply);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
328ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
332ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(ioHandle);
333a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeString8(keyValuePairs);
334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
338ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual String8 getParameters(int ioHandle, const String8& keys)
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
342ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(ioHandle);
343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeString8(keys);
344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readString8();
346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
352a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeStrongBinder(client->asBinder());
353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
356a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
357a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
358a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
359a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(sampleRate);
361a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(format);
362a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(channelCount);
363a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
367ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openOutput(uint32_t *pDevices,
368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pSamplingRate,
369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pFormat,
370a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pChannels,
371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pLatencyMs,
372a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t flags)
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
375a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
376a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
377a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
378a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
379a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
380a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
382a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(devices);
383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(samplingRate);
384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(format);
385a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(channels);
386a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(latency);
387a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(flags);
388a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
389ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        int  output = reply.readInt32();
390a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        LOGV("openOutput() returned output, %p", output);
391a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        devices = reply.readInt32();
392a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pDevices) *pDevices = devices;
393a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        samplingRate = reply.readInt32();
394a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
395a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        format = reply.readInt32();
396a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pFormat) *pFormat = format;
397a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        channels = reply.readInt32();
398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pChannels) *pChannels = channels;
399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        latency = reply.readInt32();
400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pLatencyMs) *pLatencyMs = latency;
401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return output;
402a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
403a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
404ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openDuplicateOutput(int output1, int output2)
405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
408ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output1);
409ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output2);
410a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
411ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        return reply.readInt32();
412a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
413a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
414ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeOutput(int output)
415a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
416a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
418ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
423ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t suspendOutput(int output)
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
427ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
428a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
432ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t restoreOutput(int output)
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
436ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
438a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readInt32();
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
440a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
441ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openInput(uint32_t *pDevices,
442ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t *pSamplingRate,
443ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t *pFormat,
444ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t *pChannels,
445ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t acoustics)
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
448a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
449a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
450a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
451a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
452a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
454a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(devices);
455a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(samplingRate);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(channels);
458a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(acoustics);
459a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
460ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        int input = reply.readInt32();
461a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        devices = reply.readInt32();
462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pDevices) *pDevices = devices;
463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        samplingRate = reply.readInt32();
464a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
465a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        format = reply.readInt32();
466a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pFormat) *pFormat = format;
467a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        channels = reply.readInt32();
468a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pChannels) *pChannels = channels;
469a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return input;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
471a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
472ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeInput(int input)
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
476ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(input);
477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
478a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readInt32();
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
481ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setStreamOutput(uint32_t stream, int output)
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
485a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(stream);
486ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
488a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readInt32();
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
490415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent
491415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent    virtual status_t setVoiceVolume(float volume)
492415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent    {
493415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent        Parcel data, reply;
494415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
495415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent        data.writeFloat(volume);
496415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
497415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent        return reply.readInt32();
498415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent    }
4990986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent
5000986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
5010986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent    {
5020986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        Parcel data, reply;
5030986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5040986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        data.writeInt32(output);
5050986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
5060986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        status_t status = reply.readInt32();
5070986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        if (status == NO_ERROR) {
5080986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            uint32_t tmp = reply.readInt32();
5090986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            if (halFrames) {
5100986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent                *halFrames = tmp;
5110986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            }
5120986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            tmp = reply.readInt32();
5130986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            if (dspFrames) {
5140986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent                *dspFrames = tmp;
5150986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            }
5160986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        }
5170986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        return status;
5180986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent    }
51947d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent
52047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent    virtual unsigned int getInputFramesLost(int ioHandle)
52147d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent    {
52247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        Parcel data, reply;
52347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
52447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        data.writeInt32(ioHandle);
52547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
52647d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        return reply.readInt32();
52747d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent    }
52865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
52965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual int newAudioSessionId()
53065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    {
53165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Parcel data, reply;
53265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
53365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
53465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int id = 0;
53565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status == NO_ERROR) {
53665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            id = reply.readInt32();
53765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
53865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        return id;
53965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    }
54065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
54165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t loadEffectLibrary(const char *libPath, int *handle)
54265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    {
54365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (libPath == NULL || handle == NULL) {
54465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return BAD_VALUE;
54565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
54665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        *handle = 0;
54765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Parcel data, reply;
54865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
54965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeCString(libPath);
55065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply);
55165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status == NO_ERROR) {
55265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            status = reply.readInt32();
55365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (status == NO_ERROR) {
55465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                *handle = reply.readInt32();
55565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
55665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
55765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        return status;
55865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    }
55965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
56065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t unloadEffectLibrary(int handle)
56165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    {
56265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Parcel data, reply;
56365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
56465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInt32(handle);
56565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply);
56665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status == NO_ERROR) {
56765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            status = reply.readInt32();
56865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
56965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        return status;
57065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    }
57165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
57265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t queryNumberEffects(uint32_t *numEffects)
57365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    {
57465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Parcel data, reply;
57565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
57665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
57765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status != NO_ERROR) {
57865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return status;
57965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
58065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status = reply.readInt32();
58165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status != NO_ERROR) {
58265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return status;
58365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
58465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (numEffects) {
58565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            *numEffects = (uint32_t)reply.readInt32();
58665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
58765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        return NO_ERROR;
58865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    }
58965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
59053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor)
59165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    {
59265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (pDescriptor == NULL) {
59365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return BAD_VALUE;
59465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
59565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Parcel data, reply;
59665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
59753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        data.writeInt32(index);
59853334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
59965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status != NO_ERROR) {
60065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return status;
60165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
60265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status = reply.readInt32();
60365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status != NO_ERROR) {
60465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return status;
60565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
60665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
60765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        return NO_ERROR;
60865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    }
60965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
61065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor)
61165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    {
61265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
61365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return BAD_VALUE;
61465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
61565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Parcel data, reply;
61665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
61765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
61865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
61965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status != NO_ERROR) {
62065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return status;
62165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
62265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status = reply.readInt32();
62365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status != NO_ERROR) {
62465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return status;
62565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
62665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
62765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        return NO_ERROR;
62865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    }
62965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
63065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual sp<IEffect> createEffect(pid_t pid,
63165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    effect_descriptor_t *pDesc,
63265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    const sp<IEffectClient>& client,
63365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    int32_t priority,
63465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    int output,
63565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    int sessionId,
63665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    status_t *status,
63765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    int *id,
63865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    int *enabled)
63965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    {
64065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Parcel data, reply;
64165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<IEffect> effect;
64265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
64365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (pDesc == NULL) {
64465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent             return effect;
64565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent             if (status) {
64665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                 *status = BAD_VALUE;
64765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent             }
64865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent         }
64965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
65065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
65165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInt32(pid);
65265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
65365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeStrongBinder(client->asBinder());
65465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInt32(priority);
65565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInt32(output);
65665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        data.writeInt32(sessionId);
65765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
65865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
65965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (lStatus != NO_ERROR) {
66065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            LOGE("createEffect error: %s", strerror(-lStatus));
66165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        } else {
66265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            lStatus = reply.readInt32();
66365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int tmp = reply.readInt32();
66465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (id) {
66565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                *id = tmp;
66665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
66765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            tmp = reply.readInt32();
66865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (enabled) {
66965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                *enabled = tmp;
67065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
67165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
67265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
67365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
67465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        if (status) {
67565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            *status = lStatus;
67665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
67765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
67865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        return effect;
67965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    }
6808ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
6818ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent    virtual status_t moveEffects(int session, int srcOutput, int dstOutput)
6828ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent    {
6838ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        Parcel data, reply;
6848ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6858ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        data.writeInt32(session);
6868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        data.writeInt32(srcOutput);
6878ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        data.writeInt32(dstOutput);
6888ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
6898ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        return reply.readInt32();
6908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent    }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(code) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CREATE_TRACK: {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pid_t pid = data.readInt32();
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int streamType = data.readInt32();
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t sampleRate = data.readInt32();
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format = data.readInt32();
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount = data.readInt32();
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size_t bufferCount = data.readInt32();
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t flags = data.readInt32();
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
711ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
71265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int sessionId = data.readInt32();
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t status;
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IAudioTrack> track = createTrack(pid,
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    streamType, sampleRate, format,
71665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    channelCount, bufferCount, flags, buffer, output, &sessionId, &status);
71765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(sessionId);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(status);
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case OPEN_RECORD: {
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pid_t pid = data.readInt32();
725ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int input = data.readInt32();
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t sampleRate = data.readInt32();
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format = data.readInt32();
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount = data.readInt32();
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size_t bufferCount = data.readInt32();
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t flags = data.readInt32();
73165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int sessionId = data.readInt32();
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t status;
733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            sp<IAudioRecord> record = openRecord(pid, input,
73465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status);
73565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(sessionId);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(status);
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SAMPLE_RATE: {
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
742ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( sampleRate(data.readInt32()) );
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CHANNEL_COUNT: {
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
747ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( channelCount(data.readInt32()) );
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FORMAT: {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
752ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( format(data.readInt32()) );
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FRAME_COUNT: {
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
757ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( frameCount(data.readInt32()) );
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case LATENCY: {
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
762ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( latency(data.readInt32()) );
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         case SET_MASTER_VOLUME: {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_MASTER_MUTE: {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MASTER_VOLUME: {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeFloat( masterVolume() );
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MASTER_MUTE: {
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( masterMute() );
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_STREAM_VOLUME: {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            float volume = data.readFloat();
789ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
790a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32( setStreamVolume(stream, volume, output) );
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_STREAM_MUTE: {
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setStreamMute(stream, data.readInt32()) );
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case STREAM_VOLUME: {
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
802ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
803a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeFloat( streamVolume(stream, output) );
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case STREAM_MUTE: {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( streamMute(stream) );
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_MODE: {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mode = data.readInt32();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMode(mode) );
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_MIC_MUTE: {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int state = data.readInt32();
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMicMute(state) );
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GET_MIC_MUTE: {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( getMicMute() );
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
82923f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent        case IS_STREAM_ACTIVE: {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
83123f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent            int stream = data.readInt32();
83223f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent            reply->writeInt32( isStreamActive(stream) );
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
835a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case SET_PARAMETERS: {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
837ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int ioHandle = data.readInt32();
838a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            String8 keyValuePairs(data.readString8());
839a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
841a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent         } break;
842a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case GET_PARAMETERS: {
843a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
844ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int ioHandle = data.readInt32();
845a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            String8 keys(data.readString8());
846a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
847a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
848a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent         } break;
849a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case REGISTER_CLIENT: {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            registerClient(client);
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t sampleRate = data.readInt32();
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format = data.readInt32();
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount = data.readInt32();
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
864a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case OPEN_OUTPUT: {
865a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
866a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t devices = data.readInt32();
867a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t samplingRate = data.readInt32();
868a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t format = data.readInt32();
869a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t channels = data.readInt32();
870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t latency = data.readInt32();
871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t flags = data.readInt32();
872ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = openOutput(&devices,
873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &samplingRate,
874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &format,
875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &channels,
876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &latency,
877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     flags);
878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            LOGV("OPEN_OUTPUT output, %p", output);
879ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(output);
880a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(devices);
881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(samplingRate);
882a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(format);
883a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(channels);
884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(latency);
885a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
886a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
887a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
889ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output1 = data.readInt32();
890ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output2 = data.readInt32();
891ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(openDuplicateOutput(output1, output2));
892a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
893a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
894a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case CLOSE_OUTPUT: {
895a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
896ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(closeOutput(data.readInt32()));
897a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
898a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
899a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case SUSPEND_OUTPUT: {
900a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
901ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(suspendOutput(data.readInt32()));
902a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
903a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
904a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case RESTORE_OUTPUT: {
905a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
906ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(restoreOutput(data.readInt32()));
907a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
908a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
909a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case OPEN_INPUT: {
910a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
911a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t devices = data.readInt32();
912a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t samplingRate = data.readInt32();
913a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t format = data.readInt32();
914a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t channels = data.readInt32();
915a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t acoutics = data.readInt32();
916a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
917ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int input = openInput(&devices,
918a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &samplingRate,
919a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &format,
920a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &channels,
921a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     acoutics);
922ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(input);
923a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(devices);
924a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(samplingRate);
925a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(format);
926a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(channels);
927a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
928a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
929a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case CLOSE_INPUT: {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
931ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(closeInput(data.readInt32()));
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
934a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case SET_STREAM_OUTPUT: {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
936a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t stream = data.readInt32();
937ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
938a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(setStreamOutput(stream, output));
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
941415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent        case SET_VOICE_VOLUME: {
942415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
943415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent            float volume = data.readFloat();
944415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
945415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent            return NO_ERROR;
946415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent        } break;
9470986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        case GET_RENDER_POSITION: {
9480986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
9490986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            int output = data.readInt32();
9500986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            uint32_t halFrames;
9510986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            uint32_t dspFrames;
9520986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
9530986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            reply->writeInt32(status);
9540986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            if (status == NO_ERROR) {
9550986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent                reply->writeInt32(halFrames);
9560986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent                reply->writeInt32(dspFrames);
9570986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            }
9580986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent            return NO_ERROR;
9590986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        }
96047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        case GET_INPUT_FRAMES_LOST: {
96147d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
96247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent            int ioHandle = data.readInt32();
96347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent            reply->writeInt32(getInputFramesLost(ioHandle));
96447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent            return NO_ERROR;
96547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        } break;
96665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        case NEW_AUDIO_SESSION_ID: {
96765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
96865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(newAudioSessionId());
96965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return NO_ERROR;
97065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        } break;
97165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        case LOAD_EFFECT_LIBRARY: {
97265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
97365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int handle;
97465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            status_t status = loadEffectLibrary(data.readCString(), &handle);
97565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(status);
97665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (status == NO_ERROR) {
97765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                reply->writeInt32(handle);
97865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
97965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return NO_ERROR;
98065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
98165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        case UNLOAD_EFFECT_LIBRARY: {
98265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
98365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(unloadEffectLibrary(data.readInt32()));
98465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return NO_ERROR;
98565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
98665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        case QUERY_NUM_EFFECTS: {
98765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
98865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            uint32_t numEffects;
98965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            status_t status = queryNumberEffects(&numEffects);
99065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(status);
99165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (status == NO_ERROR) {
99265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                reply->writeInt32((int32_t)numEffects);
99365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
99465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return NO_ERROR;
99565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
99653334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        case QUERY_EFFECT: {
99765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
99865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            effect_descriptor_t desc;
99953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
100065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(status);
100165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (status == NO_ERROR) {
100265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
100365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
100465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return NO_ERROR;
100565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
100665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        case GET_EFFECT_DESCRIPTOR: {
100765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
100865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            effect_uuid_t uuid;
100965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
101065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            effect_descriptor_t desc;
101165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
101265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(status);
101365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            if (status == NO_ERROR) {
101465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
101565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            }
101665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return NO_ERROR;
101765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
101865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        case CREATE_EFFECT: {
101965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
102065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            pid_t pid = data.readInt32();
102165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            effect_descriptor_t desc;
102265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
102365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
102465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int32_t priority = data.readInt32();
102565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int output = data.readInt32();
102665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int sessionId = data.readInt32();
102765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            status_t status;
102865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int id;
102965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int enabled;
103047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent
103165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
103265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(status);
103365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(id);
103465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeInt32(enabled);
103565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->writeStrongBinder(effect->asBinder());
103665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
103765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return NO_ERROR;
103865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        } break;
10398ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        case MOVE_EFFECTS: {
10408ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
10418ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            int session = data.readInt32();
10428ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            int srcOutput = data.readInt32();
10438ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            int dstOutput = data.readInt32();
10448ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
10458ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            return NO_ERROR;
10468ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        } break;
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1055