IAudioFlinger.cpp revision c2f1f07084818942352c6bbfb36af9b6b330eb4e
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* //device/extlibs/pv/android/IAudioflinger.cpp
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger"
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OPEN_RECORD,
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SAMPLE_RATE,
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CHANNEL_COUNT,
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    IS_MUSIC_ACTIVE,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
62c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_STREAM_OUTPUT
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int streamType,
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int format,
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int channelCount,
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t flags,
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
82c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                void *output,
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(streamType);
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(channelCount);
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(sharedBuffer->asBinder());
95c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("createTrack error: %s", strerror(-lStatus));
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lStatus = reply.readInt32();
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IAudioTrack>(reply.readStrongBinder());
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                void *input,
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int format,
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int channelCount,
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t flags,
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&input, sizeof(void *));
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(channelCount);
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(OPEN_RECORD, data, &reply);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = reply.readInt32();
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return interface_cast<IAudioRecord>(reply.readStrongBinder());
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual uint32_t sampleRate(void *output) const
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual int channelCount(void *output) const
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CHANNEL_COUNT, data, &reply);
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual int format(void *output) const
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual size_t frameCount(void *output) const
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual uint32_t latency(void *output) const
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
174c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
213c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setStreamVolume(int stream, float value, void *output)
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
219c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setStreamMute(int stream, bool muted)
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
234c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual float streamVolume(int stream, void *output) const
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
239c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool streamMute(int stream) const
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(stream);
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
253c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMode(int mode)
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
258c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
262c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
266c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
267c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
271c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
275c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
279c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool isMusicActive() const
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
283c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(IS_MUSIC_ACTIVE, data, &reply);
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
287c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setParameters(void *ioHandle, const String8& keyValuePairs)
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&ioHandle, sizeof(void *));
292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual String8 getParameters(void *ioHandle, const String8& keys)
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&ioHandle, sizeof(void *));
302c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
303c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
309c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
311c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(client->asBinder());
312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
319c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
320c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
321c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channelCount);
322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void *openOutput(uint32_t *pDevices,
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pSamplingRate,
328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pFormat,
329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pChannels,
330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t *pLatencyMs,
331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                            uint32_t flags)
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channels);
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(latency);
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(flags);
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        void *output;
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        reply.read(&output, sizeof(void *));
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        LOGV("openOutput() returned output, %p", output);
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        devices = reply.readInt32();
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        format = reply.readInt32();
356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        channels = reply.readInt32();
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pChannels) *pChannels = channels;
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        latency = reply.readInt32();
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pLatencyMs) *pLatencyMs = latency;
361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return output;
362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
364c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void *openDuplicateOutput(void *output1, void *output2)
365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output1, sizeof(void *));
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output2, sizeof(void *));
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        void *output;
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        reply.read(&output, sizeof(void *));
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return output;
374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t closeOutput(void *output)
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t suspendOutput(void *output)
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t restoreOutput(void *output)
39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void *openInput(uint32_t *pDevices,
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t *pSamplingRate,
405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t *pFormat,
406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t *pChannels,
407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                        uint32_t acoustics)
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t devices = pDevices ? *pDevices : 0;
411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t format = pFormat ? *pFormat : 0;
413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t channels = pChannels ? *pChannels : 0;
414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
417c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channels);
420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(acoustics);
421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        void *input;
423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        reply.read(&input, sizeof(void *));
424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        devices = reply.readInt32();
425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        format = reply.readInt32();
429c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        channels = reply.readInt32();
431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pChannels) *pChannels = channels;
432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return input;
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t closeInput(void *input)
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&input, sizeof(void *));
440c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
444c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setStreamOutput(uint32_t stream, void *output)
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
448c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(stream);
449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&output, sizeof(void *));
450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch(code) {
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t flags = data.readInt32();
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
474c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioTrack> track = createTrack(pid,
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    streamType, sampleRate, format,
478c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                    channelCount, bufferCount, flags, buffer, output, &status);
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *input;
487c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&input, sizeof(void *));
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t flags = data.readInt32();
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
494c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            sp<IAudioRecord> record = openRecord(pid, input,
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    sampleRate, format, channelCount, bufferCount, flags, &status);
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
502c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
503c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( sampleRate(output) );
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CHANNEL_COUNT: {
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
509c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
510c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( channelCount(output) );
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
516c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
517c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( format(output) );
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
523c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
524c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( frameCount(output) );
52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
530c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
531c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( latency(output) );
53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project         case SET_MASTER_VOLUME: {
53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
558c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
559c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
560c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
561c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32( setStreamVolume(stream, volume, output) );
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setStreamMute(stream, data.readInt32()) );
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
573c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
574c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
575c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeFloat( streamVolume(stream, output) );
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( streamMute(stream) );
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int mode = data.readInt32();
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case IS_MUSIC_ACTIVE: {
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( isMusicActive() );
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
606c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
608c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *ioHandle;
609c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&ioHandle, sizeof(void *));
610c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
611c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
613c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent         } break;
614c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
615c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
616c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *ioHandle;
617c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&ioHandle, sizeof(void *));
618c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
619c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
620c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
621c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent         } break;
622c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int format = data.readInt32();
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
637c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
638c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
639c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t devices = data.readInt32();
640c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
641c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t format = data.readInt32();
642c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t channels = data.readInt32();
643c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t latency = data.readInt32();
644c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t flags = data.readInt32();
645c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output = openOutput(&devices,
646c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &samplingRate,
647c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &format,
648c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &channels,
649c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &latency,
650c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     flags);
651c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            LOGV("OPEN_OUTPUT output, %p", output);
652c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->write(&output, sizeof(void *));
653c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
654c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
655c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
656c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(channels);
657c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(latency);
658c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
659c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
660c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
661c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
662c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output1;
663c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output2;
664c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output1, sizeof(void *));
665c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output2, sizeof(void *));
666c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output = openDuplicateOutput(output1, output2);
667c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->write(&output, sizeof(void *));
668c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
669c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
670c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
671c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
672c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
673c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
674c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(closeOutput(output));
675c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
676c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
677c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
678c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
679c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
680c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
681c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(suspendOutput(output));
682c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
683c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
684c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
685c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
686c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
687c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
688c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(restoreOutput(output));
689c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
690c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
691c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
692c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
693c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t devices = data.readInt32();
694c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
695c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t format = data.readInt32();
696c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t channels = data.readInt32();
697c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t acoutics = data.readInt32();
698c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
699c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *input = openInput(&devices,
700c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &samplingRate,
701c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &format,
702c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     &channels,
703c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                     acoutics);
704c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->write(&input, sizeof(void *));
705c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
706c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
707c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
708c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(channels);
709c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
710c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
711c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
71289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
713c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *input;
714c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&input, sizeof(void *));
715c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(closeInput(input));
71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
71789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
718c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_OUTPUT: {
71989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
720c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            void *output;
721c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t stream = data.readInt32();
722c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            data.read(&output, sizeof(void *));
723c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setStreamOutput(stream, output));
72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
72589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
72689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
72789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
73289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
734