IAudioFlinger.cpp revision de070137f11d346fba77605bd76a44c040a618fc
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"
19417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye//#define LOG_NDEBUG 0
20417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye#include <utils/Log.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette#include <stdint.h>
23b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette#include <sys/types.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#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,
47b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    SET_MODE,
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_MIC_MUTE,
49b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    GET_MIC_MUTE,
50b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    IS_STREAM_ACTIVE,
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_PARAMETERS,
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GET_PARAMETERS,
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REGISTER_CLIENT,
542add9bcf8c33c59f300551bdb0671bbff0b55794Alan Viverette    GET_INPUTBUFFERSIZE,
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OPEN_OUTPUT,
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OPEN_DUPLICATE_OUTPUT,
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CLOSE_OUTPUT,
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SUSPEND_OUTPUT,
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RESTORE_OUTPUT,
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OPEN_INPUT,
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CLOSE_INPUT,
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_STREAM_OUTPUT,
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SET_VOICE_VOLUME,
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GET_RENDER_POSITION,
65b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    GET_INPUT_FRAMES_LOST,
66b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    NEW_AUDIO_SESSION_ID,
67b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    LOAD_EFFECT_LIBRARY,
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    UNLOAD_EFFECT_LIBRARY,
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    QUERY_NUM_EFFECTS,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    QUERY_EFFECT,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GET_EFFECT_DESCRIPTOR,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CREATE_EFFECT,
73b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    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,
87417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye                                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,
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int output,
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int *sessionId,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status)
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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());
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(output);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lSessionId = 0;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sessionId != NULL) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lSessionId = *sessionId;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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));
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lSessionId = reply.readInt32();
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sessionId != NULL) {
120b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette                *sessionId = lSessionId;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lStatus = reply.readInt32();
123b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            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;
127b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                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,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int *sessionId,
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status)
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<IAudioRecord> record;
144b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
145b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(pid);
146b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(input);
147b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(sampleRate);
148b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(format);
149b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(channelCount);
150b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(frameCount);
151b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(flags);
152b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        int lSessionId = 0;
153b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        if (sessionId != NULL) {
154b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            lSessionId = *sessionId;
155b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        }
156b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInt32(lSessionId);
157b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
158b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        if (lStatus != NO_ERROR) {
159b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            LOGE("openRecord error: %s", strerror(-lStatus));
160b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        } else {
161b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            lSessionId = reply.readInt32();
162b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            if (sessionId != NULL) {
163b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette                *sessionId = lSessionId;
164b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            }
165b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            lStatus = reply.readInt32();
166b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
167b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        }
168b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        if (status) {
169b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette            *status = lStatus;
170b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        }
171b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        return record;
172b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual uint32_t sampleRate(int output) const
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
177b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
178b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette        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
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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());
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int format(int output) const
193c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy    {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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());
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
210b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy    virtual uint32_t latency(int output) const
211b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy    {
212b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy        Parcel data, reply;
213b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(output);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
216c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy        return reply.readInt32();
217c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy    }
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
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_MODE, data, &reply);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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());
306f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa        data.writeInt32(state);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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());
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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());
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(stream);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        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
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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());
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(ioHandle);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeString8(keyValuePairs);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(SET_PARAMETERS, data, &reply);
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    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());
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(ioHandle);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeString8(keys);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(GET_PARAMETERS, data, &reply);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readString8();
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void registerClient(const sp<IAudioFlingerClient>& client)
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStrongBinder(client->asBinder());
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(REGISTER_CLIENT, data, &reply);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(sampleRate);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(channelCount);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int openOutput(uint32_t *pDevices,
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            uint32_t *pSamplingRate,
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            uint32_t *pFormat,
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            uint32_t *pChannels,
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            uint32_t *pLatencyMs,
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            uint32_t flags)
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t devices = pDevices ? *pDevices : 0;
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t format = pFormat ? *pFormat : 0;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t channels = pChannels ? *pChannels : 0;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(devices);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(samplingRate);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(channels);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(latency);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(flags);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(OPEN_OUTPUT, data, &reply);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int  output = reply.readInt32();
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGV("openOutput() returned output, %p", output);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        devices = reply.readInt32();
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pDevices) *pDevices = devices;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        samplingRate = reply.readInt32();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pSamplingRate) *pSamplingRate = samplingRate;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        format = reply.readInt32();
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pFormat) *pFormat = format;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        channels = reply.readInt32();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pChannels) *pChannels = channels;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        latency = reply.readInt32();
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pLatencyMs) *pLatencyMs = latency;
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return output;
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int openDuplicateOutput(int output1, int output2)
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(output1);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(output2);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t closeOutput(int output)
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(output);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(CLOSE_OUTPUT, data, &reply);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return reply.readInt32();
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
423    virtual status_t suspendOutput(int output)
424    {
425        Parcel data, reply;
426        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
427        data.writeInt32(output);
428        remote()->transact(SUSPEND_OUTPUT, data, &reply);
429        return reply.readInt32();
430    }
431
432    virtual status_t restoreOutput(int output)
433    {
434        Parcel data, reply;
435        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
436        data.writeInt32(output);
437        remote()->transact(RESTORE_OUTPUT, data, &reply);
438        return reply.readInt32();
439    }
440
441    virtual int openInput(uint32_t *pDevices,
442                            uint32_t *pSamplingRate,
443                            uint32_t *pFormat,
444                            uint32_t *pChannels,
445                            uint32_t acoustics)
446    {
447        Parcel data, reply;
448        uint32_t devices = pDevices ? *pDevices : 0;
449        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
450        uint32_t format = pFormat ? *pFormat : 0;
451        uint32_t channels = pChannels ? *pChannels : 0;
452
453        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
454        data.writeInt32(devices);
455        data.writeInt32(samplingRate);
456        data.writeInt32(format);
457        data.writeInt32(channels);
458        data.writeInt32(acoustics);
459        remote()->transact(OPEN_INPUT, data, &reply);
460        int input = reply.readInt32();
461        devices = reply.readInt32();
462        if (pDevices) *pDevices = devices;
463        samplingRate = reply.readInt32();
464        if (pSamplingRate) *pSamplingRate = samplingRate;
465        format = reply.readInt32();
466        if (pFormat) *pFormat = format;
467        channels = reply.readInt32();
468        if (pChannels) *pChannels = channels;
469        return input;
470    }
471
472    virtual status_t closeInput(int input)
473    {
474        Parcel data, reply;
475        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
476        data.writeInt32(input);
477        remote()->transact(CLOSE_INPUT, data, &reply);
478        return reply.readInt32();
479    }
480
481    virtual status_t setStreamOutput(uint32_t stream, int output)
482    {
483        Parcel data, reply;
484        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
485        data.writeInt32(stream);
486        data.writeInt32(output);
487        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
488        return reply.readInt32();
489    }
490
491    virtual status_t setVoiceVolume(float volume)
492    {
493        Parcel data, reply;
494        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
495        data.writeFloat(volume);
496        remote()->transact(SET_VOICE_VOLUME, data, &reply);
497        return reply.readInt32();
498    }
499
500    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
501    {
502        Parcel data, reply;
503        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
504        data.writeInt32(output);
505        remote()->transact(GET_RENDER_POSITION, data, &reply);
506        status_t status = reply.readInt32();
507        if (status == NO_ERROR) {
508            uint32_t tmp = reply.readInt32();
509            if (halFrames) {
510                *halFrames = tmp;
511            }
512            tmp = reply.readInt32();
513            if (dspFrames) {
514                *dspFrames = tmp;
515            }
516        }
517        return status;
518    }
519
520    virtual unsigned int getInputFramesLost(int ioHandle)
521    {
522        Parcel data, reply;
523        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
524        data.writeInt32(ioHandle);
525        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
526        return reply.readInt32();
527    }
528
529    virtual int newAudioSessionId()
530    {
531        Parcel data, reply;
532        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
533        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
534        int id = 0;
535        if (status == NO_ERROR) {
536            id = reply.readInt32();
537        }
538        return id;
539    }
540
541    virtual status_t loadEffectLibrary(const char *libPath, int *handle)
542    {
543        if (libPath == NULL || handle == NULL) {
544            return BAD_VALUE;
545        }
546        *handle = 0;
547        Parcel data, reply;
548        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
549        data.writeCString(libPath);
550        status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply);
551        if (status == NO_ERROR) {
552            status = reply.readInt32();
553            if (status == NO_ERROR) {
554                *handle = reply.readInt32();
555            }
556        }
557        return status;
558    }
559
560    virtual status_t unloadEffectLibrary(int handle)
561    {
562        Parcel data, reply;
563        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
564        data.writeInt32(handle);
565        status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply);
566        if (status == NO_ERROR) {
567            status = reply.readInt32();
568        }
569        return status;
570    }
571
572    virtual status_t queryNumberEffects(uint32_t *numEffects)
573    {
574        Parcel data, reply;
575        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
576        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
577        if (status != NO_ERROR) {
578            return status;
579        }
580        status = reply.readInt32();
581        if (status != NO_ERROR) {
582            return status;
583        }
584        if (numEffects) {
585            *numEffects = (uint32_t)reply.readInt32();
586        }
587        return NO_ERROR;
588    }
589
590    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor)
591    {
592        if (pDescriptor == NULL) {
593            return BAD_VALUE;
594        }
595        Parcel data, reply;
596        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
597        data.writeInt32(index);
598        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
599        if (status != NO_ERROR) {
600            return status;
601        }
602        status = reply.readInt32();
603        if (status != NO_ERROR) {
604            return status;
605        }
606        reply.read(pDescriptor, sizeof(effect_descriptor_t));
607        return NO_ERROR;
608    }
609
610    virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor)
611    {
612        if (pUuid == NULL || pDescriptor == NULL) {
613            return BAD_VALUE;
614        }
615        Parcel data, reply;
616        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
617        data.write(pUuid, sizeof(effect_uuid_t));
618        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
619        if (status != NO_ERROR) {
620            return status;
621        }
622        status = reply.readInt32();
623        if (status != NO_ERROR) {
624            return status;
625        }
626        reply.read(pDescriptor, sizeof(effect_descriptor_t));
627        return NO_ERROR;
628    }
629
630    virtual sp<IEffect> createEffect(pid_t pid,
631                                    effect_descriptor_t *pDesc,
632                                    const sp<IEffectClient>& client,
633                                    int32_t priority,
634                                    int output,
635                                    int sessionId,
636                                    status_t *status,
637                                    int *id,
638                                    int *enabled)
639    {
640        Parcel data, reply;
641        sp<IEffect> effect;
642
643        if (pDesc == NULL) {
644             return effect;
645             if (status) {
646                 *status = BAD_VALUE;
647             }
648         }
649
650        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
651        data.writeInt32(pid);
652        data.write(pDesc, sizeof(effect_descriptor_t));
653        data.writeStrongBinder(client->asBinder());
654        data.writeInt32(priority);
655        data.writeInt32(output);
656        data.writeInt32(sessionId);
657
658        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
659        if (lStatus != NO_ERROR) {
660            LOGE("createEffect error: %s", strerror(-lStatus));
661        } else {
662            lStatus = reply.readInt32();
663            int tmp = reply.readInt32();
664            if (id) {
665                *id = tmp;
666            }
667            tmp = reply.readInt32();
668            if (enabled) {
669                *enabled = tmp;
670            }
671            effect = interface_cast<IEffect>(reply.readStrongBinder());
672            reply.read(pDesc, sizeof(effect_descriptor_t));
673        }
674        if (status) {
675            *status = lStatus;
676        }
677
678        return effect;
679    }
680
681    virtual status_t moveEffects(int session, int srcOutput, int dstOutput)
682    {
683        Parcel data, reply;
684        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
685        data.writeInt32(session);
686        data.writeInt32(srcOutput);
687        data.writeInt32(dstOutput);
688        remote()->transact(MOVE_EFFECTS, data, &reply);
689        return reply.readInt32();
690    }
691};
692
693IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
694
695// ----------------------------------------------------------------------
696
697status_t BnAudioFlinger::onTransact(
698    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
699{
700    switch(code) {
701        case CREATE_TRACK: {
702            CHECK_INTERFACE(IAudioFlinger, data, reply);
703            pid_t pid = data.readInt32();
704            int streamType = data.readInt32();
705            uint32_t sampleRate = data.readInt32();
706            int format = data.readInt32();
707            int channelCount = data.readInt32();
708            size_t bufferCount = data.readInt32();
709            uint32_t flags = data.readInt32();
710            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
711            int output = data.readInt32();
712            int sessionId = data.readInt32();
713            status_t status;
714            sp<IAudioTrack> track = createTrack(pid,
715                    streamType, sampleRate, format,
716                    channelCount, bufferCount, flags, buffer, output, &sessionId, &status);
717            reply->writeInt32(sessionId);
718            reply->writeInt32(status);
719            reply->writeStrongBinder(track->asBinder());
720            return NO_ERROR;
721        } break;
722        case OPEN_RECORD: {
723            CHECK_INTERFACE(IAudioFlinger, data, reply);
724            pid_t pid = data.readInt32();
725            int input = data.readInt32();
726            uint32_t sampleRate = data.readInt32();
727            int format = data.readInt32();
728            int channelCount = data.readInt32();
729            size_t bufferCount = data.readInt32();
730            uint32_t flags = data.readInt32();
731            int sessionId = data.readInt32();
732            status_t status;
733            sp<IAudioRecord> record = openRecord(pid, input,
734                    sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status);
735            reply->writeInt32(sessionId);
736            reply->writeInt32(status);
737            reply->writeStrongBinder(record->asBinder());
738            return NO_ERROR;
739        } break;
740        case SAMPLE_RATE: {
741            CHECK_INTERFACE(IAudioFlinger, data, reply);
742            reply->writeInt32( sampleRate(data.readInt32()) );
743            return NO_ERROR;
744        } break;
745        case CHANNEL_COUNT: {
746            CHECK_INTERFACE(IAudioFlinger, data, reply);
747            reply->writeInt32( channelCount(data.readInt32()) );
748            return NO_ERROR;
749        } break;
750        case FORMAT: {
751            CHECK_INTERFACE(IAudioFlinger, data, reply);
752            reply->writeInt32( format(data.readInt32()) );
753            return NO_ERROR;
754        } break;
755        case FRAME_COUNT: {
756            CHECK_INTERFACE(IAudioFlinger, data, reply);
757            reply->writeInt32( frameCount(data.readInt32()) );
758            return NO_ERROR;
759        } break;
760        case LATENCY: {
761            CHECK_INTERFACE(IAudioFlinger, data, reply);
762            reply->writeInt32( latency(data.readInt32()) );
763            return NO_ERROR;
764        } break;
765         case SET_MASTER_VOLUME: {
766            CHECK_INTERFACE(IAudioFlinger, data, reply);
767            reply->writeInt32( setMasterVolume(data.readFloat()) );
768            return NO_ERROR;
769        } break;
770        case SET_MASTER_MUTE: {
771            CHECK_INTERFACE(IAudioFlinger, data, reply);
772            reply->writeInt32( setMasterMute(data.readInt32()) );
773            return NO_ERROR;
774        } break;
775        case MASTER_VOLUME: {
776            CHECK_INTERFACE(IAudioFlinger, data, reply);
777            reply->writeFloat( masterVolume() );
778            return NO_ERROR;
779        } break;
780        case MASTER_MUTE: {
781            CHECK_INTERFACE(IAudioFlinger, data, reply);
782            reply->writeInt32( masterMute() );
783            return NO_ERROR;
784        } break;
785        case SET_STREAM_VOLUME: {
786            CHECK_INTERFACE(IAudioFlinger, data, reply);
787            int stream = data.readInt32();
788            float volume = data.readFloat();
789            int output = data.readInt32();
790            reply->writeInt32( setStreamVolume(stream, volume, output) );
791            return NO_ERROR;
792        } break;
793        case SET_STREAM_MUTE: {
794            CHECK_INTERFACE(IAudioFlinger, data, reply);
795            int stream = data.readInt32();
796            reply->writeInt32( setStreamMute(stream, data.readInt32()) );
797            return NO_ERROR;
798        } break;
799        case STREAM_VOLUME: {
800            CHECK_INTERFACE(IAudioFlinger, data, reply);
801            int stream = data.readInt32();
802            int output = data.readInt32();
803            reply->writeFloat( streamVolume(stream, output) );
804            return NO_ERROR;
805        } break;
806        case STREAM_MUTE: {
807            CHECK_INTERFACE(IAudioFlinger, data, reply);
808            int stream = data.readInt32();
809            reply->writeInt32( streamMute(stream) );
810            return NO_ERROR;
811        } break;
812        case SET_MODE: {
813            CHECK_INTERFACE(IAudioFlinger, data, reply);
814            int mode = data.readInt32();
815            reply->writeInt32( setMode(mode) );
816            return NO_ERROR;
817        } break;
818        case SET_MIC_MUTE: {
819            CHECK_INTERFACE(IAudioFlinger, data, reply);
820            int state = data.readInt32();
821            reply->writeInt32( setMicMute(state) );
822            return NO_ERROR;
823        } break;
824        case GET_MIC_MUTE: {
825            CHECK_INTERFACE(IAudioFlinger, data, reply);
826            reply->writeInt32( getMicMute() );
827            return NO_ERROR;
828        } break;
829        case IS_STREAM_ACTIVE: {
830            CHECK_INTERFACE(IAudioFlinger, data, reply);
831            int stream = data.readInt32();
832            reply->writeInt32( isStreamActive(stream) );
833            return NO_ERROR;
834        } break;
835        case SET_PARAMETERS: {
836            CHECK_INTERFACE(IAudioFlinger, data, reply);
837            int ioHandle = data.readInt32();
838            String8 keyValuePairs(data.readString8());
839            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
840            return NO_ERROR;
841         } break;
842        case GET_PARAMETERS: {
843            CHECK_INTERFACE(IAudioFlinger, data, reply);
844            int ioHandle = data.readInt32();
845            String8 keys(data.readString8());
846            reply->writeString8(getParameters(ioHandle, keys));
847            return NO_ERROR;
848         } break;
849
850        case REGISTER_CLIENT: {
851            CHECK_INTERFACE(IAudioFlinger, data, reply);
852            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
853            registerClient(client);
854            return NO_ERROR;
855        } break;
856        case GET_INPUTBUFFERSIZE: {
857            CHECK_INTERFACE(IAudioFlinger, data, reply);
858            uint32_t sampleRate = data.readInt32();
859            int format = data.readInt32();
860            int channelCount = data.readInt32();
861            reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
862            return NO_ERROR;
863        } break;
864        case OPEN_OUTPUT: {
865            CHECK_INTERFACE(IAudioFlinger, data, reply);
866            uint32_t devices = data.readInt32();
867            uint32_t samplingRate = data.readInt32();
868            uint32_t format = data.readInt32();
869            uint32_t channels = data.readInt32();
870            uint32_t latency = data.readInt32();
871            uint32_t flags = data.readInt32();
872            int output = openOutput(&devices,
873                                     &samplingRate,
874                                     &format,
875                                     &channels,
876                                     &latency,
877                                     flags);
878            LOGV("OPEN_OUTPUT output, %p", output);
879            reply->writeInt32(output);
880            reply->writeInt32(devices);
881            reply->writeInt32(samplingRate);
882            reply->writeInt32(format);
883            reply->writeInt32(channels);
884            reply->writeInt32(latency);
885            return NO_ERROR;
886        } break;
887        case OPEN_DUPLICATE_OUTPUT: {
888            CHECK_INTERFACE(IAudioFlinger, data, reply);
889            int output1 = data.readInt32();
890            int output2 = data.readInt32();
891            reply->writeInt32(openDuplicateOutput(output1, output2));
892            return NO_ERROR;
893        } break;
894        case CLOSE_OUTPUT: {
895            CHECK_INTERFACE(IAudioFlinger, data, reply);
896            reply->writeInt32(closeOutput(data.readInt32()));
897            return NO_ERROR;
898        } break;
899        case SUSPEND_OUTPUT: {
900            CHECK_INTERFACE(IAudioFlinger, data, reply);
901            reply->writeInt32(suspendOutput(data.readInt32()));
902            return NO_ERROR;
903        } break;
904        case RESTORE_OUTPUT: {
905            CHECK_INTERFACE(IAudioFlinger, data, reply);
906            reply->writeInt32(restoreOutput(data.readInt32()));
907            return NO_ERROR;
908        } break;
909        case OPEN_INPUT: {
910            CHECK_INTERFACE(IAudioFlinger, data, reply);
911            uint32_t devices = data.readInt32();
912            uint32_t samplingRate = data.readInt32();
913            uint32_t format = data.readInt32();
914            uint32_t channels = data.readInt32();
915            uint32_t acoutics = data.readInt32();
916
917            int input = openInput(&devices,
918                                     &samplingRate,
919                                     &format,
920                                     &channels,
921                                     acoutics);
922            reply->writeInt32(input);
923            reply->writeInt32(devices);
924            reply->writeInt32(samplingRate);
925            reply->writeInt32(format);
926            reply->writeInt32(channels);
927            return NO_ERROR;
928        } break;
929        case CLOSE_INPUT: {
930            CHECK_INTERFACE(IAudioFlinger, data, reply);
931            reply->writeInt32(closeInput(data.readInt32()));
932            return NO_ERROR;
933        } break;
934        case SET_STREAM_OUTPUT: {
935            CHECK_INTERFACE(IAudioFlinger, data, reply);
936            uint32_t stream = data.readInt32();
937            int output = data.readInt32();
938            reply->writeInt32(setStreamOutput(stream, output));
939            return NO_ERROR;
940        } break;
941        case SET_VOICE_VOLUME: {
942            CHECK_INTERFACE(IAudioFlinger, data, reply);
943            float volume = data.readFloat();
944            reply->writeInt32( setVoiceVolume(volume) );
945            return NO_ERROR;
946        } break;
947        case GET_RENDER_POSITION: {
948            CHECK_INTERFACE(IAudioFlinger, data, reply);
949            int output = data.readInt32();
950            uint32_t halFrames;
951            uint32_t dspFrames;
952            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
953            reply->writeInt32(status);
954            if (status == NO_ERROR) {
955                reply->writeInt32(halFrames);
956                reply->writeInt32(dspFrames);
957            }
958            return NO_ERROR;
959        }
960        case GET_INPUT_FRAMES_LOST: {
961            CHECK_INTERFACE(IAudioFlinger, data, reply);
962            int ioHandle = data.readInt32();
963            reply->writeInt32(getInputFramesLost(ioHandle));
964            return NO_ERROR;
965        } break;
966        case NEW_AUDIO_SESSION_ID: {
967            CHECK_INTERFACE(IAudioFlinger, data, reply);
968            reply->writeInt32(newAudioSessionId());
969            return NO_ERROR;
970        } break;
971        case LOAD_EFFECT_LIBRARY: {
972            CHECK_INTERFACE(IAudioFlinger, data, reply);
973            int handle;
974            status_t status = loadEffectLibrary(data.readCString(), &handle);
975            reply->writeInt32(status);
976            if (status == NO_ERROR) {
977                reply->writeInt32(handle);
978            }
979            return NO_ERROR;
980        }
981        case UNLOAD_EFFECT_LIBRARY: {
982            CHECK_INTERFACE(IAudioFlinger, data, reply);
983            reply->writeInt32(unloadEffectLibrary(data.readInt32()));
984            return NO_ERROR;
985        }
986        case QUERY_NUM_EFFECTS: {
987            CHECK_INTERFACE(IAudioFlinger, data, reply);
988            uint32_t numEffects;
989            status_t status = queryNumberEffects(&numEffects);
990            reply->writeInt32(status);
991            if (status == NO_ERROR) {
992                reply->writeInt32((int32_t)numEffects);
993            }
994            return NO_ERROR;
995        }
996        case QUERY_EFFECT: {
997            CHECK_INTERFACE(IAudioFlinger, data, reply);
998            effect_descriptor_t desc;
999            status_t status = queryEffect(data.readInt32(), &desc);
1000            reply->writeInt32(status);
1001            if (status == NO_ERROR) {
1002                reply->write(&desc, sizeof(effect_descriptor_t));
1003            }
1004            return NO_ERROR;
1005        }
1006        case GET_EFFECT_DESCRIPTOR: {
1007            CHECK_INTERFACE(IAudioFlinger, data, reply);
1008            effect_uuid_t uuid;
1009            data.read(&uuid, sizeof(effect_uuid_t));
1010            effect_descriptor_t desc;
1011            status_t status = getEffectDescriptor(&uuid, &desc);
1012            reply->writeInt32(status);
1013            if (status == NO_ERROR) {
1014                reply->write(&desc, sizeof(effect_descriptor_t));
1015            }
1016            return NO_ERROR;
1017        }
1018        case CREATE_EFFECT: {
1019            CHECK_INTERFACE(IAudioFlinger, data, reply);
1020            pid_t pid = data.readInt32();
1021            effect_descriptor_t desc;
1022            data.read(&desc, sizeof(effect_descriptor_t));
1023            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1024            int32_t priority = data.readInt32();
1025            int output = data.readInt32();
1026            int sessionId = data.readInt32();
1027            status_t status;
1028            int id;
1029            int enabled;
1030
1031            sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
1032            reply->writeInt32(status);
1033            reply->writeInt32(id);
1034            reply->writeInt32(enabled);
1035            reply->writeStrongBinder(effect->asBinder());
1036            reply->write(&desc, sizeof(effect_descriptor_t));
1037            return NO_ERROR;
1038        } break;
1039        case MOVE_EFFECTS: {
1040            CHECK_INTERFACE(IAudioFlinger, data, reply);
1041            int session = data.readInt32();
1042            int srcOutput = data.readInt32();
1043            int dstOutput = data.readInt32();
1044            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1045            return NO_ERROR;
1046        } break;
1047        default:
1048            return BBinder::onTransact(code, data, reply, flags);
1049    }
1050}
1051
1052// ----------------------------------------------------------------------------
1053
1054}; // namespace android
1055