IAudioFlinger.cpp revision 25a9e5561a7f14e79b04f713a515a9464b9ea077
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
2725a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "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,
844a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    SYSTEM_READY,
854a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    FRAME_COUNT_HAL,
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
88f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024
89f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
93090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioFlinger(const sp<IBinder>& impl)
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
99fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                audio_stream_type_t streamType,
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
10158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
102dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten                                audio_channel_mask_t channelMask,
10374935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
104050677873c10d4da308ac222f8533c96cca3207eEric Laurent                                audio_output_flags_t *flags,
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
10672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t output,
1079ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                                pid_t pid,
1083acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                                pid_t tid,
109d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                audio_session_t *sessionId,
110462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                int clientUid,
11120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                status_t *status,
11220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                audio_port_handle_t portId)
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1155841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
117fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) streamType);
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1200d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
12174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
122e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(frameCount);
123050677873c10d4da308ac222f8533c96cca3207eEric Laurent        audio_output_flags_t lFlags = flags != NULL ? *flags : AUDIO_OUTPUT_FLAG_NONE;
124e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        data.writeInt32(lFlags);
1252301acc6a9c7a3af4ad01f3d1d0f76f13eca7350Glenn Kasten        // haveSharedBuffer
1263d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        if (sharedBuffer != 0) {
1273d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(true);
12806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(sharedBuffer));
1293d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        } else {
1303d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            data.writeInt32(false);
1313d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent        }
13272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
1339ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George        data.writeInt32((int32_t) pid);
1343acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten        data.writeInt32((int32_t) tid);
135d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE;
136be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
137be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
138be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
139be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
140462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen        data.writeInt32(clientUid);
14120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        data.writeInt32(portId);
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
14429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createTrack error: %s", strerror(-lStatus));
1455841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
146b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            frameCount = reply.readInt64();
14774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
14874935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
14974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
150050677873c10d4da308ac222f8533c96cca3207eEric Laurent            lFlags = (audio_output_flags_t)reply.readInt32();
151e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            if (flags != NULL) {
152e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                *flags = lFlags;
153e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            }
154d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            lSessionId = (audio_session_t) reply.readInt32();
155be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
156be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
157be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1585841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
1595841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
1600cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            if (lStatus == NO_ERROR) {
1610cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track == 0) {
1620cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack should have returned an IAudioTrack");
1630cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
1640cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1650cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            } else {
1660cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                if (track != 0) {
1670cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus);
1680cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                    track.clear();
1690cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                }
1700cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten            }
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
172507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
1755841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
17972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t input,
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
18158f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
18228b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                audio_channel_mask_t channelMask,
183be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                const String16& opPackageName,
18474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
185050677873c10d4da308ac222f8533c96cca3207eEric Laurent                                audio_input_flags_t *flags,
1869ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                                pid_t pid,
1871879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten                                pid_t tid,
1884cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi                                int clientUid,
189d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                audio_session_t *sessionId,
1907df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                                size_t *notificationFrames,
191d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& cblk,
192d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& buffers,
19320b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                status_t *status,
19420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                audio_port_handle_t portId)
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1975841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioRecord> record;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) input);
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
2020d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
203eaa34703cb5f1acedb20cbcdff1ab79c11ff6857Dianne Hackborn        data.writeString16(opPackageName);
20474935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
205e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(frameCount);
206050677873c10d4da308ac222f8533c96cca3207eEric Laurent        audio_input_flags_t lFlags = flags != NULL ? *flags : AUDIO_INPUT_FLAG_NONE;
207eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        data.writeInt32(lFlags);
2089ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George        data.writeInt32((int32_t) pid);
2091879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        data.writeInt32((int32_t) tid);
2104cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi        data.writeInt32((int32_t) clientUid);
211d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE;
212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
214be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
215be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
2167410591dad836434c72ddee66680802708b70c10Glenn Kasten        data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0);
21720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        data.writeInt32(portId);
218d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        cblk.clear();
219d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        buffers.clear();
2205841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
2215841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
22229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("openRecord error: %s", strerror(-lStatus));
2235841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
224b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            frameCount = reply.readInt64();
22574935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
22674935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
22774935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
228050677873c10d4da308ac222f8533c96cca3207eEric Laurent            lFlags = (audio_input_flags_t)reply.readInt32();
229eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            if (flags != NULL) {
230eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                *flags = lFlags;
231eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            }
232d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            lSessionId = (audio_session_t) reply.readInt32();
233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
2367df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            size_t lNotificationFrames = (size_t) reply.readInt64();
2377df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            if (notificationFrames != NULL) {
2387df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                *notificationFrames = lNotificationFrames;
2397df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            }
2405841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
2415841db78dff14898538200287d246577b1fc37e2Eric Laurent            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
242d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            cblk = interface_cast<IMemory>(reply.readStrongBinder());
243d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (cblk != 0 && cblk->pointer() == NULL) {
244d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
245d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
246d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            buffers = interface_cast<IMemory>(reply.readStrongBinder());
247d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (buffers != 0 && buffers->pointer() == NULL) {
248d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
249d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
250e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            if (lStatus == NO_ERROR) {
251e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                if (record == 0) {
252e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    ALOGE("openRecord should have returned an IAudioRecord");
253e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
254d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                } else if (cblk == 0) {
255d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord should have returned a cblk");
256d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    lStatus = NO_MEMORY;
257e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
258d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                // buffers is permitted to be 0
259e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            } else {
260d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                if (record != 0 || cblk != 0 || buffers != 0) {
261d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord returned an IAudioRecord, cblk, "
262d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                          "or buffers but with status %d", lStatus);
263e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
264e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            }
265d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (lStatus != NO_ERROR) {
266d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                record.clear();
267d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
268d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
269d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
2705841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
271507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
2745841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2772c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2812c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2864a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    // RESERVED for channelCount()
2874a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
28872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
29458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2972c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual size_t frameCount(audio_io_handle_t ioHandle) const
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3012c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
303e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
31072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
34972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
35072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
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.writeFloat(value);
35672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
361fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
365fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
37172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
375fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
37672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
381fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
385fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
390f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
42072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
42672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
43072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
435c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
437c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
44006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
443c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
444dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
445dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
446c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
448c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
451dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
452c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
453e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_io_handle_t *output,
458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_config_t *config,
459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_devices_t *devices,
460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                const String8& address,
461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                uint32_t *latencyMs,
462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_output_flags_t flags)
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
469a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
471cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*devices);
472cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
47318868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
474cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
475cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
476cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
477cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
478507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
479cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
480cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
481cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
482cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
483507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
484cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
485cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGV("openOutput() returned output, %d", *output);
486cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
487cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *devices = (audio_devices_t)reply.readInt32();
488cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *latencyMs = reply.readInt32();
489cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
490c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
491c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
49272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
49372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
494c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
495c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
496c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
49772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
49872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
499c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
50072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
501c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
502c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
50372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
504c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
505c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
506c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
50772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
508c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
51272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
51672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
517c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
520c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
52172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
52572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
526c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
527c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
529c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
530cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openInput(audio_module_handle_t module,
531cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_io_handle_t *input,
532cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_config_t *config,
533cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_devices_t *device,
534cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               const String8& address,
535cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_source_t source,
536cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_input_flags_t flags)
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
538cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (input == NULL || config == NULL || device == NULL) {
539cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
540cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
543a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
544cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*input);
545cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
546cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*device);
547cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
548cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(source);
549ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten        data.writeInt32(flags);
550cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
551cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
552cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
553cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
554507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
555cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
556cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
557cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
558cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
559507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
560cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
561cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
562cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *device = (audio_devices_t)reply.readInt32();
563cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
565c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
566fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
570fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
571c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
572c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
575d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    virtual status_t invalidateStream(audio_stream_type_t stream)
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
579fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
580d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        remote()->transact(INVALIDATE_STREAM, data, &reply);
581c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
583f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
584f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
585f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
586f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
587f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
588f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
589f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
590f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
591f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
592342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
593377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
59472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
595342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
596342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
597342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
59872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
599342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
600342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
601342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
602342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
603507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
604342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
605342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
606342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
607507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
608342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
609342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
610342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
611342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
612342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
61305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
6145f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
61505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
61605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
61705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
61872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
6195f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
6205f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
6215f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
6225f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
6235f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
62405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
626eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
630eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten        data.writeInt32((int32_t) use);
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
632de3f8392fbf380ba6f09d009b00d7172477389a2Eric Laurent        audio_unique_id_t id = AUDIO_SESSION_ALLOCATE;
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
639d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
6403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
644d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
6463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
648d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
6493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
653d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6543a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
6553a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
657f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
6699d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
675f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
676be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
677be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
678be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
682ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
683ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
684be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
688be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
689be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
690be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6955e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
696f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
697be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
699be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
700be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
704be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
708be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
712be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
713be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
7168d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
718be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
72072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
721d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                    audio_session_t sessionId,
722be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                    const String16& opPackageName,
723b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                                    pid_t pid,
724be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
725be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
726be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
727be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
728be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
729be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
730be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
731be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
732e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
733507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
734e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
735e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
736e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
737be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
738be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
739be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
74006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
741be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
74272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
743be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
744be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
745b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent        data.writeInt32((int32_t) pid);
746be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
747be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
748be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
74929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
750be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
751be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
752be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
753507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
754be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
755be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
756be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
757a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
758be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
759be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
760be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
761be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
762be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
763507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
764be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
765be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
766be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
767be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
768be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
769de070137f11d346fba77605bd76a44c040a618fcEric Laurent
770d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
77172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
772de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
773de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
774de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
775de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
77672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
77772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
778de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
779de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
780de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
781a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
782a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
783a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
784a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
785a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
786a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
787a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
788a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
789a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
790cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7913b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
792cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
793cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
794cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
795cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
796cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
797cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
798cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
799e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
800cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
801cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
802cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
803cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
804e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
805cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
806cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
8074182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
8084182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
8094182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
8104182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8114182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
8124182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
8134182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
8144182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
8654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
8684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
8724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
8734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
8794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
8804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
8824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
8874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
8884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
8934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
8944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
8974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
8994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
9004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
9014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
9024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
9034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
9044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
9054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
9064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
9074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
9084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
9094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
91093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
91193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
91293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
91393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
91493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
91593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply);
91693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
91793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
91893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
91993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
92093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
92172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    virtual status_t systemReady()
92272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    {
92372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        Parcel data, reply;
92472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
92572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
92672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    }
9274a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
9284a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    {
9294a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        Parcel data, reply;
9304a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
9314a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInt32((int32_t) ioHandle);
9324a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
9334a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        if (status != NO_ERROR) {
9344a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return 0;
9354a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        }
9364a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        return reply.readInt64();
9374a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    }
93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
94689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
947dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Whitelist of relevant events to trigger log merging.
948dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Log merging should activate during audio activity of any kind. This are considered the
949dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // most relevant events.
950dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // TODO should select more wisely the items from the list
951dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    switch (code) {
952dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_TRACK:
953dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case OPEN_RECORD:
954dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_VOLUME:
955dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_MUTE:
956dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_STREAM_VOLUME:
957dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_STREAM_MUTE:
958dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MIC_MUTE:
959dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_PARAMETERS:
960dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case OPEN_INPUT:
961dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_VOICE_VOLUME:
962dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_EFFECT:
963dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SYSTEM_READY: {
964dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            requestLogMerge();
965dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
966dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        }
967dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        default:
968dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
969dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    }
970e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int streamType = data.readInt32();
97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
97558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
976dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
977e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
978050677873c10d4da308ac222f8533c96cca3207eEric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
9793d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            bool haveSharedBuffer = data.readInt32() != 0;
9803d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IMemory> buffer;
9813d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if (haveSharedBuffer) {
9823d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                buffer = interface_cast<IMemory>(data.readStrongBinder());
9833d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
98472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
9859ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George            pid_t pid = (pid_t) data.readInt32();
9863acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
987d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
988462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen            int clientUid = data.readInt32();
98920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
990983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
9913d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            sp<IAudioTrack> track;
9923d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            if ((haveSharedBuffer && (buffer == 0)) ||
9933d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                    ((buffer != 0) && (buffer->pointer() == NULL))) {
9943d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
9953d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                status = DEAD_OBJECT;
9963d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            } else {
9973d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                track = createTrack(
9983d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent                        (audio_stream_type_t) streamType, sampleRate, format,
9999ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                        channelMask, &frameCount, &flags, buffer, output, pid, tid,
100020b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                        &sessionId, clientUid, &status, portId);
10010cde076ddb283c84c3801a2df4cc3df99bd1577fGlenn Kasten                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
10023d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
1003b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
1004e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten            reply->writeInt32(flags);
1005be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
100706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(track));
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
101458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1015dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1016be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16& opPackageName = data.readString16();
1017e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
1018050677873c10d4da308ac222f8533c96cca3207eEric Laurent            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
10199ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George            pid_t pid = (pid_t) data.readInt32();
10201879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
10214cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi            int clientUid = data.readInt32();
1022d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
10237410591dad836434c72ddee66680802708b70c10Glenn Kasten            size_t notificationFrames = data.readInt64();
102420b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
1025d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> cblk;
1026d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> buffers;
1027983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
10288d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IAudioRecord> record = openRecord(input,
10299ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                    sampleRate, format, channelMask, opPackageName, &frameCount, &flags,
10309ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                    pid, tid, clientUid, &sessionId, &notificationFrames, cblk, buffers,
103120b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                    &status, portId);
1032e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
1033b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
1034eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            reply->writeInt32(flags);
1035be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
10367df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            reply->writeInt64(notificationFrames);
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
103806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(record));
103906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(cblk));
104006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(buffers));
104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
10484a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
10494a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        // RESERVED for channelCount()
10504a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1058e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1066e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
109072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1091fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1097fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
110189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1103fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1104fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
110689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
110789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
110989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1110fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
111189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
111389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
111489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1115f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
111689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
111789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
111889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
111989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
112089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
112189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
112489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
112589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
112689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
112889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
113272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1136e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1143e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
114589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
114689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
114785ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
114885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
114989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
115089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
115189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
115289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
115389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
115558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1156dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1157e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
115889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1161c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1162a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1163e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1164e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1165e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1166e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1167a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1168cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
11690ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1170983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t latencyMs = 0;
11714cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1172cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1173cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
11747074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1175cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1176cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1177cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1178cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1179cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1180cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1181cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1182c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1183c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1184c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1185c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
118672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
118772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
118872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1189c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1190c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1191c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1192c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
119372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1194c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1195c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1196c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1197c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
119872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1199c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1200c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1201c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1202c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
120372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1204c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1205c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1206c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1207c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1208a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1209cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1210e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1211e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1212e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1213e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1214cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1215cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1216cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1217ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1218c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1219cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1220cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1221cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1222cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1223cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1224cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1225cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1226cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1227c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1228c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1229c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
123089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
123172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
123289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
123389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1234d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
123589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1236d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1237d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
123889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
123989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1240f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1241f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1242f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1243f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1244f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1245f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1246342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1247342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
124872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1249983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t halFrames = 0;
1250983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t dspFrames = 0;
1251342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1252342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1253342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1254342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1255342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1256342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1257342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1258342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
125905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
126005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
126172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
12625f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
126305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
126405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
1265be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case NEW_AUDIO_SESSION_ID: {
1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1267eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1268be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1269be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
12703a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
12713a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1272d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1273d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1274d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
12753a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12763a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
12773a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
12783a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1279d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1280d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1281d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
12823a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12833a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1284be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1285be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1286983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t numEffects = 0;
1287be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1288be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1289be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1290be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1291be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1292be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1293be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1294ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1295be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1296983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1297ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1298be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1299be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1300be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1301be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1302be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1303be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1304be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1305be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1306be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1307be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1308983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1309be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1310be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1311be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1312be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1313be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1314be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1315be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1316be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1317be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1318e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            effect_descriptor_t desc = {};
1319e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1320e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1321e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1322be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1323be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
132472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1325d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
1326be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1327b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent            pid_t pid = (pid_t)data.readInt32();
1328b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent
1329983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
1330983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int id = 0;
1331983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int enabled = 0;
133205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
13338d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1334b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                    opPackageName, pid, &status, &id, &enabled);
1335be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1336be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1337be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
133806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(effect));
1339be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1340be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1341be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1342de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1343de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1344d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t session = (audio_session_t) data.readInt32();
134572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
134672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1347de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1348de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1349de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1350a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1351a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1352a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1353a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1354a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1355cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1356cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1357cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1358cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1359cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1360cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1361cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1362e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1363cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1364cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
13654182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
13664182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
13674182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
13684182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
13694182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
13704182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1373f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPortsReq = data.readInt32();
1374f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1375f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
1376f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1377f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPorts = numPortsReq;
13784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
1379f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_port *)calloc(numPortsReq,
13804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
1381f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (ports == NULL) {
1382f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1383f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1384f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1385f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1386f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPorts(&numPorts, ports);
13874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1388f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPorts);
13894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1390f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPortsReq > numPorts) {
1391f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPortsReq = numPorts;
1392f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1393f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
13944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
13964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1400e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1401e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1402e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1403e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
14124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
14144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1415a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1416e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1417e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1418e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
14194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
14204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
14224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
14234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
14274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
14294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
14304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
14314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
14354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1436f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatchesReq = data.readInt32();
1437f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1438f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
1439f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1440f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatches = numPatchesReq;
14414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
1442f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
14434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
1444f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (patches == NULL) {
1445f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1446f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1447f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1448f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1449f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPatches(&numPatches, patches);
14504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1451f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPatches);
14524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1453f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPatchesReq > numPatches) {
1454f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPatchesReq = numPatches;
1455f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1456f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
14574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
14594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
14624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
14644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
14654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
14664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
146993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        case GET_AUDIO_HW_SYNC: {
147093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1471d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
147293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
147393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
147472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        case SYSTEM_READY: {
147572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
147672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            systemReady();
147772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            return NO_ERROR;
147872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        } break;
14794a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        case FRAME_COUNT_HAL: {
14804a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
14814a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
14824a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return NO_ERROR;
14834a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        } break;
148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
148589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
148689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
148789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
148889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
148989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
149140bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1492