IAudioFlinger.cpp revision 7074296c72b3be919ebc9dfd504f4572a188d2e7
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger"
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OPEN_RECORD,
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SAMPLE_RATE,
355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten    RESERVED,   // obsolete, was CHANNEL_COUNT
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    SET_STREAM_OUTPUT,
62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    NEW_AUDIO_SESSION_ID,
663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    ACQUIRE_AUDIO_SESSION_ID,
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    RELEASE_AUDIO_SESSION_ID,
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent    CREATE_EFFECT,
72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    MOVE_EFFECTS,
73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    LOAD_HW_MODULE,
74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_FRAME_COUNT,
764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    SET_LOW_RAM_DEVICE,
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioFlinger(const sp<IBinder>& impl)
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
88fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                audio_stream_type_t streamType,
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
9058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
91dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten                                audio_channel_mask_t channelMask,
9274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
93e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                                track_flags_t *flags,
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
9572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t output,
963acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                                pid_t tid,
97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
98d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten                                String8& name,
99462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                int clientUid,
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1035841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
105fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) streamType);
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1080d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
10974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
111b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
112e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        data.writeInt32(lFlags);
1133d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        if (sharedBuffer != 0) {
1143d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(true);
1153d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeStrongBinder(sharedBuffer->asBinder());
1163d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        } else {
1173d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(false);
1183d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        }
11972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
1203acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        data.writeInt32((int32_t) tid);
121aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten        int lSessionId = AUDIO_SESSION_ALLOCATE;
122be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
123be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
124be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
125be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
126462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        data.writeInt32(clientUid);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
12929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createTrack error: %s", strerror(-lStatus));
1305841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
13174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            frameCount = reply.readInt32();
13274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
13374935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
13474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
135e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            lFlags = reply.readInt32();
136e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            if (flags != NULL) {
137e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                *flags = lFlags;
138e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            }
139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
140be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
141be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
142be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
143d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten            name = reply.readString8();
1445841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1455841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
1460cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            if (lStatus == NO_ERROR) {
1470cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track == 0) {
1480cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack should have returned an IAudioTrack");
1490cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
1500cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1510cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            } else {
1520cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track != 0) {
1530cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus);
1540cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    track.clear();
1550cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1560cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            }
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
158507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1615841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
16572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t input,
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
16758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
16828b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                audio_channel_mask_t channelMask,
16974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
170eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                                track_flags_t *flags,
1711879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten                                pid_t tid,
172be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1765841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
17872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) input);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1810d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
18274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(frameCount);
184eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
185eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        data.writeInt32(lFlags);
1861879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        data.writeInt32((int32_t) tid);
187aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten        int lSessionId = AUDIO_SESSION_ALLOCATE;
188be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
189be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
190be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
191be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
1925841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1935841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
19429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("openRecord error: %s", strerror(-lStatus));
1955841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
19674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            frameCount = reply.readInt32();
19774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
19874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
19974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
200eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            lFlags = reply.readInt32();
201eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            if (flags != NULL) {
202eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                *flags = lFlags;
203eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            }
204be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
205be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
206be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
2085841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
2095841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
210e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            if (lStatus == NO_ERROR) {
211e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                if (record == 0) {
212e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    ALOGE("openRecord should have returned an IAudioRecord");
213e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
214e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
215e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            } else {
216e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                if (record != 0) {
217e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    ALOGE("openRecord returned an IAudioRecord but with status %d", lStatus);
218e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    record.clear();
219e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
220e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            }
2215841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
222507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
2255841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t output) const
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
24358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual size_t frameCount(audio_io_handle_t output) const
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
25072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
25972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
29972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
303fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
30572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
310fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
314fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
324fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
32572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
330fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
334fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
339f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
36572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
36972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
371c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
37572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
37972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
380c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(client->asBinder());
390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
393dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
394dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
400dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
405a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_io_handle_t openOutput(audio_module_handle_t module,
406a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_devices_t *pDevices,
407a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         uint32_t *pSamplingRate,
408a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_format_t *pFormat,
409a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         audio_channel_mask_t *pChannelMask,
410a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                         uint32_t *pLatencyMs,
411ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                         audio_output_flags_t flags,
412ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                         const audio_offload_info_t *offloadInfo)
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
4157c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
4167c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
4177c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
4187c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_channel_mask_t channelMask = pChannelMask != NULL ?
4197c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten                *pChannelMask : (audio_channel_mask_t)0;
4207c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0;
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
422a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
426a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(channelMask);
427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(latency);
42818868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
429b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        if (offloadInfo == NULL) {
430b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(0);
431b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        } else {
432b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.writeInt32(1);
433b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            data.write(offloadInfo, sizeof(audio_offload_info_t));
434b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald        }
435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_OUTPUT, data, &reply);
43672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        audio_io_handle_t output = (audio_io_handle_t) reply.readInt32();
43772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        ALOGV("openOutput() returned output, %d", output);
438a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        devices = (audio_devices_t)reply.readInt32();
439507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pDevices != NULL) {
440507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pDevices = devices;
441507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
443507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pSamplingRate != NULL) {
444507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pSamplingRate = samplingRate;
445507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
44658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        format = (audio_format_t) reply.readInt32();
447507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pFormat != NULL) {
448507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pFormat = format;
449507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
450a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        channelMask = (audio_channel_mask_t)reply.readInt32();
451507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pChannelMask != NULL) {
452507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pChannelMask = channelMask;
453507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        latency = reply.readInt32();
455507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pLatencyMs != NULL) {
456507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pLatencyMs = latency;
457507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return output;
459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
46172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
46272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
463c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
465c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
46672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
46772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
468c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
46972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
470c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
471c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
47272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
473c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
474c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
475c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
47672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
48572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
489c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
49072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
49472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
495c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
496c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
498c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
499a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_io_handle_t openInput(audio_module_handle_t module,
500a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_devices_t *pDevices,
501a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        uint32_t *pSamplingRate,
502a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_format_t *pFormat,
503a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                        audio_channel_mask_t *pChannelMask)
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
5067c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_devices_t devices = pDevices != NULL ? *pDevices : (audio_devices_t)0;
5077c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0;
5087c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT;
5097c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten        audio_channel_mask_t channelMask = pChannelMask != NULL ?
5107c5977f0322204240b3d1874a44c1f3911275ae5Glenn Kasten                *pChannelMask : (audio_channel_mask_t)0;
511c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
513a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
514c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(devices);
515c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(samplingRate);
51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
517a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(channelMask);
518c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_INPUT, data, &reply);
51972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        audio_io_handle_t input = (audio_io_handle_t) reply.readInt32();
520a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        devices = (audio_devices_t)reply.readInt32();
521507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pDevices != NULL) {
522507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pDevices = devices;
523507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
524c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        samplingRate = reply.readInt32();
525507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pSamplingRate != NULL) {
526507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pSamplingRate = samplingRate;
527507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
52858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        format = (audio_format_t) reply.readInt32();
529507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pFormat != NULL) {
530507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pFormat = format;
531507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
532a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        channelMask = (audio_channel_mask_t)reply.readInt32();
533507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (pChannelMask != NULL) {
534507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            *pChannelMask = channelMask;
535507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
536c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return input;
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
538c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
539fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
543fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
544c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
545c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output)
54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
552fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
55372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
554c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
555c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
557f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
558f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
559f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
560f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
561f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
562f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
563f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
564f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
565f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
566342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
567377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
56872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
569342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
570342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
571342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
57272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
573342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
574342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
575342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
576342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
577507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
578342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
579342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
580342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
581507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
582342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
583342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
584342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
585342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
586342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
58705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
5885f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
58905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
59005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
59105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
59272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
5935f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
5945f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
5955f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
5965f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
5975f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
59805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual int newAudioSessionId()
601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int id = 0;
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
612d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    virtual void acquireAudioSessionId(int audioSession, int pid)
6133a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6143a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6153a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6163a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
617d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6183a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
6193a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6203a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
621d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    virtual void releaseAudioSessionId(int audioSession, int pid)
6223a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6243a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6253a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
626d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
6283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6293a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
630f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
6429d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
648f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
655ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
656ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6685e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
669f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
683be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
684be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6898d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
69372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int sessionId,
695be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
703e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
704507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
705e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
706e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
707e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeStrongBinder(client->asBinder());
712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
71372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
71829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
720be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
721be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
722507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
726a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
729be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
730be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
731be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
732507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
733be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
734be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
735be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
736be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
738de070137f11d346fba77605bd76a44c040a618fcEric Laurent
73972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
74072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
741de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
742de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
743de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
744de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
74572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
74672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
747de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
748de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
749de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
750a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
751a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
752a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
753a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
754a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
755a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
756a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
757a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
758a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
759cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7603b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
761cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
762cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
763cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
764cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
765cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
766cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
767cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
768e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
769cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
770cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
771cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
772cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
773cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
774cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
775cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
7774182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7784182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7794182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7804182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
7814182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
7824182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
7834182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7844182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten
78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
794e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
79958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
800dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
801e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten            size_t frameCount = data.readInt32();
802a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
8033d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            bool haveSharedBuffer = data.readInt32() != 0;
8043d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IMemory> buffer;
8053d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if (haveSharedBuffer) {
8063d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                buffer = interface_cast<IMemory>(data.readStrongBinder());
8073d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
80872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
8093acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
810be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
811462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            int clientUid = data.readInt32();
812d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten            String8 name;
81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
8143d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IAudioTrack> track;
8153d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if ((haveSharedBuffer && (buffer == 0)) ||
8163d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                    ((buffer != 0) && (buffer->pointer() == NULL))) {
8173d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
8183d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                status = DEAD_OBJECT;
8193d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            } else {
8203d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                track = createTrack(
8213d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                        (audio_stream_type_t) streamType, sampleRate, format,
82274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                        channelMask, &frameCount, &flags, buffer, output, tid,
823462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                        &sessionId, name, clientUid, &status);
8240cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
8253d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
82674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            reply->writeInt32(frameCount);
827e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            reply->writeInt32(flags);
828be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
829d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten            reply->writeString8(name);
83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(track->asBinder());
83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
83672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
83858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
839dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
840e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten            size_t frameCount = data.readInt32();
841a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
8421879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
843be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            status_t status;
8458d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IAudioRecord> record = openRecord(input,
84674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                    sampleRate, format, channelMask, &frameCount, &flags, tid, &sessionId, &status);
847e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
84874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            reply->writeInt32(frameCount);
849eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            reply->writeInt32(flags);
850be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(record->asBinder());
85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
85772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
86272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
86772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) );
86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
87272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
875e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
89972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
900fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
906fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
91089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
912fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
913fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
919fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
924f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
93189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
93589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
939c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
94172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
942c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
943c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
945e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
946c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
947c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
94872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
949c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
950c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
951c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
952e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
953c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
95685ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
95785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
96458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
965dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
966dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) );
96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
969c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
970c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
971a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
972a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
973c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
97458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
975a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
976c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t latency = data.readInt32();
9770ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
978b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            bool hasOffloadInfo = data.readInt32() != 0;
979b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            audio_offload_info_t offloadInfo;
980b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            if (hasOffloadInfo) {
981b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                data.read(&offloadInfo, sizeof(audio_offload_info_t));
982b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald            }
983a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_io_handle_t output = openOutput(module,
984a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &devices,
985a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &samplingRate,
986a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &format,
987a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &channelMask,
988a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                                 &latency,
989b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 flags,
990b1a270d1e926fb9a01b4265a7675ed0c2c8f4868Richard Fitzgerald                                                 hasOffloadInfo ? &offloadInfo : NULL);
9917074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
99272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) output);
993c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
994c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
995c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
996a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(channelMask);
997c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(latency);
998c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
999c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1000c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1001c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
100272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
100372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
100472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1005c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1006c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1007c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1008c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
100972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1010c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1011c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1012c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1013c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
101472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1015c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1016c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1017c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1018c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
101972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1020c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1021c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1022c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1023c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1024a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1025a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1026c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t samplingRate = data.readInt32();
102758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1028a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
1029c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1030a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_io_handle_t input = openInput(module,
1031a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &devices,
1032a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &samplingRate,
1033a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &format,
1034a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent                                             &channelMask);
103572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) input);
1036c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(devices);
1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(samplingRate);
1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(format);
1039a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(channelMask);
1040c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1041c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1042c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1047c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_STREAM_OUTPUT: {
104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1049c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            uint32_t stream = data.readInt32();
105072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1051fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output));
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1054f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1055f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1056f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1057f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1058f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1059f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1060342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1061342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
106272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1063377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            uint32_t halFrames;
1064377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            uint32_t dspFrames;
1065342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1066342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1067342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1068342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1069342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1070342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1071342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1072342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
107305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
107405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
107572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
10765f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
107705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
107805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
1079be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
1080be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1081be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(newAudioSessionId());
1082be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1083be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
10843a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
10853a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
10863a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
1087d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1088d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
10893a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
10903a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
10913a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
10923a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
10933a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
1094d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1095d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
10963a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
10973a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1098be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1099be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1100be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            uint32_t numEffects;
1101be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1102be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1103be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1104be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1105be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1106be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1108ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1111ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1113be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1121be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1122be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1123be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1124be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1125be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1126be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1127be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1128be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1131be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1132be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_descriptor_t desc;
1133be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&desc, sizeof(effect_descriptor_t));
1134be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1135be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
113672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1137be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
1138be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status;
1139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int id;
1140be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int enabled;
114105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
11428d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
114385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    &status, &id, &enabled);
1144be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1145be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1146be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
1147be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeStrongBinder(effect->asBinder());
1148be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1150be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1151de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1152de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1153de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
115472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
115572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1156de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1157de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1158de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1159a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1160a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1161a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1162a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1163a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1164cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1165cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1166cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1167cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1168cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1169cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1170cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1171cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputFrameCount());
1172cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1173cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
11744182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
11754182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
11764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
11774182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
11784182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
11794182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
118089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
118189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
118289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
118489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
118589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
118689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
118789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
1188