IAudioFlinger.cpp revision a4c5a550e2a3bc237179b8684e51718e05894492
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/*
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,
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    SET_STREAM_OUTPUT,
62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    NEW_AUDIO_SESSION_ID,
663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    ACQUIRE_AUDIO_SESSION_ID,
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    RELEASE_AUDIO_SESSION_ID,
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent    CREATE_EFFECT,
72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    MOVE_EFFECTS,
73a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    LOAD_HW_MODULE
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
86fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                audio_stream_type_t streamType,
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
8858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
890d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi                                uint32_t channelMask,
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
91a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten                                track_flags_t flags,
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
9372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t output,
94be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
985841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
101fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) streamType);
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1040d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
106a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten        data.writeInt32((int32_t) flags);
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(sharedBuffer->asBinder());
10872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int lSessionId = 0;
110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
113be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
11629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createTrack error: %s", strerror(-lStatus));
1175841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
121be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1225841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1235841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1285841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t pid,
13372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t input,
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
13558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
1360d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi                                uint32_t channelMask,
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int frameCount,
138a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten                                track_flags_t flags,
139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1435841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(pid);
14672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) input);
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1490d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int lSessionId = 0;
153be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
154be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
155be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
156be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
1575841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1585841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
15929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("openRecord error: %s", strerror(-lStatus));
1605841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
161be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
162be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
164be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1655841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1665841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
1675841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1715841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t output) const
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
17872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual int channelCount(audio_io_handle_t output) const
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
18772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(CHANNEL_COUNT, data, &reply);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
19858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual size_t frameCount(audio_io_handle_t output) const
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
21472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
25472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
258fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
26072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
265fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
269fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
279fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
28072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
285fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
289fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
294f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
303c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
307c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
312c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
316c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
33472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(client->asBinder());
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
348f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, int channelCount) const
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channelCount);
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
359a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_io_handle_t openOutput(audio_module_handle_t module,
360a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_devices_t *pDevices,
361a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         uint32_t *pSamplingRate,
362a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_format_t *pFormat,
363a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_channel_mask_t *pChannelMask,
364a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         uint32_t *pLatencyMs,
365a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_policy_output_flags_t flags)
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
368a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        audio_devices_t devices = pDevices ? *pDevices : (audio_devices_t)0;
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
37058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT;
371a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        audio_channel_mask_t channelMask = pChannelMask ? *pChannelMask : (audio_channel_mask_t)0;
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
375a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
379a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(channelMask);
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(latency);
38118868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
38372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        audio_io_handle_t output = (audio_io_handle_t) reply.readInt32();
38472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        ALOGV("openOutput() returned output, %d", output);
385a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        devices = (audio_devices_t)reply.readInt32();
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
38958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        format = (audio_format_t) reply.readInt32();
390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
391a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        channelMask = (audio_channel_mask_t)reply.readInt32();
392a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        if (pChannelMask) *pChannelMask = channelMask;
393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        latency = reply.readInt32();
394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pLatencyMs) *pLatencyMs = latency;
395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return output;
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
39872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
39972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
40372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
40472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
40672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
40972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
42272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
42772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
43172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
436a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_io_handle_t openInput(audio_module_handle_t module,
437a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_devices_t *pDevices,
438a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        uint32_t *pSamplingRate,
439a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_format_t *pFormat,
440a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_channel_mask_t *pChannelMask)
44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
443a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        audio_devices_t devices = pDevices ? *pDevices : (audio_devices_t)0;
444c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
44558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT;
446a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        audio_channel_mask_t channelMask = pChannelMask ? *pChannelMask : (audio_channel_mask_t)0;
447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
449a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
453a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(channelMask);
454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
45572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        audio_io_handle_t input = (audio_io_handle_t) reply.readInt32();
456a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        devices = (audio_devices_t)reply.readInt32();
457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pDevices) *pDevices = devices;
458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pSamplingRate) *pSamplingRate = samplingRate;
46058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        format = (audio_format_t) reply.readInt32();
461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (pFormat) *pFormat = format;
462a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        channelMask = (audio_channel_mask_t)reply.readInt32();
463a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        if (pChannelMask) *pChannelMask = channelMask;
464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return input;
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
466c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
467fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
471fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
472c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
47672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output)
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
480fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
48172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
482c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
483c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
485f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
486f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
487f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
488f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
489f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
490f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
491f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
492f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
493f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
494342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
49572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
49672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
50072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (halFrames) {
506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (dspFrames) {
510342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
512342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
514342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
51505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
51672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual unsigned int getInputFramesLost(audio_io_handle_t ioHandle) const
51705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
51805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
51905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
52072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
52105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
52205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        return reply.readInt32();
52305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
524be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
525be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual int newAudioSessionId()
526be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int id = 0;
531be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
533be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
535be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
536be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
5373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    virtual void acquireAudioSessionId(int audioSession)
5383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
5423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
5433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    virtual void releaseAudioSessionId(int audioSession)
5463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
5503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
5513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
553f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
554be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
555be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
562be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
5659d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
571f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
578ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
579ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
5915e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
592f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual sp<IEffect> createEffect(pid_t pid,
613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
61672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int sessionId,
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
626e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
627e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            if (status) {
628e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
629e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
630e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(pid);
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeStrongBinder(client->asBinder());
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
63772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
64229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (id) {
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
650a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status) {
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
662de070137f11d346fba77605bd76a44c040a618fcEric Laurent
66372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
66472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
665de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
666de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
667de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
668de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
66972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
67072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
671de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
672de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
673de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
674a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
675a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
676a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
677a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
678a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
679a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
680a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
681a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
682a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
68689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
69089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
69189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
692e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
69689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
69858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
69989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
70089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
701a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
70372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
70589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
70689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioTrack> track = createTrack(pid,
707fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                    (audio_stream_type_t) streamType, sampleRate, format,
708a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten                    channelCount, bufferCount, flags, buffer, output, &sessionId, &status);
709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
71089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
71189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
71289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
71389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
71489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
71589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = data.readInt32();
71772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
71958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
72189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t bufferCount = data.readInt32();
722a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
725c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            sp<IAudioRecord> record = openRecord(pid, input,
726be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                    sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status);
727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
73289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
73472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
73689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
73789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CHANNEL_COUNT: {
73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
73972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( channelCount((audio_io_handle_t) data.readInt32()) );
74089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
74189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
74289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
74389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
74472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
74589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
74689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
74789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
74972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) );
75089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
75472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
75689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
757e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
75889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
75989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
76089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
76189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
76389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
76489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
76589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
77189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
77789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
780c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
78172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
782fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
788fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
794fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
795fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
801fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
806f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
81489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
81589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
821c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
82372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
824c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
825c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
827e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
828c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
829c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
83072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
831c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
832c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
834e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
84558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int channelCount = data.readInt32();
84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) );
84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
852a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
853a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
85558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
856a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t latency = data.readInt32();
85818868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten            audio_policy_output_flags_t flags = (audio_policy_output_flags_t) data.readInt32();
859a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_io_handle_t output = openOutput(module,
860a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &devices,
861a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &samplingRate,
862a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &format,
863a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &channelMask,
864a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &latency,
865a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 flags);
8663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("OPEN_OUTPUT output, %p", output);
86772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) output);
868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
870c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
871a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(channelMask);
872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(latency);
873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
875c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
87772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
87872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
87972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
88472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
886c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
88972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
89472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
899a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
900a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
901c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
90258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
903a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
904c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
905a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_io_handle_t input = openInput(module,
906a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &devices,
907a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &samplingRate,
908a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &format,
909a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &channelMask);
91072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) input);
911c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
914a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(channelMask);
915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
917c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
91972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_OUTPUT: {
92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
924c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t stream = data.readInt32();
92572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
926fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output));
92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
929f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
930f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
931f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
932f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
933f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
934f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
935342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
936342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
93772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
938342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t halFrames;
939342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t dspFrames;
940342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
941342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
942342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
943342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
944342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
945342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
946342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
947342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
94805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
94905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
95072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
95105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            reply->writeInt32(getInputFramesLost(ioHandle));
95205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
95305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
956be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(newAudioSessionId());
957be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
958be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
9593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
9603a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
9613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
9623a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            acquireAudioSessionId(audioSession);
9633a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
9643a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
9653a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
9663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
9673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
9683a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            releaseAudioSessionId(audioSession);
9693a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
9703a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
972be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
973be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            uint32_t numEffects;
974be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
975be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
976be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
977be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
978be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
979be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
980be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
981ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
982be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
983be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
984ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
985be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
986be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
987be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
988be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
989be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
990be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
991be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
992be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
993be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
994be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
995be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
996be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
997be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
998be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
999be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1000be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1001be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1002be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1003be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1004be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1005be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            pid_t pid = data.readInt32();
1006be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1007be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
1008be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1009be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
101072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1011be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
1012be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status;
1013be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int id;
1014be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int enabled;
101505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
1016be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
1017be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1018be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1019be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
1020be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeStrongBinder(effect->asBinder());
1021be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1022be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1023be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1024de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1025de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1026de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
102772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
102872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1029de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1030de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1031de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1032a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1033a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1034a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1035a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1036a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
1045