IAudioFlinger.cpp revision d848eb48c121c119e8ba7583efc75415fe102570
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:
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    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,
107d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                audio_session_t *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);
131d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        audio_session_t 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            }
149d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            lSessionId = (audio_session_t) 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,
183d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                audio_session_t *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);
203d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        audio_session_t 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            }
223d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            lSessionId = (audio_session_t) 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
2682c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2722c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
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
2862c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual size_t frameCount(audio_io_handle_t ioHandle) const
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2902c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
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
615eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
619eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten        data.writeInt32((int32_t) use);
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
621de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent        audio_unique_id_t id = AUDIO_SESSION_ALLOCATE;
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
628d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
6293a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6303a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6323a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
633d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
6353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
637d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
6383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
642d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
6443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
646f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
6589d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
664f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
671ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
672ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
683be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6845e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
685f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
695be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
7058d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
70972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
710d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                    audio_session_t sessionId,
711be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                    const String16& opPackageName,
712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
713be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
718be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
720e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
721507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
722e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
723e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
724e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
726be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
72806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
729be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
73072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
731be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
732be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
733be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
734be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
735be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
73629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
738be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
739be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
740507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
741be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
742be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
743be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
744a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
745be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
746be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
747be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
748be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
749be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
750507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
751be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
752be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
753be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
754be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
755be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
756de070137f11d346fba77605bd76a44c040a618fcEric Laurent
757d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
75872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
759de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
760de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
761de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
762de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
76372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
76472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
765de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
766de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
767de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
768a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
769a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
770a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
771a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
772a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
773a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
774a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
775a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
776a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
777cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7783b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
779cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
780cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
781cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
782cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
783cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
784cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
785cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
786e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
787cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
788cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
789cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
790cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
791e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
792cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
793cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7944182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
7954182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7964182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7974182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7984182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
7994182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
8004182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
8014182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
8664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
8674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
8694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
8744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
8754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
8804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
8814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
8844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
8864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
8914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
8924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
89793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
89893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
89993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
90093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
90193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
90293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply);
90393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
90493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
90593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
90693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
90793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
90872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    virtual status_t systemReady()
90972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    {
91072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        Parcel data, reply;
91172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
91272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
91372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    }
91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
923e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
92489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
92858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
929dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
930e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
931a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
9323d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            bool haveSharedBuffer = data.readInt32() != 0;
9333d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IMemory> buffer;
9343d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if (haveSharedBuffer) {
9353d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                buffer = interface_cast<IMemory>(data.readStrongBinder());
9363d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
93772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
9383acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
939d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
940462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            int clientUid = data.readInt32();
941983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
9423d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IAudioTrack> track;
9433d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if ((haveSharedBuffer && (buffer == 0)) ||
9443d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                    ((buffer != 0) && (buffer->pointer() == NULL))) {
9453d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
9463d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                status = DEAD_OBJECT;
9473d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            } else {
9483d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                track = createTrack(
9493d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                        (audio_stream_type_t) streamType, sampleRate, format,
95074935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                        channelMask, &frameCount, &flags, buffer, output, tid,
951c5a17425986b4ce3384e6956762c86018b49c4a0Glenn Kasten                        &sessionId, clientUid, &status);
9520cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
9533d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
954b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
955e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            reply->writeInt32(flags);
956be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
95806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(track));
95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
96372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
96558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
966dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
967be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16& opPackageName = data.readString16();
968e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
969a075db4ff9b086ac2885df77bb6da0869293df92Glenn Kasten            track_flags_t flags = (track_flags_t) data.readInt32();
9701879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
9714cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi            int clientUid = data.readInt32();
972d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
9737410591dad836434c72ddee66680802708b70c10Glenn Kasten            size_t notificationFrames = data.readInt64();
974d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> cblk;
975d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> buffers;
976983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
9778d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IAudioRecord> record = openRecord(input,
978be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                    sampleRate, format, channelMask, opPackageName, &frameCount, &flags, tid,
9794cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi                    clientUid, &sessionId, &notificationFrames, cblk, buffers, &status);
980e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
981b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
982eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            reply->writeInt32(flags);
983be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
9847df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            reply->writeInt64(notificationFrames);
98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
98606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(record));
98706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(cblk));
98806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(buffers));
98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
99489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1003e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1011e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1034c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
103572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1036fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1042fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1048fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1049fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1055fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1060f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1075c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1078c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1079c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1081e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1082c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1083c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
108472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1085c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1088e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
109285ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
109385ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
110058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1101dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1102e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
110389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1105c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1107a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1108e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1109e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1110e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1111e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1112a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1113cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
11140ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1115983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t latencyMs = 0;
11164cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1117cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1118cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
11197074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1120cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1122cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1123cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1124cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1125cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1126cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1127c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1128c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1129c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
113272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
113372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1139c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
114372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
114872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1151c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1153a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1154cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1155e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1156e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1157e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1158e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1159cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1160cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1161cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1162ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1163c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1164cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1165cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1166cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1167cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1168cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1169cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1170cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1171cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1173c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1174c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
117589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
117672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
117789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
117889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1179d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
118089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1181d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1182d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
118489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1185f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1186f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1187f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1188f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1189f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1190f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1191342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1192342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
119372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1194983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t halFrames = 0;
1195983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t dspFrames = 0;
1196342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1197342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1198342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1199342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1200342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1201342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1202342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1203342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
120405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
120505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
120672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
12075f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
120805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
120905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
1211be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1212eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1214be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
12153a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
12163a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1217d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1218d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1219d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
12203a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12213a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
12223a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
12233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1224d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1225d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1226d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
12273a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1229be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1230be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1231983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t numEffects = 0;
1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1238be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1239ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1240be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1241983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1242ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1246be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1247be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1249be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1250be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1251be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1252be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1253983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1259be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1261be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1262be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1263e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            effect_descriptor_t desc = {};
1264e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1265e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1266e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1267be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1268be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
126972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1270d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
1271be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1272983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
1273983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int id = 0;
1274983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int enabled = 0;
127505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
12768d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1277be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                    opPackageName, &status, &id, &enabled);
1278be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1279be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1280be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
128106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(effect));
1282be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1283be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1284be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1285de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1286de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1287d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t session = (audio_session_t) data.readInt32();
128872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
128972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1290de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1291de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1292de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1293a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1294a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1295a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1296a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1297a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1298cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1299cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1300cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1301cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1302cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1303cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1304cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1305e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1306cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1307cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
13084182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
13094182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
13104182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
13114182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
13124182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
13134182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
13144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
13154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1316f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPortsReq = data.readInt32();
1317f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1318f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
1319f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1320f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPorts = numPortsReq;
13214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
1322f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_port *)calloc(numPortsReq,
13234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
1324f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (ports == NULL) {
1325f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1326f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1327f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1328f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1329f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPorts(&numPorts, ports);
13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1331f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPorts);
13324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPortsReq > numPorts) {
1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPortsReq = numPorts;
1335f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1336f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
13374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
13394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
13424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1343e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1344e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1345e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1346e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
13484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
13514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
13574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1358e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_patch_handle_t handle = {};
1359e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1360e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1361e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
13664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
13704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
13734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
13744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
13784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1379f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatchesReq = data.readInt32();
1380f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1381f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
1382f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1383f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatches = numPatchesReq;
13844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
1385f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
13864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
1387f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (patches == NULL) {
1388f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1389f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1390f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1391f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1392f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPatches(&numPatches, patches);
13934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1394f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPatches);
13954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1396f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPatchesReq > numPatches) {
1397f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPatchesReq = numPatches;
1398f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1399f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
14004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
14024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
141293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        case GET_AUDIO_HW_SYNC: {
141393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1414d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
141593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
141693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
141772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        case SYSTEM_READY: {
141872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
141972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            systemReady();
142072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            return NO_ERROR;
142172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        } break;
142289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
142389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
142489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
142589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
142689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
142789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
142889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
142940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1430