IAudioFlinger.cpp revision d054c32443a493513ab63529b0c8b1aca290278c
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,
355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten    RESERVED,   // obsolete, was 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,
73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    LOAD_HW_MODULE,
74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_FRAME_COUNT,
764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    SET_LOW_RAM_DEVICE,
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
88fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                audio_stream_type_t streamType,
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
9058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
91dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten                                audio_channel_mask_t channelMask,
92e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten                                size_t frameCount,
93e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                                track_flags_t *flags,
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
9572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t output,
963acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                                pid_t tid,
97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
98d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten                                String8& name,
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1025841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
104fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) streamType);
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1070d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
109b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
110e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        data.writeInt32(lFlags);
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(sharedBuffer->asBinder());
11272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
1133acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        data.writeInt32((int32_t) tid);
114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int lSessionId = 0;
115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
12129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createTrack error: %s", strerror(-lStatus));
1225841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
123e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            lFlags = reply.readInt32();
124e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            if (flags != NULL) {
125e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                *flags = lFlags;
126e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            }
127be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
128be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
131d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten            name = reply.readString8();
1325841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1335841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1385841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
14272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t input,
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
14458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
14528b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                audio_channel_mask_t channelMask,
146e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten                                size_t frameCount,
147a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten                                track_flags_t flags,
1481879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten                                pid_t tid,
149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1535841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
15572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) input);
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1580d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(flags);
1611879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        data.writeInt32((int32_t) tid);
162be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int lSessionId = 0;
163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
164be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
165be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
166be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
1675841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1685841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
16929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("openRecord error: %s", strerror(-lStatus));
1705841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
171be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
172be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
173be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
174be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1755841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1765841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
1775841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status) {
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1815841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t output) const
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
18872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
19958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual size_t frameCount(audio_io_handle_t output) const
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
21572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
25572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
259fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
26172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
266fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
270fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
280fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
28172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
286fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
290fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
295f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
309c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
317c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
33572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(client->asBinder());
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
349dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
350dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
356dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
361a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_io_handle_t openOutput(audio_module_handle_t module,
362a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_devices_t *pDevices,
363a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         uint32_t *pSamplingRate,
364a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_format_t *pFormat,
365a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_channel_mask_t *pChannelMask,
366a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         uint32_t *pLatencyMs,
367ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                         audio_output_flags_t flags,
368ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                         const audio_offload_info_t *offloadInfo)
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
3717c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
3727c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
3737c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
3747c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_channel_mask_t channelMask = pChannelMask != NULL ?
3757c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten                *pChannelMask : (audio_channel_mask_t)0;
3767c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0;
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
378a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
379c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
382a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(channelMask);
383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(latency);
38418868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
385b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        if (offloadInfo == NULL) {
386b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(0);
387b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        } else {
388b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(1);
389b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.write(offloadInfo, sizeof(audio_offload_info_t));
390b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
39272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        audio_io_handle_t output = (audio_io_handle_t) reply.readInt32();
39372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        ALOGV("openOutput() returned output, %d", output);
394a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        devices = (audio_devices_t)reply.readInt32();
3957c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pDevices != NULL) *pDevices = devices;
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
3977c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pSamplingRate != NULL) *pSamplingRate = samplingRate;
39858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        format = (audio_format_t) reply.readInt32();
3997c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pFormat != NULL) *pFormat = format;
400a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        channelMask = (audio_channel_mask_t)reply.readInt32();
4017c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pChannelMask != NULL) *pChannelMask = channelMask;
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        latency = reply.readInt32();
4037c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pLatencyMs != NULL) *pLatencyMs = latency;
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return output;
405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
40772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
40872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
41372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
41572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
417c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
41872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
42272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
42772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(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(SUSPEND_OUTPUT, data, &reply);
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
43672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
44072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
444c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
445a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_io_handle_t openInput(audio_module_handle_t module,
446a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_devices_t *pDevices,
447a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        uint32_t *pSamplingRate,
448a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_format_t *pFormat,
449a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_channel_mask_t *pChannelMask)
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
4527c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
4537c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
4547c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
4557c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_channel_mask_t channelMask = pChannelMask != NULL ?
4567c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten                *pChannelMask : (audio_channel_mask_t)0;
457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
459a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
463a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(channelMask);
464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
46572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        audio_io_handle_t input = (audio_io_handle_t) reply.readInt32();
466a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        devices = (audio_devices_t)reply.readInt32();
4677c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pDevices != NULL) *pDevices = devices;
468c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
4697c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pSamplingRate != NULL) *pSamplingRate = samplingRate;
47058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        format = (audio_format_t) reply.readInt32();
4717c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pFormat != NULL) *pFormat = format;
472a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        channelMask = (audio_channel_mask_t)reply.readInt32();
4737c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        if (pChannelMask != NULL) *pChannelMask = channelMask;
474c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return input;
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
476c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
477fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
481fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
482c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
483c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output)
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
490fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
49172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
492c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
493c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
495f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
496f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
497f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
498f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
499f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
500f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
501f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
502f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
503f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
50526c77556efc30800466b60b3975bc35a70c8c28bGlenn Kasten    virtual status_t getRenderPosition(size_t *halFrames, size_t *dspFrames,
50672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
51072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
512342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
514342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
515342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (halFrames) {
516342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
517342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
518342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
519342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (dspFrames) {
520342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
521342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
522342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
523342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
524342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
52505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
526e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getInputFramesLost(audio_io_handle_t ioHandle) const
52705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
52805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
52905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
53072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
53105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
53205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        return reply.readInt32();
53305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
535be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual int newAudioSessionId()
536be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
537be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
538be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
539be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
540be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int id = 0;
541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
542be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
543be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
544be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
545be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
546be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    virtual void acquireAudioSessionId(int audioSession)
5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
5523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
5533a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5543a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
5553a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    virtual void releaseAudioSessionId(int audioSession)
5563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5573a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5583a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
5603a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
5613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5623a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
563f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
5759d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
581f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
588ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
589ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6015e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
602f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6228d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
62672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int sessionId,
628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
636e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
637e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            if (status) {
638e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
639e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
640e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeStrongBinder(client->asBinder());
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
64672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
65129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (id) {
656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
659a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status) {
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
671de070137f11d346fba77605bd76a44c040a618fcEric Laurent
67272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
67372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
674de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
675de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
676de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
677de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
67872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
67972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
680de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
681de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
682de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
683a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
684a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
685a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
686a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
687a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
688a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
689a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
690a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
691a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
692cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
6933b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
694cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
695cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
696cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
697cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
698cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
699cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
700cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
701e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
702cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
703cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
704cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
705cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
706cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
707cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
708cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7094182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
7104182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7114182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7124182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7134182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
7144182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
7154182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
7164182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7174182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten
71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
71989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
72189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
72289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
72389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
72589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
72689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
727e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
73258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
733dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
734e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten            size_t frameCount = data.readInt32();
735a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
73689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
73772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
7383acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
739be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
740d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten            String8 name;
74189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
7428d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IAudioTrack> track = createTrack(
743fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                    (audio_stream_type_t) streamType, sampleRate, format,
744d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten                    channelMask, frameCount, &flags, buffer, output, tid, &sessionId, name, &status);
745e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            reply->writeInt32(flags);
746be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
747d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten            reply->writeString8(name);
74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
74989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
75089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
75472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
75658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
757dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
758e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten            size_t frameCount = data.readInt32();
759a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
7601879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
761be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
7638d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IAudioRecord> record = openRecord(input,
764e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten                    sampleRate, format, channelMask, frameCount, flags, tid, &sessionId, &status);
765be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
77189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
77272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
77772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
78272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) );
78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
78772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
790e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
79489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
813c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
81472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
815fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
821fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
82389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
827fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
828fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
834fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
839f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
85672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
858c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
860e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
86372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
865c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
866c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
867e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
87185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
87285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
87958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
880dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
881dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) );
88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
884c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
886a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
887a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
88958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
890a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
891c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t latency = data.readInt32();
8920ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
893b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool hasOffloadInfo = data.readInt32() != 0;
894b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t offloadInfo;
895b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            if (hasOffloadInfo) {
896b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                data.read(&offloadInfo, sizeof(audio_offload_info_t));
897b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            }
898a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_io_handle_t output = openOutput(module,
899a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &devices,
900a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &samplingRate,
901a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &format,
902a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &channelMask,
903a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &latency,
904b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 flags,
905b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 hasOffloadInfo ? &offloadInfo : NULL);
9063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("OPEN_OUTPUT output, %p", output);
90772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) output);
908c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
909c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
910c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
911a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(channelMask);
912c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(latency);
913c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
914c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
915c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
916c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
91772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
91872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
91972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
920c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
921c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
922c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
923c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
92472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
925c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
926c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
927c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
928c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
92972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
930c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
931c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
932c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
933c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
93472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
935c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
936c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
937c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
938c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
939a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
940a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
941c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
94258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
943a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
944c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
945a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_io_handle_t input = openInput(module,
946a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &devices,
947a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &samplingRate,
948a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &format,
949a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &channelMask);
95072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) input);
951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
952c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
953c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
954a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(channelMask);
955c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
956c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
957c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
95972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
962c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_OUTPUT: {
96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
964c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t stream = data.readInt32();
96572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
966fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output));
96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
969f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
970f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
971f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
972f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
973f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
974f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
975342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
976342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
97772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
978e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten            size_t halFrames;
979e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten            size_t dspFrames;
980342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
981342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
982342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
983342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
984342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
985342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
986342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
987342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
98805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
98905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
99072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
99105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            reply->writeInt32(getInputFramesLost(ioHandle));
99205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
99305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
994be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
995be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
996be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(newAudioSessionId());
997be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
998be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
9993a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
10003a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
10013a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
10023a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            acquireAudioSessionId(audioSession);
10033a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
10043a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
10053a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
10063a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
10073a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
10083a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            releaseAudioSessionId(audioSession);
10093a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
10103a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1011be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1012be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1013be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            uint32_t numEffects;
1014be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1015be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1016be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1017be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1018be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1019be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1020be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1021ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1022be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1023be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1024ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1025be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1026be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1027be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1028be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1029be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1030be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1031be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1032be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1033be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1034be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1035be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1036be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1037be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1038be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1039be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1040be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1041be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1042be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1043be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1044be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1045be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1046be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
1047be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1048be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
104972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1050be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
1051be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status;
1052be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int id;
1053be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int enabled;
105405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
10558d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
105685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    &status, &id, &enabled);
1057be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1058be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1059be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
1060be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeStrongBinder(effect->asBinder());
1061be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1062be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1063be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1064de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1065de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1066de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
106772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
106872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1069de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1070de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1071de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1072a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1073a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1074a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1075a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1076a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1077cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1078cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1079cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1080cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1081cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1082cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1083cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1084cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputFrameCount());
1085cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1086cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
10874182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
10884182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
10894182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
10904182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
10914182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
10924182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
1101