IAudioFlinger.cpp revision 21da647792c0b78ab3943be0f32066015d5e8c34
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,
659eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    NEW_AUDIO_UNIQUE_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,
839eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    GET_AUDIO_HW_SYNC_FOR_SESSION,
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
9821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent    virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
9921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        CreateTrackOutput& output,
10021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        status_t *status)
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1035841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
10521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
10621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (status == nullptr) {
10721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
108be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
10921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        input.writeToParcel(&data);
11121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
11421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack transaction error %d", lStatus);
11521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
11621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
11721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
11821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        *status = reply.readInt32();
11921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (*status != NO_ERROR) {
12021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned error %d", *status);
12121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
12321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        track = interface_cast<IAudioTrack>(reply.readStrongBinder());
12421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (track == 0) {
12521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned an NULL IAudioTrack with status OK");
12621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
12721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
12921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        output.readFromParcel(&reply);
1305841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
133ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano    virtual sp<media::IAudioRecord> openRecord(
13472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                audio_io_handle_t input,
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
13658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten                                audio_format_t format,
13728b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten                                audio_channel_mask_t channelMask,
138be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                const String16& opPackageName,
13974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                                size_t *pFrameCount,
140050677873c10d4da308ac222f8533c96cca3207eEric Laurent                                audio_input_flags_t *flags,
1419ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                                pid_t pid,
1421879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten                                pid_t tid,
1434cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi                                int clientUid,
144d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                audio_session_t *sessionId,
1457df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                                size_t *notificationFrames,
146d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& cblk,
147d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                sp<IMemory>& buffers,
14820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                status_t *status,
14920b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                audio_port_handle_t portId)
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
152ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano        sp<media::IAudioRecord> record;
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
15472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) input);
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sampleRate);
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
1570d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32(channelMask);
158eaa34703cb5f1acedb20cbcdff1ab79c11ff6857Dianne Hackborn        data.writeString16(opPackageName);
15974935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
160e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(frameCount);
161050677873c10d4da308ac222f8533c96cca3207eEric Laurent        audio_input_flags_t lFlags = flags != NULL ? *flags : AUDIO_INPUT_FLAG_NONE;
162eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        data.writeInt32(lFlags);
1639ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George        data.writeInt32((int32_t) pid);
1641879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        data.writeInt32((int32_t) tid);
1654cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi        data.writeInt32((int32_t) clientUid);
166d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE;
167be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (sessionId != NULL) {
168be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = *sessionId;
169be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
170be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(lSessionId);
1717410591dad836434c72ddee66680802708b70c10Glenn Kasten        data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0);
17220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent        data.writeInt32(portId);
173d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        cblk.clear();
174d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten        buffers.clear();
1755841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
1765841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
17729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("openRecord error: %s", strerror(-lStatus));
1785841db78dff14898538200287d246577b1fc37e2Eric Laurent        } else {
179b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            frameCount = reply.readInt64();
18074935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            if (pFrameCount != NULL) {
18174935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten                *pFrameCount = frameCount;
18274935e44734c1ec235c2b6677db3e0dbefa5ddb8Glenn Kasten            }
183050677873c10d4da308ac222f8533c96cca3207eEric Laurent            lFlags = (audio_input_flags_t)reply.readInt32();
184eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            if (flags != NULL) {
185eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                *flags = lFlags;
186eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            }
187d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            lSessionId = (audio_session_t) reply.readInt32();
188be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
189be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *sessionId = lSessionId;
190be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1917df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            size_t lNotificationFrames = (size_t) reply.readInt64();
1927df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            if (notificationFrames != NULL) {
1937df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten                *notificationFrames = lNotificationFrames;
1947df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            }
1955841db78dff14898538200287d246577b1fc37e2Eric Laurent            lStatus = reply.readInt32();
196ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano            record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
197d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            cblk = interface_cast<IMemory>(reply.readStrongBinder());
198d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (cblk != 0 && cblk->pointer() == NULL) {
199d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
200d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
201d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            buffers = interface_cast<IMemory>(reply.readStrongBinder());
202d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (buffers != 0 && buffers->pointer() == NULL) {
203d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
204d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
205e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            if (lStatus == NO_ERROR) {
206e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                if (record == 0) {
207e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    ALOGE("openRecord should have returned an IAudioRecord");
208e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                    lStatus = UNKNOWN_ERROR;
209d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                } else if (cblk == 0) {
210d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord should have returned a cblk");
211d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    lStatus = NO_MEMORY;
212e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
213d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                // buffers is permitted to be 0
214e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            } else {
215d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                if (record != 0 || cblk != 0 || buffers != 0) {
216d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                    ALOGE("openRecord returned an IAudioRecord, cblk, "
217d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                          "or buffers but with status %d", lStatus);
218e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten                }
219e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            }
220d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            if (lStatus != NO_ERROR) {
221d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                record.clear();
222d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                cblk.clear();
223d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                buffers.clear();
224d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            }
2255841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
226507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
2295841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2322c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2362c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2414a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    // RESERVED for channelCount()
2424a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
24372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
24958f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2522c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual size_t frameCount(audio_io_handle_t ioHandle) const
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2562c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
258e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
26572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
30572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
309fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
31172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
316fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
320fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
330fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
33172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
336fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
340fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
345f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
363c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
37172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
37572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
38172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
38572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
39506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
399dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
400dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
406dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
408e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
411cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
412cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_io_handle_t *output,
413cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_config_t *config,
414cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_devices_t *devices,
415cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                const String8& address,
416cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                uint32_t *latencyMs,
417cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_output_flags_t flags)
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
419cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
420cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
421cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
424a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
425cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
426cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*devices);
427cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
42818868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
429cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
430cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
431cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
432cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
433507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
434cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
435cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
436cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
437cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
438507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGV("openOutput() returned output, %d", *output);
441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
442cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *devices = (audio_devices_t)reply.readInt32();
443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *latencyMs = reply.readInt32();
444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
445c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
446c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
44772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
44872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
450c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
45272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
45372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
45572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
456c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
45872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
460c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
46272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
463c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
46772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
47172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
472c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
475c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
47672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
48072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
481c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
482c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
484c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
485cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openInput(audio_module_handle_t module,
486cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_io_handle_t *input,
487cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_config_t *config,
488cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_devices_t *device,
489cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               const String8& address,
490cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_source_t source,
491cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_input_flags_t flags)
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
493cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (input == NULL || config == NULL || device == NULL) {
494cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
495cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
498a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
499cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*input);
500cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
501cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*device);
502cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
503cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(source);
504ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten        data.writeInt32(flags);
505cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
506cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
507cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
508cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
509507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
510cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
511cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
512cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
513cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
514507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
515cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
516cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
517cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *device = (audio_devices_t)reply.readInt32();
518cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
520c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
521fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
52289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
525fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
526c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
527c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
530d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    virtual status_t invalidateStream(audio_stream_type_t stream)
53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
534fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
535d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        remote()->transact(INVALIDATE_STREAM, data, &reply);
536c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
538f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
539f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
540f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
541f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
542f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
543f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
544f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
545f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
546f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
547342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
548377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
54972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
550342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
551342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
552342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
55372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
554342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
555342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
556342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
557342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
558507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
559342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
560342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
561342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
562507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
563342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
564342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
565342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
566342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
567342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
56805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
5695f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
57005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
57105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
57205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
57372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
5745f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
5755f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
5765f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
5775f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
5785f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
57905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
581eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
585eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten        data.writeInt32((int32_t) use);
5869eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply);
5879eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE;
588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
594d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
5953a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5963a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5973a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5983a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
599d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6003a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
6013a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6023a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
603d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
6043a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
6053a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
6063a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6073a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
608d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
6093a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
6103a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
6113a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
612f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
6249d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
630f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
637ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
638ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6505e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
651f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6718d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
67572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
676d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                    audio_session_t sessionId,
677be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                    const String16& opPackageName,
678b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                                    pid_t pid,
679be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
680be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
681be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
682be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
683be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
684be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
685be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
686be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
687e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
688507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
689e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
690e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
691e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
693be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
694be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
69506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
696be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
69772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
698be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
699be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
700b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent        data.writeInt32((int32_t) pid);
701be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
702be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
703be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
70429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
705be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
707be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
708507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
711be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
712a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
713be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
714be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
715be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
716be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
717be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
718507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
719be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
720be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
721be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
722be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
723be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
724de070137f11d346fba77605bd76a44c040a618fcEric Laurent
725d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
72672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
727de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
728de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
729de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
730de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
73172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
73272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
733de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
734de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
735de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
736a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
737a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
738a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
739a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
740a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
741a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
742a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
743a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
744a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
745cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7463b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
747cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
748cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
749cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
750cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
751cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
752cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
753cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
754e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
755cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
756cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
757cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
758cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
759e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
760cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
761cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7624182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
7634182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7644182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7654182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7664182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
7674182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
7684182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
7694182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
7714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
7724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
7744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
7794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
7804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
7854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
7864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
7894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
7914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
8234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
8274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
8284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
8344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
8354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
8374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
8424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
8434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
8484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
8494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
8524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
8544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
8594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
8604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
86593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
86693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
86793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
86893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
86993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
8709eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply);
87193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
87293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
87393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
87493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
87593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
87672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    virtual status_t systemReady()
87772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    {
87872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        Parcel data, reply;
87972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
88072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
88172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    }
8824a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
8834a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    {
8844a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        Parcel data, reply;
8854a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8864a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInt32((int32_t) ioHandle);
8874a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
8884a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        if (status != NO_ERROR) {
8894a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return 0;
8904a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        }
8914a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        return reply.readInt64();
8924a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    }
89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
902dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Whitelist of relevant events to trigger log merging.
903dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Log merging should activate during audio activity of any kind. This are considered the
904dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // most relevant events.
905dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // TODO should select more wisely the items from the list
906dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    switch (code) {
907dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_TRACK:
908dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case OPEN_RECORD:
909dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_VOLUME:
910dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_MUTE:
911dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_STREAM_VOLUME:
912dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_STREAM_MUTE:
913dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MIC_MUTE:
914dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_PARAMETERS:
915dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case OPEN_INPUT:
916dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_VOICE_VOLUME:
917dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_EFFECT:
918dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SYSTEM_READY: {
919dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            requestLogMerge();
920dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
921dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        }
922dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        default:
923dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
924dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    }
925e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
92821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
92921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackInput input;
93021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
93121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                reply->writeInt32(DEAD_OBJECT);
93221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
9333d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
93421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
93521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            status_t status;
93621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackOutput output;
93721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
93821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            sp<IAudioTrack> track= createTrack(input,
93921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               output,
94021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               &status);
94121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
94221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
94421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (status != NO_ERROR) {
94521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
94621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            }
94706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(track));
94821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            output.writeToParcel(reply);
94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
95089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case OPEN_RECORD: {
95289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
95372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
95558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
956dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
957be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16& opPackageName = data.readString16();
958e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t frameCount = data.readInt64();
959050677873c10d4da308ac222f8533c96cca3207eEric Laurent            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
9609ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George            pid_t pid = (pid_t) data.readInt32();
9611879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten            pid_t tid = (pid_t) data.readInt32();
9624cb668392ee0433462251afbee109405c6efacc8Jean-Michel Trivi            int clientUid = data.readInt32();
963d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
9647410591dad836434c72ddee66680802708b70c10Glenn Kasten            size_t notificationFrames = data.readInt64();
96520b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent            audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
966d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> cblk;
967d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten            sp<IMemory> buffers;
968983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
969ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano            sp<media::IAudioRecord> record = openRecord(input,
9709ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                    sampleRate, format, channelMask, opPackageName, &frameCount, &flags,
9719ea77cdba8c422940adb57a790b44ac04fe0353fHaynes Mathew George                    pid, tid, clientUid, &sessionId, &notificationFrames, cblk, buffers,
97220b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                    &status, portId);
973e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
974b53fc4ef8da47df8d5f580e8ee6135866ffebc33Glenn Kasten            reply->writeInt64(frameCount);
975eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            reply->writeInt32(flags);
976be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(sessionId);
9777df8c0b799d8f52d6386e03313286dbd7d5cdc7cGlenn Kasten            reply->writeInt64(notificationFrames);
97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
97906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(record));
98006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(cblk));
98106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(buffers));
98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
98672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
9894a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
9904a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        // RESERVED for channelCount()
9914a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
999e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1007e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1030c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
103172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1032fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1038fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1044fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1045fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1051fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1056f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1071c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1074c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1075c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1077e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1078c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1079c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
108072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1081c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1082c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1083c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1084e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1085c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
108885ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
108985ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
109658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1097dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1098e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1103a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1104e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1105e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1106e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1107e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1108a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1109cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
11100ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1111983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t latencyMs = 0;
11124cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1113cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1114cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
11157074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1116cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1117cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1118cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1119cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1120cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1122cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1123c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
112772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
112872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
112972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1130c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1131c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1132c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1140c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1141c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
114472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1146c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1149a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1150cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1151e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1152e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1153e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1154e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1155cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1156cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1157cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1158ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1160cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1161cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1162cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1163cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1164cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1165cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1166cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1167cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
117189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
117272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
117389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
117489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1175d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
117689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1177d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1178d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
117989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
118089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1181f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1182f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1183f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1184f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1185f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1186f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1187342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1188342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
118972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1190983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t halFrames = 0;
1191983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t dspFrames = 0;
1192342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1193342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1194342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1195342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1196342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1197342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1198342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1199342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
120005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
120105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
120272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
12035f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
120405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
120505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
12069eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case NEW_AUDIO_UNIQUE_ID: {
1207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1208eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
12113a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
12123a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1213d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1214d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1215d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
12163a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12173a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
12183a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
12193a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1220d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1221d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1222d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
12233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12243a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1225be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1226be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1227983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t numEffects = 0;
1228be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1229be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1230be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1231be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1235ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1237983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1238ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1239be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1240be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1241be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1246be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1247be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1249983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1250be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1251be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1252be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1253be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1259e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            effect_descriptor_t desc = {};
1260e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1261e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1262e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1263be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1264be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
126572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1266d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
1267be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1268b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent            pid_t pid = (pid_t)data.readInt32();
1269b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent
1270983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
1271983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int id = 0;
1272983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int enabled = 0;
127305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
12748d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1275b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                    opPackageName, pid, &status, &id, &enabled);
1276be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1277be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1278be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
127906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(effect));
1280be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1281be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1282be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1283de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1284de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1285d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t session = (audio_session_t) data.readInt32();
128672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
128772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1288de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1289de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1290de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1291a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1292a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1293a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1294a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1295a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1296cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1297cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1298cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1299cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1300cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1301cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1302cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1303e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1304cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1305cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
13064182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
13074182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
13084182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
13094182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
13104182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
13114182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
13124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
13134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1314f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPortsReq = data.readInt32();
1315f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1316f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
1317f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1318f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPorts = numPortsReq;
13194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
1320f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_port *)calloc(numPortsReq,
13214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
1322f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (ports == NULL) {
1323f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1324f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1325f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1326f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1327f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPorts(&numPorts, ports);
13284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1329f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPorts);
13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1331f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPortsReq > numPorts) {
1332f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPortsReq = numPorts;
1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
13354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
13374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1341e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1342e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1343e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1344e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
13464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1356a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1357e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1358e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1359e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
13614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
13684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
13704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
13764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1377f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatchesReq = data.readInt32();
1378f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1379f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
1380f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1381f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatches = numPatchesReq;
13824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
1383f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
13844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
1385f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (patches == NULL) {
1386f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1387f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1388f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1389f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1390f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPatches(&numPatches, patches);
13914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1392f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPatches);
13934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1394f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPatchesReq > numPatches) {
1395f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPatchesReq = numPatches;
1396f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1397f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
13984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
14004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
14034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14109eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case GET_AUDIO_HW_SYNC_FOR_SESSION: {
141193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1412d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
141393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
141493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
141572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        case SYSTEM_READY: {
141672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
141772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            systemReady();
141872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            return NO_ERROR;
141972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        } break;
14204a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        case FRAME_COUNT_HAL: {
14214a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
14224a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
14234a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return NO_ERROR;
14244a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        } break;
142589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
142689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
142789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
142889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
142989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
143089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
143189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
143240bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1433