IAudioFlinger.cpp revision 090ef604f81447eab4aa0a5b45d6307482573560
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger"
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioFlinger.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OPEN_RECORD,
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SAMPLE_RATE,
355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten    RESERVED,   // obsolete, was CHANNEL_COUNT
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
61d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    INVALIDATE_STREAM,
62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    NEW_AUDIO_SESSION_ID,
663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    ACQUIRE_AUDIO_SESSION_ID,
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    RELEASE_AUDIO_SESSION_ID,
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent    CREATE_EFFECT,
72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    MOVE_EFFECTS,
73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    LOAD_HW_MODULE,
74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_FRAME_COUNT,
764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    SET_LOW_RAM_DEVICE,
774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PORTS,
784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    GET_AUDIO_PORT,
794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    CREATE_AUDIO_PATCH,
804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    RELEASE_AUDIO_PATCH,
814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PATCHES,
8293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    SET_AUDIO_PORT_CONFIG,
8372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    GET_AUDIO_HW_SYNC,
8472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    SYSTEM_READY
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
87f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024
88f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
92090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioFlinger(const sp<IBinder>& impl)
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
98fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                audio_stream_type_t streamType,
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
10058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
101dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten                                audio_channel_mask_t channelMask,
10274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
103e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                                track_flags_t *flags,
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
10572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t output,
1063acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                                pid_t tid,
107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
108462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                int clientUid,
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1125841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
114fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) streamType);
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1170d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
11874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
119e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(frameCount);
120b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
121e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        data.writeInt32(lFlags);
1222301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // haveSharedBuffer
1233d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        if (sharedBuffer != 0) {
1243d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(true);
12506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(sharedBuffer));
1263d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        } else {
1273d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(false);
1283d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        }
12972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
1303acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        data.writeInt32((int32_t) tid);
131aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten        int lSessionId = AUDIO_SESSION_ALLOCATE;
132be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
133be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
134be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
135be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
136462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        data.writeInt32(clientUid);
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
13929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createTrack error: %s", strerror(-lStatus));
1405841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
141b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            frameCount = reply.readInt64();
14274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
14374935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
14474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
145e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            lFlags = reply.readInt32();
146e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            if (flags != NULL) {
147e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                *flags = lFlags;
148e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            }
149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
150be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
151be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1535841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1545841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
1550cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            if (lStatus == NO_ERROR) {
1560cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track == 0) {
1570cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack should have returned an IAudioTrack");
1580cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
1590cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1600cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            } else {
1610cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track != 0) {
1620cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus);
1630cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    track.clear();
1640cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1650cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            }
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
167507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1705841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
17472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t input,
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
17658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
17728b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                audio_channel_mask_t channelMask,
178be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                const String16& opPackageName,
17974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
180eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                                track_flags_t *flags,
1811879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten                                pid_t tid,
1824cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi                                int clientUid,
183be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int *sessionId,
1847df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                                size_t *notificationFrames,
185d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& cblk,
186d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& buffers,
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status)
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1905841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) input);
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1950d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
196eaa34703cb5f1acedb20cbcdff1ab79c11ff6857Dianne Hackborn        data.writeString16(opPackageName);
19774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
198e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(frameCount);
199eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT;
200eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        data.writeInt32(lFlags);
2011879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        data.writeInt32((int32_t) tid);
2024cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi        data.writeInt32((int32_t) clientUid);
203aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten        int lSessionId = AUDIO_SESSION_ALLOCATE;
204be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
205be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
206be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
2087410591dad836434c72ddee66680802708b70c10Glenn Kasten        data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0);
209d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        cblk.clear();
210d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        buffers.clear();
2115841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
2125841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
21329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("openRecord error: %s", strerror(-lStatus));
2145841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
215b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            frameCount = reply.readInt64();
21674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
21774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
21874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
219eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            lFlags = reply.readInt32();
220eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            if (flags != NULL) {
221eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                *flags = lFlags;
222eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            }
223be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = reply.readInt32();
224be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
225be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
226be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
2277df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            size_t lNotificationFrames = (size_t) reply.readInt64();
2287df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            if (notificationFrames != NULL) {
2297df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                *notificationFrames = lNotificationFrames;
2307df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            }
2315841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
2325841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
233d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            cblk = interface_cast<IMemory>(reply.readStrongBinder());
234d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (cblk != 0 && cblk->pointer() == NULL) {
235d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
236d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
237d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            buffers = interface_cast<IMemory>(reply.readStrongBinder());
238d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (buffers != 0 && buffers->pointer() == NULL) {
239d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
240d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
241e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            if (lStatus == NO_ERROR) {
242e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                if (record == 0) {
243e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    ALOGE("openRecord should have returned an IAudioRecord");
244e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
245d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                } else if (cblk == 0) {
246d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord should have returned a cblk");
247d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    lStatus = NO_MEMORY;
248e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
249d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                // buffers is permitted to be 0
250e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            } else {
251d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                if (record != 0 || cblk != 0 || buffers != 0) {
252d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord returned an IAudioRecord, cblk, "
253d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                          "or buffers but with status %d", lStatus);
254e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
255e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            }
256d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (lStatus != NO_ERROR) {
257d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                record.clear();
258d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
259d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
260d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
2615841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
262507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
2655841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t output) const
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
27272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
28172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
28358f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual size_t frameCount(audio_io_handle_t output) const
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
292e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
33972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
343fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
34572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
350fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
354fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
36072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
364fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
36572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
370fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
374fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
379f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
40972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
423c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
426c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
42906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
433dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
434dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
440dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
442e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_io_handle_t *output,
447cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_config_t *config,
448cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_devices_t *devices,
449cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                const String8& address,
450cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                uint32_t *latencyMs,
451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_output_flags_t flags)
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
458a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*devices);
461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
46218868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
467507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
469cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
471cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
472507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
473cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
474cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGV("openOutput() returned output, %d", *output);
475cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
476cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *devices = (audio_devices_t)reply.readInt32();
477cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *latencyMs = reply.readInt32();
478cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
479c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
480c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
48172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
48272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
483c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
484c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
485c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
48672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
48772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
488c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
48972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
491c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
49272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
493c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
494c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
495c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
49672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
497c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
50572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
506c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
509c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
51072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
51472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
515c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
516c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
518c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
519cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openInput(audio_module_handle_t module,
520cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_io_handle_t *input,
521cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_config_t *config,
522cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_devices_t *device,
523cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               const String8& address,
524cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_source_t source,
525cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_input_flags_t flags)
52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
527cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (input == NULL || config == NULL || device == NULL) {
528cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
529cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
532a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
533cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*input);
534cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
535cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*device);
536cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
537cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(source);
538ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten        data.writeInt32(flags);
539cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
540cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
541cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
542cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
543507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
544cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
545cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
546cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
547cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
548507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
549cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
550cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
551cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *device = (audio_devices_t)reply.readInt32();
552cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
554c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
555fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
559fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
560c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
561c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
564d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    virtual status_t invalidateStream(audio_stream_type_t stream)
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
568fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
569d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        remote()->transact(INVALIDATE_STREAM, data, &reply);
570c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
572f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
573f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
574f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
575f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
576f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
577f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
578f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
579f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
580f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
581342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
582377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
58372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
584342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
585342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
586342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
58772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
588342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
589342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
590342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
591342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
592507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
593342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
594342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
595342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
596507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
597342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
598342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
599342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
600342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
601342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
60205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
6035f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
60405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
60505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
60605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
60772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
6085f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
6095f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
6105f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
6115f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
6125f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
61305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
615de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent    virtual audio_unique_id_t newAudioUniqueId()
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
620de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent        audio_unique_id_t id = AUDIO_SESSION_ALLOCATE;
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
627d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    virtual void acquireAudioSessionId(int audioSession, int pid)
6283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6293a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6303a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
632d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
6343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
636d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen    virtual void releaseAudioSessionId(int audioSession, int pid)
6373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
641d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
6433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
645f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
6579d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
663f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
670ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
671ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6835e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
684f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
695be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
7048d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
70872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int sessionId,
710be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                    const String16& opPackageName,
711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
713be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
718be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
719e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
720507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
721e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
722e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
723e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
726be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
72706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
72972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
730be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
731be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
732be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
733be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
734be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
73529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
736be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
738be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
739507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
740be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
741be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
742be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
743a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
744be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
745be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
746be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
747be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
748be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
749507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
750be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
751be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
752be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
753be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
754be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
755de070137f11d346fba77605bd76a44c040a618fcEric Laurent
75672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
75772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
758de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
759de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
760de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
761de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
76272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
76372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
764de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
765de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
766de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
767a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
768a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
769a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
770a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
771a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
772a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
773a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
774a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
775a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
776cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7773b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
778cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
779cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
780cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
781cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
782cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
783cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
784cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
785e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
786cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
787cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
788cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
789cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
790e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
791cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
792cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7934182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
7944182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7954182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7964182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7974182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
7984182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
7994182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
8004182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
8654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
8664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
8684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
8734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
8744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
8794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
8804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
8834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
8854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
8904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
8914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
89693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
89793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
89893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
89993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
90093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
90193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply);
90293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
90393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
90493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
90593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
90693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
90772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    virtual status_t systemReady()
90872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    {
90972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        Parcel data, reply;
91072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
91172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
91272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    }
91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
922e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
92489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
92758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
928dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
929e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
930a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
9313d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            bool haveSharedBuffer = data.readInt32() != 0;
9323d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IMemory> buffer;
9333d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if (haveSharedBuffer) {
9343d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                buffer = interface_cast<IMemory>(data.readStrongBinder());
9353d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
93672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
9373acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
938be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
939462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            int clientUid = data.readInt32();
940983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
9413d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IAudioTrack> track;
9423d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if ((haveSharedBuffer && (buffer == 0)) ||
9433d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                    ((buffer != 0) && (buffer->pointer() == NULL))) {
9443d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
9453d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                status = DEAD_OBJECT;
9463d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            } else {
9473d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                track = createTrack(
9483d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                        (audio_stream_type_t) streamType, sampleRate, format,
94974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                        channelMask, &frameCount, &flags, buffer, output, tid,
950c5a17425986b4ce3384e6956762c86018b49c4a0Glenn Kasten                        &sessionId, clientUid, &status);
9510cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
9523d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
953b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
954e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            reply->writeInt32(flags);
955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
95706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(track));
95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
96272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
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();
966be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16& opPackageName = data.readString16();
967e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
968a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
9691879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
9704cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi            int clientUid = data.readInt32();
971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
9727410591dad836434c72ddee66680802708b70c10Glenn Kasten            size_t notificationFrames = data.readInt64();
973d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> cblk;
974d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> buffers;
975983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
9768d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IAudioRecord> record = openRecord(input,
977be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                    sampleRate, format, channelMask, opPackageName, &frameCount, &flags, tid,
9784cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi                    clientUid, &sessionId, &notificationFrames, cblk, buffers, &status);
979e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
980b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
981eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            reply->writeInt32(flags);
982be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
9837df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            reply->writeInt64(notificationFrames);
98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
98506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(record));
98606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(cblk));
98706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(buffers));
98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1002e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1010e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1033c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
103472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1035fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1041fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1047fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1048fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1054fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1059f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1074c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1077c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1078c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1080e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1081c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1082c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
108372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1084c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1085c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1087e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
109185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
109285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
109958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1100dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1101e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
110389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1106a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1107e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1108e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1109e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1110e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1111a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1112cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
11130ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1114983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t latencyMs = 0;
11154cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1116cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1117cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
11187074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1119cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1120cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1122cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1123cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1124cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1125cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
113172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
113272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
114272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
114772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1152a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1153cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1154e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1155e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1156e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1157e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1158cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1159cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1160cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1161ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1163cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1164cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1165cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1166cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1167cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1168cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1169cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1170cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1173c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
117489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
117572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
117689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
117789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1178d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
117989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1180d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1181d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
118289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1184f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1185f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1186f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1187f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1188f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1189f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1190342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1191342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
119272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1193983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t halFrames = 0;
1194983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t dspFrames = 0;
1195342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1196342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1197342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1198342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1199342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1200342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1201342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1202342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
120305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
120405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
120572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
12065f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
120705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
120805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
1209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1211de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent            reply->writeInt32(newAudioUniqueId());
1212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
12143a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
12153a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
12163a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
1217d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1218d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
12193a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12203a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
12213a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
12223a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
12233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            int audioSession = data.readInt32();
1224d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1225d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
12263a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1228be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1229be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1230983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t numEffects = 0;
1231be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1238ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1239be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1240983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1241ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1246be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1247be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1249be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1250be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1251be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1252983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1253be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1259be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1261be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1262e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            effect_descriptor_t desc = {};
1263e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1264e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1265e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1267be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
126872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1269be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int sessionId = data.readInt32();
1270be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1271983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
1272983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int id = 0;
1273983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int enabled = 0;
127405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
12758d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1276be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                    opPackageName, &status, &id, &enabled);
1277be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1278be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1279be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
128006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(effect));
1281be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1282be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1283be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1284de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1285de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1286de070137f11d346fba77605bd76a44c040a618fcEric Laurent            int session = data.readInt32();
128772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
128872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1289de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1290de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1291de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1292a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1293a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1294a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1295a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1296a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1297cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1298cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1299cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1300cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1301cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1302cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1303cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1304e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1305cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1306cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
13074182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
13084182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
13094182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
13104182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
13114182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
13124182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
13134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
13144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1315f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPortsReq = data.readInt32();
1316f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1317f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
1318f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1319f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPorts = numPortsReq;
13204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
1321f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_port *)calloc(numPortsReq,
13224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
1323f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (ports == NULL) {
1324f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1325f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1326f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1327f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1328f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPorts(&numPorts, ports);
13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1330f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPorts);
13314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1332f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPortsReq > numPorts) {
1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPortsReq = numPorts;
1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1335f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
13364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
13414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1342e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1343e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1344e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1345e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1357e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_patch_handle_t handle = {};
1358e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1359e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1360e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
13694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
13734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
13774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1378f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatchesReq = data.readInt32();
1379f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1380f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
1381f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1382f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatches = numPatchesReq;
13834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
1384f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
13854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
1386f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (patches == NULL) {
1387f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1388f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1389f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1390f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1391f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPatches(&numPatches, patches);
13924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1393f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPatches);
13944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1395f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPatchesReq > numPatches) {
1396f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPatchesReq = numPatches;
1397f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1398f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
141193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        case GET_AUDIO_HW_SYNC: {
141293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
141393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            reply->writeInt32(getAudioHwSyncForSession((audio_session_t)data.readInt32()));
141493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
141593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
141672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        case SYSTEM_READY: {
141772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
141872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            systemReady();
141972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            return NO_ERROR;
142072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        } break;
142189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
142289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
142389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
142489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
142589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
142689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
142789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
142840bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1429