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,
61d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    INVALIDATE_STREAM,
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,
774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PORTS,
784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    GET_AUDIO_PORT,
794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    CREATE_AUDIO_PATCH,
804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    RELEASE_AUDIO_PATCH,
814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PATCHES,
8293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    SET_AUDIO_PORT_CONFIG,
8393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    GET_AUDIO_HW_SYNC
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
95fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                audio_stream_type_t streamType,
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
9758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
98dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten                                audio_channel_mask_t channelMask,
9974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
100e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                                track_flags_t *flags,
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
10272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t output,
1033acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                                pid_t tid,
104be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
105462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                int clientUid,
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1095841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
111fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) streamType);
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1140d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
11574935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
116e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(frameCount);
117b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
118e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        data.writeInt32(lFlags);
1192301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // haveSharedBuffer
1203d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        if (sharedBuffer != 0) {
1213d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(true);
1223d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeStrongBinder(sharedBuffer->asBinder());
1233d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        } else {
1243d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(false);
1253d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        }
12672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
1273acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        data.writeInt32((int32_t) tid);
128aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten        int lSessionId = AUDIO_SESSION_ALLOCATE;
129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
131be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
132be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
133462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        data.writeInt32(clientUid);
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
13629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createTrack error: %s", strerror(-lStatus));
1375841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
138b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            frameCount = reply.readInt64();
13974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
14074935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
14174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
142e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            lFlags = reply.readInt32();
143e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            if (flags != NULL) {
144e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                *flags = lFlags;
145e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            }
146be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
147be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
148be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1505841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1515841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
1520cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            if (lStatus == NO_ERROR) {
1530cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track == 0) {
1540cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack should have returned an IAudioTrack");
1550cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
1560cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1570cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            } else {
1580cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track != 0) {
1590cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus);
1600cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    track.clear();
1610cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1620cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            }
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
164507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1675841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
17172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t input,
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
17358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
17428b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                audio_channel_mask_t channelMask,
17574935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
176eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                                track_flags_t *flags,
1771879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten                                pid_t tid,
178be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
1797df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                                size_t *notificationFrames,
180d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& cblk,
181d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& buffers,
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1855841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
18772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) input);
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1900d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
19174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
192e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(frameCount);
193eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
194eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        data.writeInt32(lFlags);
1951879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        data.writeInt32((int32_t) tid);
196aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten        int lSessionId = AUDIO_SESSION_ALLOCATE;
197be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
198be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
199be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
200be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
2017410591dad836434c72ddee66680802708b70c10Glenn Kasten        data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0);
202d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        cblk.clear();
203d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        buffers.clear();
2045841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
2055841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
20629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("openRecord error: %s", strerror(-lStatus));
2075841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
208b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            frameCount = reply.readInt64();
20974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
21074935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
21174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
212eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            lFlags = reply.readInt32();
213eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            if (flags != NULL) {
214eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                *flags = lFlags;
215eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            }
216be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
217be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
218be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
2207df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            size_t lNotificationFrames = (size_t) reply.readInt64();
2217df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            if (notificationFrames != NULL) {
2227df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                *notificationFrames = lNotificationFrames;
2237df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            }
2245841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
2255841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
226d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            cblk = interface_cast<IMemory>(reply.readStrongBinder());
227d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (cblk != 0 && cblk->pointer() == NULL) {
228d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
229d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
230d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            buffers = interface_cast<IMemory>(reply.readStrongBinder());
231d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (buffers != 0 && buffers->pointer() == NULL) {
232d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
233d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
234e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            if (lStatus == NO_ERROR) {
235e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                if (record == 0) {
236e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    ALOGE("openRecord should have returned an IAudioRecord");
237e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
238d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                } else if (cblk == 0) {
239d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord should have returned a cblk");
240d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    lStatus = NO_MEMORY;
241e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
242d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                // buffers is permitted to be 0
243e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            } else {
244d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                if (record != 0 || cblk != 0 || buffers != 0) {
245d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord returned an IAudioRecord, cblk, "
246d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                          "or buffers but with status %d", lStatus);
247e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
248e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            }
249d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (lStatus != NO_ERROR) {
250d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                record.clear();
251d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
252d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
253d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
2545841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
255507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
2585841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t output) const
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
26572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
27472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
27658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual size_t frameCount(audio_io_handle_t output) const
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
28372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
285e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
33272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
336fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
33872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
343fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
347fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
357fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
35872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
363fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
367fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
372f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
39872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
40272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
40872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
414c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
415c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
416c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
417c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
418c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(client->asBinder());
423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
426dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
427dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
429c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
433dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
435e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_io_handle_t *output,
440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_config_t *config,
441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_devices_t *devices,
442cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                const String8& address,
443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                uint32_t *latencyMs,
444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_output_flags_t flags)
44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
447cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
448cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
451a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
452cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*devices);
454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
45518868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
460507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
465507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
467cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGV("openOutput() returned output, %d", *output);
468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
469cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *devices = (audio_devices_t)reply.readInt32();
470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *latencyMs = reply.readInt32();
471cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
472c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
47472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
47572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
476c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
478c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
47972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
48072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
481c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
48272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
483c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
484c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
48572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
487c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
488c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
48972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
49872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
499c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
502c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
50372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
50772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
508c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
509c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
511c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
512cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openInput(audio_module_handle_t module,
513cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_io_handle_t *input,
514cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_config_t *config,
515cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_devices_t *device,
516cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               const String8& address,
517cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_source_t source,
518cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_input_flags_t flags)
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
520cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (input == NULL || config == NULL || device == NULL) {
521cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
522cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
525a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
526cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*input);
527cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
528cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*device);
529cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
530cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(source);
531ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten        data.writeInt32(flags);
532cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
533cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
534cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
535cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
536507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
537cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
538cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
539cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
540cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
541507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
542cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
543cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
544cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *device = (audio_devices_t)reply.readInt32();
545cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
547c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
548fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
552fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
553c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
554c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
557d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    virtual status_t invalidateStream(audio_stream_type_t stream)
55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
561fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
562d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        remote()->transact(INVALIDATE_STREAM, data, &reply);
563c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
565f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
566f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
567f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
568f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
569f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
570f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
571f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
572f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
573f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
574342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
575377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
57672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
577342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
578342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
579342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
58072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
581342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
582342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
583342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
584342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
585507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
586342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
587342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
588342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
589507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
590342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
591342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
592342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
593342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
594342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
59505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
5965f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
59705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
59805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
59905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
60072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
6015f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
6025f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
6035f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
6045f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
6055f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
60605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
608de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent    virtual audio_unique_id_t newAudioUniqueId()
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
613de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent        audio_unique_id_t id = AUDIO_SESSION_ALLOCATE;
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
620d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    virtual void acquireAudioSessionId(int audioSession, int pid)
6213a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6223a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6243a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
625d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6263a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
6273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
629d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    virtual void releaseAudioSessionId(int audioSession, int pid)
6303a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6323a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
634d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
6363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
638f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
6509d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
656f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
663ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
664ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6765e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
677f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
683be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
684be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
695be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6978d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
70172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int sessionId,
703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
711e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
712507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
713e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
714e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
715e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
718be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeStrongBinder(client->asBinder());
720be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
72172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
722be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
72629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
729be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
730507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
731be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
732be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
733be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
734a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
735be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
736be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
738be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
739be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
740507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
741be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
742be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
743be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
744be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
745be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
746de070137f11d346fba77605bd76a44c040a618fcEric Laurent
74772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
74872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
749de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
750de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
751de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
752de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
75372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
75472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
755de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
756de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
757de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
758a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
759a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
760a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
761a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
762a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
763a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
764a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
765a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
766a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
767cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7683b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
769cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
770cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
771cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
772cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
773cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
774cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
775cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
776e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
777cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
778cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
779cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
780cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
781e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
782cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
783cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7844182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
7854182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7864182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7874182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7884182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
7894182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
7904182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
7914182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
8654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
8704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
8714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
8744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
8764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
8814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
8824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
88793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
88893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
88993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
89093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
89193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
89293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply);
89393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
89493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
89593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
89693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
89793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
907e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
91258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
913dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
914e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
915a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
9163d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            bool haveSharedBuffer = data.readInt32() != 0;
9173d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IMemory> buffer;
9183d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if (haveSharedBuffer) {
9193d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                buffer = interface_cast<IMemory>(data.readStrongBinder());
9203d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
92172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
9223acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
923be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
924462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            int clientUid = data.readInt32();
92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
9263d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IAudioTrack> track;
9273d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if ((haveSharedBuffer && (buffer == 0)) ||
9283d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                    ((buffer != 0) && (buffer->pointer() == NULL))) {
9293d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
9303d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                status = DEAD_OBJECT;
9313d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            } else {
9323d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                track = createTrack(
9333d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                        (audio_stream_type_t) streamType, sampleRate, format,
93474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                        channelMask, &frameCount, &flags, buffer, output, tid,
935c5a17425986b4ce3384e6956762c86018b49c4a0Glenn Kasten                        &sessionId, clientUid, &status);
9360cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
9373d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
938b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
939e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            reply->writeInt32(flags);
940be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
94689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
94772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
94958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
950dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
951e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
952a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
9531879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
9557410591dad836434c72ddee66680802708b70c10Glenn Kasten            size_t notificationFrames = data.readInt64();
956d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> cblk;
957d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> buffers;
95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
9598d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IAudioRecord> record = openRecord(input,
960d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    sampleRate, format, channelMask, &frameCount, &flags, tid, &sessionId,
9617df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                    &notificationFrames,
962d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    cblk, buffers, &status);
963e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
964b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
965eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            reply->writeInt32(flags);
966be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
9677df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            reply->writeInt64(notificationFrames);
96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
970d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            reply->writeStrongBinder(cblk->asBinder());
971d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            reply->writeStrongBinder(buffers->asBinder());
97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
97672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
98172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
986e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
994e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1017c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
101872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1019fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1025fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1031fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1032fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1038fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1043f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1058c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1061c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1062c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1064e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1065c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1066c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
106772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1068c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1069c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1070c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1071e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1072c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
107685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
108358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1084dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1085e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1090a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1091cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_config_t config;
1092cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            data.read(&config, sizeof(audio_config_t));
1093a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1094cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
10950ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1096cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            uint32_t latencyMs;
1097cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t output;
1098cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1099cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
11007074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1101cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1102cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1103cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1104cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1105cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1106cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1107cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1108c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1109c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
111272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
111372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
111472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1116c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1118c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
111972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1120c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1121c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1122c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
112472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
112972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1134a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1135cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1136cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_config_t config;
1137cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            data.read(&config, sizeof(audio_config_t));
1138cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1139cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1140cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1141ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1143cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1144cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1145cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1146cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1147cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1148cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1149cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1150cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
115572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
115689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
115789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1158d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1160d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1161d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
116289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
116389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1164f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1165f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1166f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1167f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1168f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1169f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1170342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1171342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
117272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1173377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            uint32_t halFrames;
1174377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            uint32_t dspFrames;
1175342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1176342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1177342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1178342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1179342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1180342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1181342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1182342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
118305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
118405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
118572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
11865f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
118705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
118805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
1189be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
1190be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1191de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent            reply->writeInt32(newAudioUniqueId());
1192be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1193be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
11943a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
11953a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
11963a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
1197d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1198d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
11993a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12003a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
12013a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
12023a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
12033a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
1204d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1205d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
12063a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12073a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1208be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            uint32_t numEffects;
1211be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1214be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1215be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1216be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1217be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1218ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1220be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1221ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1222be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1223be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1224be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1225be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1226be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1227be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1228be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1229be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1230be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1231be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1238be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1239be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1240be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1241be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
124672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1247be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status;
1249be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int id;
1250be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int enabled;
125105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
12528d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
125385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    &status, &id, &enabled);
1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeStrongBinder(effect->asBinder());
1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1259be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1261de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1262de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1263de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
126472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
126572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1266de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1267de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1268de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1269a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1270a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1271a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1272a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1273a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1274cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1275cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1276cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1277cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1278cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1279cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1280cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1281e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1282cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1283cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
12844182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
12854182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
12864182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
12874182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
12884182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
12894182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
12904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
12914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
12924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            unsigned int num_ports = data.readInt32();
12934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
12944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                    (struct audio_port *)calloc(num_ports,
12954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
12964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = listAudioPorts(&num_ports, ports);
12974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
12984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
12994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->writeInt32(num_ports);
13004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&ports, num_ports * sizeof(struct audio_port));
13014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
13034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
13064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port port;
13084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&port, sizeof(struct audio_port));
13094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
13104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
13134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
13174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
13194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
13204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
13214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
13224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
13234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
13264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
13324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
13334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
13344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            unsigned int num_patches = data.readInt32();
13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
13414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                    (struct audio_patch *)calloc(num_patches,
13424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
13434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = listAudioPatches(&num_patches, patches);
13444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->writeInt32(num_patches);
13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&patches, num_patches * sizeof(struct audio_patch));
13484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
13574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
136093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        case GET_AUDIO_HW_SYNC: {
136193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
136293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            reply->writeInt32(getAudioHwSyncForSession((audio_session_t)data.readInt32()));
136393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
136493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
136589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
136689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
136789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
136889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
136989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
137089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
137189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
137289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
1373