IAudioFlinger.cpp revision 8a77a995c961c7c9a3888f4212f7be87d08afae1
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,
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IS_MUSIC_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,
62a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    SET_STREAM_OUTPUT
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int streamType,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
82ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int output,
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status)
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
868a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        sp<IAudioTrack> track;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(pid);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(streamType);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(sampleRate);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(channelCount);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(frameCount);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(flags);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStrongBinder(sharedBuffer->asBinder());
96ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lStatus != NO_ERROR) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("createTrack error: %s", strerror(-lStatus));
1008a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        } else {
1018a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            lStatus = reply.readInt32();
1028a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (status) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *status = lStatus;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1078a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        return track;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
112ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int input,
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status)
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1218a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        sp<IAudioRecord> record;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(pid);
124ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(input);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(sampleRate);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(channelCount);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(frameCount);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(flags);
1308a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1318a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        if (lStatus != NO_ERROR) {
1328a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            LOGE("openRecord error: %s", strerror(-lStatus));
1338a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        } else {
1348a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            lStatus = reply.readInt32();
1358a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
1368a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (status) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *status = lStatus;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1408a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent        return record;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
143ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual uint32_t sampleRate(int output) const
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
147ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
152ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int channelCount(int output) const
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
156ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(CHANNEL_COUNT, data, &reply);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
161ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int format(int output) const
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
165ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
170ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual size_t frameCount(int output) const
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
174ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual uint32_t latency(int output) const
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
183ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setMasterVolume(float value)
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFloat(value);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setMasterMute(bool muted)
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(muted);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual float masterVolume() const
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readFloat();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool masterMute() const
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
222ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setStreamVolume(int stream, float value, int output)
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFloat(value);
228ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t setStreamMute(int stream, bool muted)
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(muted);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual float streamVolume(int stream, int output) const
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
248ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readFloat();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool streamMute(int stream) const
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        remote()->transact(STREAM_MUTE, data, &reply);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
262a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual status_t setMode(int mode)
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(mode);
267a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_MODE, data, &reply);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
271a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual status_t setMicMute(bool state)
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
275a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(state);
276a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
280a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual bool getMicMute() const
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
284a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual bool isMusicActive() const
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
292a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(IS_MUSIC_ACTIVE, data, &reply);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
296ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setParameters(int ioHandle, const String8& keyValuePairs)
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
300ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(ioHandle);
301a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeString8(keyValuePairs);
302a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
306ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual String8 getParameters(int ioHandle, const String8& keys)
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
310ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(ioHandle);
311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeString8(keys);
312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readString8();
314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
317a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeStrongBinder(client->asBinder());
321a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
324a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
326a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
328a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(sampleRate);
329a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(format);
330a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(channelCount);
331a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
335ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openOutput(uint32_t *pDevices,
336a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pSamplingRate,
337a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pFormat,
338a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pChannels,
339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pLatencyMs,
340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t flags)
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(devices);
351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(samplingRate);
352a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(format);
353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(channels);
354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(latency);
355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(flags);
356a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
357ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        int  output = reply.readInt32();
358a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        LOGV("openOutput() returned output, %p", output);
359a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        devices = reply.readInt32();
360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pDevices) *pDevices = devices;
361a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        samplingRate = reply.readInt32();
362a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
363a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        format = reply.readInt32();
364a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pFormat) *pFormat = format;
365a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        channels = reply.readInt32();
366a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pChannels) *pChannels = channels;
367a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        latency = reply.readInt32();
368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pLatencyMs) *pLatencyMs = latency;
369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return output;
370a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
372ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openDuplicateOutput(int output1, int output2)
373a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
374a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
375a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
376ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output1);
377ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output2);
378a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
379ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        return reply.readInt32();
380a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    }
381a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
382ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeOutput(int output)
383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        Parcel data, reply;
385a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
386ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
387a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
391ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t suspendOutput(int output)
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
395ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
396a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
400ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t restoreOutput(int output)
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
404ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readInt32();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
409ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openInput(uint32_t *pDevices,
410ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t *pSamplingRate,
411ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t *pFormat,
412ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t *pChannels,
413ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                            uint32_t acoustics)
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
416a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
418a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
420a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
422a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(devices);
423a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(samplingRate);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(channels);
426a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(acoustics);
427a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
428ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        int input = reply.readInt32();
429a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        devices = reply.readInt32();
430a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pDevices) *pDevices = devices;
431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        samplingRate = reply.readInt32();
432a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
433a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        format = reply.readInt32();
434a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pFormat) *pFormat = format;
435a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        channels = reply.readInt32();
436a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        if (pChannels) *pChannels = channels;
437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return input;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
439a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
440ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeInput(int input)
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
444ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(input);
445a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
446a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readInt32();
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setStreamOutput(uint32_t stream, int output)
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
453a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        data.writeInt32(stream);
454ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent        data.writeInt32(output);
455a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
456a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        return reply.readInt32();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(code) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CREATE_TRACK: {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pid_t pid = data.readInt32();
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int streamType = data.readInt32();
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t sampleRate = data.readInt32();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format = data.readInt32();
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount = data.readInt32();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size_t bufferCount = data.readInt32();
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t flags = data.readInt32();
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
478ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t status;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IAudioTrack> track = createTrack(pid,
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    streamType, sampleRate, format,
482a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    channelCount, bufferCount, flags, buffer, output, &status);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(status);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case OPEN_RECORD: {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pid_t pid = data.readInt32();
490ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int input = data.readInt32();
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t sampleRate = data.readInt32();
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format = data.readInt32();
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount = data.readInt32();
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size_t bufferCount = data.readInt32();
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t flags = data.readInt32();
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t status;
497a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            sp<IAudioRecord> record = openRecord(pid, input,
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sampleRate, format, channelCount, bufferCount, flags, &status);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(status);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SAMPLE_RATE: {
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
505ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( sampleRate(data.readInt32()) );
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CHANNEL_COUNT: {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
510ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( channelCount(data.readInt32()) );
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FORMAT: {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
515ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( format(data.readInt32()) );
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FRAME_COUNT: {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
520ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( frameCount(data.readInt32()) );
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case LATENCY: {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
525ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32( latency(data.readInt32()) );
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         case SET_MASTER_VOLUME: {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_MASTER_MUTE: {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MASTER_VOLUME: {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeFloat( masterVolume() );
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MASTER_MUTE: {
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( masterMute() );
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_STREAM_VOLUME: {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
551a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            float volume = data.readFloat();
552ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
553a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32( setStreamVolume(stream, volume, output) );
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_STREAM_MUTE: {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setStreamMute(stream, data.readInt32()) );
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case STREAM_VOLUME: {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
565ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
566a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeFloat( streamVolume(stream, output) );
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case STREAM_MUTE: {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int stream = data.readInt32();
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( streamMute(stream) );
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_MODE: {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mode = data.readInt32();
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMode(mode) );
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SET_MIC_MUTE: {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int state = data.readInt32();
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( setMicMute(state) );
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GET_MIC_MUTE: {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( getMicMute() );
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case IS_MUSIC_ACTIVE: {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( isMusicActive() );
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case SET_PARAMETERS: {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
599ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int ioHandle = data.readInt32();
600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            String8 keyValuePairs(data.readString8());
601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent         } break;
604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case GET_PARAMETERS: {
605a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
606ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int ioHandle = data.readInt32();
607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            String8 keys(data.readString8());
608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent         } break;
611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case REGISTER_CLIENT: {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            registerClient(client);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t sampleRate = data.readInt32();
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format = data.readInt32();
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount = data.readInt32();
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
626a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case OPEN_OUTPUT: {
627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
628a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t devices = data.readInt32();
629a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t samplingRate = data.readInt32();
630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t format = data.readInt32();
631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t channels = data.readInt32();
632a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t latency = data.readInt32();
633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t flags = data.readInt32();
634ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = openOutput(&devices,
635a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &samplingRate,
636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &format,
637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &channels,
638a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &latency,
639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     flags);
640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            LOGV("OPEN_OUTPUT output, %p", output);
641ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(output);
642a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(devices);
643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(samplingRate);
644a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(format);
645a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(channels);
646a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(latency);
647a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
648a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
651ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output1 = data.readInt32();
652ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output2 = data.readInt32();
653ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(openDuplicateOutput(output1, output2));
654a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case CLOSE_OUTPUT: {
657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
658ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(closeOutput(data.readInt32()));
659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
661a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case SUSPEND_OUTPUT: {
662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
663ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(suspendOutput(data.readInt32()));
664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
665a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
666a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case RESTORE_OUTPUT: {
667a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
668ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(restoreOutput(data.readInt32()));
669a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
670a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
671a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case OPEN_INPUT: {
672a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
673a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t devices = data.readInt32();
674a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t samplingRate = data.readInt32();
675a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t format = data.readInt32();
676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t channels = data.readInt32();
677a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t acoutics = data.readInt32();
678a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
679ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int input = openInput(&devices,
680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &samplingRate,
681a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &format,
682a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     &channels,
683a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                     acoutics);
684ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(input);
685a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(devices);
686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(samplingRate);
687a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(format);
688a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(channels);
689a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            return NO_ERROR;
690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        } break;
691a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case CLOSE_INPUT: {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
693ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            reply->writeInt32(closeInput(data.readInt32()));
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        case SET_STREAM_OUTPUT: {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t stream = data.readInt32();
699ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent            int output = data.readInt32();
700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            reply->writeInt32(setStreamOutput(stream, output));
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
711