13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "IAudioFlinger"
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent//#define LOG_NDEBUG 0
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "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,
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    RESERVED,   // obsolete, was CHANNEL_COUNT
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    INVALIDATE_STREAM,
62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    NEW_AUDIO_SESSION_ID,
663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    ACQUIRE_AUDIO_SESSION_ID,
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    RELEASE_AUDIO_SESSION_ID,
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent    CREATE_EFFECT,
72de070137f11d346fba77605bd76a44c040a618fcEric Laurent    MOVE_EFFECTS,
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOAD_HW_MODULE,
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_PRIMARY_OUTPUT_FRAME_COUNT,
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_LOW_RAM_DEVICE,
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LIST_AUDIO_PORTS,
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_AUDIO_PORT,
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_AUDIO_PATCH,
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    RELEASE_AUDIO_PATCH,
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LIST_AUDIO_PATCHES,
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_AUDIO_PORT_CONFIG,
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_AUDIO_HW_SYNC,
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SYSTEM_READY,
85fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    FRAME_COUNT_HAL,
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
870d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi
880d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi#define MAX_ITEMS_PER_LIST 1024
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
92fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurentpublic:
93be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    explicit BpAudioFlinger(const sp<IBinder>& impl)
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
975841db78dff14898538200287d246577b1fc37e2Eric Laurent
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_stream_type_t streamType,
100fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                                uint32_t sampleRate,
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_format_t format,
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_channel_mask_t channelMask,
1030d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi                                size_t *pFrameCount,
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_output_flags_t *flags,
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_io_handle_t output,
107fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                pid_t pid,
108be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                pid_t tid,
109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                audio_session_t *sessionId,
110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                int clientUid,
111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                status_t *status,
112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                audio_port_handle_t portId)
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
11529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        sp<IAudioTrack> track;
1165841db78dff14898538200287d246577b1fc37e2Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32((int32_t) streamType);
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sampleRate);
119be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(format);
120be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(channelMask);
1215841db78dff14898538200287d246577b1fc37e2Eric Laurent        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
1225841db78dff14898538200287d246577b1fc37e2Eric Laurent        data.writeInt64(frameCount);
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        audio_output_flags_t lFlags = flags != NULL ? *flags : AUDIO_OUTPUT_FLAG_NONE;
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(lFlags);
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // haveSharedBuffer
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (sharedBuffer != 0) {
1275841db78dff14898538200287d246577b1fc37e2Eric Laurent            data.writeInt32(true);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            data.writeStrongBinder(IInterface::asBinder(sharedBuffer));
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            data.writeInt32(false);
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
132fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32((int32_t) output);
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) pid);
1340d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        data.writeInt32((int32_t) tid);
1350d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi        audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE;
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (sessionId != NULL) {
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lSessionId = *sessionId;
138be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(lSessionId);
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(clientUid);
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(portId);
1425841db78dff14898538200287d246577b1fc37e2Eric Laurent        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ALOGE("createTrack error: %s", strerror(-lStatus));
145fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        } else {
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            frameCount = reply.readInt64();
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (pFrameCount != NULL) {
1480d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi                *pFrameCount = frameCount;
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lFlags = (audio_output_flags_t)reply.readInt32();
151be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (flags != NULL) {
152be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *flags = lFlags;
153be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
154be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lSessionId = (audio_session_t) reply.readInt32();
155be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (sessionId != NULL) {
1565841db78dff14898538200287d246577b1fc37e2Eric Laurent                *sessionId = lSessionId;
1575841db78dff14898538200287d246577b1fc37e2Eric Laurent            }
15829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            lStatus = reply.readInt32();
1595841db78dff14898538200287d246577b1fc37e2Eric Laurent            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
160be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (lStatus == NO_ERROR) {
161be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                if (track == 0) {
162be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                    ALOGE("createTrack should have returned an IAudioTrack");
163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                    lStatus = UNKNOWN_ERROR;
1645841db78dff14898538200287d246577b1fc37e2Eric Laurent                }
1655841db78dff14898538200287d246577b1fc37e2Eric Laurent            } else {
1665841db78dff14898538200287d246577b1fc37e2Eric Laurent                if (track != 0) {
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus);
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    track.clear();
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                }
1705841db78dff14898538200287d246577b1fc37e2Eric Laurent            }
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status != NULL) {
173fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            *status = lStatus;
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return track;
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
177fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_io_handle_t input,
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                uint32_t sampleRate,
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_format_t format,
182fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                audio_channel_mask_t channelMask,
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const String16& opPackageName,
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                size_t *pFrameCount,
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_input_flags_t *flags,
186fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                pid_t pid,
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                pid_t tid,
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                int clientUid,
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_session_t *sessionId,
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                size_t *notificationFrames,
1910d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi                                sp<IMemory>& cblk,
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                sp<IMemory>& buffers,
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                status_t *status,
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                audio_port_handle_t portId)
195fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    {
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sp<IAudioRecord> record;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) input);
200fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(sampleRate);
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(format);
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(channelMask);
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeString16(opPackageName);
204fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(frameCount);
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        audio_input_flags_t lFlags = flags != NULL ? *flags : AUDIO_INPUT_FLAG_NONE;
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(lFlags);
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) pid);
209fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32((int32_t) tid);
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) clientUid);
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        audio_session_t lSessionId = AUDIO_SESSION_ALLOCATE;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (sessionId != NULL) {
213fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            lSessionId = *sessionId;
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(lSessionId);
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt64(notificationFrames != NULL ? *notificationFrames : 0);
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(portId);
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        cblk.clear();
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        buffers.clear();
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ALOGE("openRecord error: %s", strerror(-lStatus));
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            frameCount = reply.readInt64();
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (pFrameCount != NULL) {
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                *pFrameCount = frameCount;
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lFlags = (audio_input_flags_t)reply.readInt32();
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (flags != NULL) {
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                *flags = lFlags;
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lSessionId = (audio_session_t) reply.readInt32();
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (sessionId != NULL) {
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                *sessionId = lSessionId;
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t lNotificationFrames = (size_t) reply.readInt64();
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (notificationFrames != NULL) {
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                *notificationFrames = lNotificationFrames;
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lStatus = reply.readInt32();
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            cblk = interface_cast<IMemory>(reply.readStrongBinder());
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (cblk != 0 && cblk->pointer() == NULL) {
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                cblk.clear();
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            buffers = interface_cast<IMemory>(reply.readStrongBinder());
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (buffers != 0 && buffers->pointer() == NULL) {
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                buffers.clear();
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (lStatus == NO_ERROR) {
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                if (record == 0) {
252fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                    ALOGE("openRecord should have returned an IAudioRecord");
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    lStatus = UNKNOWN_ERROR;
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                } else if (cblk == 0) {
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    ALOGE("openRecord should have returned a cblk");
256fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                    lStatus = NO_MEMORY;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                }
258fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                // buffers is permitted to be 0
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                if (record != 0 || cblk != 0 || buffers != 0) {
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    ALOGE("openRecord returned an IAudioRecord, cblk, "
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                          "or buffers but with status %d", lStatus);
263fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                }
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (lStatus != NO_ERROR) {
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                record.clear();
267fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                cblk.clear();
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                buffers.clear();
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status != NULL) {
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *status = lStatus;
273fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        }
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return record;
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
277fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
278fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    {
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) ioHandle);
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
283fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        return reply.readInt32();
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // RESERVED for channelCount()
287fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual audio_format_t format(audio_io_handle_t output) const
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) output);
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return (audio_format_t) reply.readInt32();
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual size_t frameCount(audio_io_handle_t ioHandle) const
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) ioHandle);
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt64();
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual uint32_t latency(audio_io_handle_t output) const
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
310c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) output);
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
318fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
322fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    }
323c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMasterMute(bool muted)
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
328fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(muted);
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
332fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent
333c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual float masterVolume() const
334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(MASTER_VOLUME, data, &reply);
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readFloat();
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool masterMute() const
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(MASTER_MUTE, data, &reply);
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_io_handle_t output)
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) stream);
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) output);
357fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        remote()->transact(SET_STREAM_VOLUME, data, &reply);
358c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
360c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
361c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
362c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
365c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) stream);
366c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(muted);
367c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_STREAM_MUTE, data, &reply);
368c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
369c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
370c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
372c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
373c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
374c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
375c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) stream);
376c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) output);
377c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STREAM_VOLUME, data, &reply);
378c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readFloat();
379fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    }
3803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block
381c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool streamMute(audio_stream_type_t stream) const
382c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
385c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) stream);
386c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(STREAM_MUTE, data, &reply);
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
390c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMode(audio_mode_t mode)
391c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
393c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
394fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(mode);
395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
398fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent
399fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t setMicMute(bool state)
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
401fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        Parcel data, reply;
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
404fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
405c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
408fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual bool getMicMute() const
409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_MIC_MUTE, data, &reply);
413fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return reply.readInt32();
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
417fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    {
418c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) ioHandle);
421c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
422fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
426fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
428c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
430c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int32_t) ioHandle);
431fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeString8(keys);
432fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
433fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return reply.readString8();
434fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    }
435fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent
43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void registerClient(const sp<IAudioFlingerClient>& client)
43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
438c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
439c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
440c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeStrongBinder(IInterface::asBinder(client));
441c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
442c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
444c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
445c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            audio_channel_mask_t channelMask) const
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
447c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
448c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
449c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
450fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(format);
451c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(channelMask);
452c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
453c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt64();
454c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
455c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
456c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
457c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                audio_io_handle_t *output,
458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                audio_config_t *config,
459c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                audio_devices_t *devices,
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                const String8& address,
461c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                uint32_t *latencyMs,
462fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                audio_output_flags_t flags)
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BAD_VALUE;
466fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        }
467c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
468c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(module);
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.write(config, sizeof(audio_config_t));
471fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32(*devices);
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeString8(address);
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) flags);
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
475fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        if (status != NO_ERROR) {
476fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            *output = AUDIO_IO_HANDLE_NONE;
477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return status;
478c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        }
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status = (status_t)reply.readInt32();
480f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        if (status != NO_ERROR) {
481f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
482f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return status;
483f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        }
484f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
485f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        ALOGV("openOutput() returned output, %d", *output);
486f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        reply.read(config, sizeof(audio_config_t));
487f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        *devices = (audio_devices_t)reply.readInt32();
488f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        *latencyMs = reply.readInt32();
489342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return NO_ERROR;
490342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
491342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
492342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
493342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            audio_io_handle_t output2)
494342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
495342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
496342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInt32((int32_t) output1);
498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInt32((int32_t) output2);
499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
500342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return (audio_io_handle_t) reply.readInt32();
501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    virtual status_t closeOutput(audio_io_handle_t output)
504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInt32((int32_t) output);
508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
50905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        return reply.readInt32();
51005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
51105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
51205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    virtual status_t suspendOutput(audio_io_handle_t output)
51305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
51405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
51505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
51605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInt32((int32_t) output);
51705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
518be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return reply.readInt32();
519be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
520be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
521be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t restoreOutput(audio_io_handle_t output)
522be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
523be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
524be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
525be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32((int32_t) output);
526be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return reply.readInt32();
528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t openInput(audio_module_handle_t module,
5313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen                               audio_io_handle_t *input,
5323a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen                               audio_config_t *config,
5333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen                               audio_devices_t *device,
5343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen                               const String8& address,
5353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen                               audio_source_t source,
5363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen                               audio_input_flags_t flags)
5373a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        if (input == NULL || config == NULL || device == NULL) {
5393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return BAD_VALUE;
5403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        }
5413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(module);
5443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(*input);
5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.write(config, sizeof(audio_config_t));
5463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(*device);
547be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeString8(address);
548be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(source);
549be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(flags);
550be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
551be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
552be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
553be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
554be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
555be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = (status_t)reply.readInt32();
556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(config, sizeof(audio_config_t));
562be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        *device = (audio_devices_t)reply.readInt32();
563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
565ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent
566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t closeInput(int input)
567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(input);
571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
572ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        return reply.readInt32();
573ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    }
574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t invalidateStream(audio_stream_type_t stream)
576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32((int32_t) stream);
580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        remote()->transact(INVALIDATE_STREAM, data, &reply);
581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return reply.readInt32();
582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t setVoiceVolume(float volume)
585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeFloat(volume);
589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return reply.readInt32();
591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            audio_io_handle_t output) const
595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32((int32_t) output);
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = reply.readInt32();
601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            uint32_t tmp = reply.readInt32();
603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (halFrames != NULL) {
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *halFrames = tmp;
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (dspFrames != NULL) {
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *dspFrames = tmp;
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return status;
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32((int32_t) ioHandle);
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return 0;
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return (uint32_t) reply.readInt32();
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
627be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
628be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32((int32_t) use);
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        audio_unique_id_t id = AUDIO_SESSION_ALLOCATE;
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
63529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        }
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(audioSession);
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(pid);
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(audioSession);
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(pid);
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
655de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
656de070137f11d346fba77605bd76a44c040a618fcEric Laurent
657de070137f11d346fba77605bd76a44c040a618fcEric Laurent    virtual status_t queryNumberEffects(uint32_t *numEffects) const
658de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
659de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
660de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
661de070137f11d346fba77605bd76a44c040a618fcEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
662de070137f11d346fba77605bd76a44c040a618fcEric Laurent        if (status != NO_ERROR) {
663de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return status;
664de070137f11d346fba77605bd76a44c040a618fcEric Laurent        }
665de070137f11d346fba77605bd76a44c040a618fcEric Laurent        status = reply.readInt32();
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status != NO_ERROR) {
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return status;
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (numEffects != NULL) {
67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *numEffects = (uint32_t)reply.readInt32();
67189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
67289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_ERROR;
67389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
67489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
67589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
67789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (pDescriptor == NULL) {
67889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BAD_VALUE;
67989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
68089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
68189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
68289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(index);
68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status != NO_ERROR) {
68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return status;
686fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        }
687be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status != NO_ERROR) {
68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return status;
690fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        }
691be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
692be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
69689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            effect_descriptor_t *pDescriptor) const
69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
69889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (pUuid == NULL || pDescriptor == NULL) {
69989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BAD_VALUE;
700fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        }
70189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.write(pUuid, sizeof(effect_uuid_t));
70489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
70589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status != NO_ERROR) {
706be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
70789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
708c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        status = reply.readInt32();
709be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
710be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
71189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
71289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        reply.read(pDescriptor, sizeof(effect_descriptor_t));
71389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return NO_ERROR;
71489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
71589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
71689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual sp<IEffect> createEffect(
717fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                    effect_descriptor_t *pDesc,
71889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    const sp<IEffectClient>& client,
71989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    int32_t priority,
72089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    audio_io_handle_t output,
72189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    audio_session_t sessionId,
722fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent                                    const String16& opPackageName,
72389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    pid_t pid,
72489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    status_t *status,
72589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    int *id,
72689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                                    int *enabled)
727fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    {
72889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
72989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sp<IEffect> effect;
73089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
73189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (pDesc == NULL) {
732fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            return effect;
73389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (status != NULL) {
73489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                *status = BAD_VALUE;
73589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
73689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
737fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent
73889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
73989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.write(pDesc, sizeof(effect_descriptor_t));
74089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeStrongBinder(IInterface::asBinder(client));
74189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(priority);
74289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) output);
74389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(sessionId);
74489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeString16(opPackageName);
74589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) pid);
74689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
74789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
74889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
74989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ALOGE("createEffect error: %s", strerror(-lStatus));
75089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
75189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lStatus = reply.readInt32();
75289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int tmp = reply.readInt32();
75389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (id != NULL) {
75489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                *id = tmp;
75589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
75689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            tmp = reply.readInt32();
75789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (enabled != NULL) {
75889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                *enabled = tmp;
75989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
76089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            effect = interface_cast<IEffect>(reply.readStrongBinder());
76189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply.read(pDesc, sizeof(effect_descriptor_t));
76289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
763c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (status != NULL) {
764fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            *status = lStatus;
765fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        }
76689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
76789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return effect;
76889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
76989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
77089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
771fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            audio_io_handle_t dstOutput)
77289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
77389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
77489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
77589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(session);
77689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32((int32_t) srcOutput);
777fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32((int32_t) dstOutput);
778fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        remote()->transact(MOVE_EFFECTS, data, &reply);
77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
78289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual audio_module_handle_t loadHwModule(const char *name)
78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
784fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        Parcel data, reply;
78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeCString(name);
78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LOAD_HW_MODULE, data, &reply);
78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return (audio_module_handle_t) reply.readInt32();
78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual uint32_t getPrimaryOutputSamplingRate()
79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
79489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual size_t getPrimaryOutputFrameCount()
80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
804c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt64();
80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
806fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent
807c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setLowRamDevice(bool isLowRamDevice)
808c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
810c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
811c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32((int) isLowRamDevice);
812c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
813fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return reply.readInt32();
814c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
815c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
816c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                    struct audio_port *ports)
817c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
818c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BAD_VALUE;
82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
82189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
82389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(*num_ports);
82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (status != NO_ERROR ||
82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                (status = (status_t)reply.readInt32()) != NO_ERROR) {
82789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return status;
82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        *num_ports = (unsigned int)reply.readInt32();
83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        reply.read(ports, *num_ports * sizeof(struct audio_port));
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return status;
83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
833c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
834c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
835c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (port == NULL) {
836c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BAD_VALUE;
837c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        }
838c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
839c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
840c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(port, sizeof(struct audio_port));
841fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
842c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (status != NO_ERROR ||
843c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
844c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return status;
845c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        }
846c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        reply.read(port, sizeof(struct audio_port));
8473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        return status;
848fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    }
849c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
850c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                       audio_patch_handle_t *handle)
851c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
852c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (patch == NULL || handle == NULL) {
853c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BAD_VALUE;
854c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        }
855c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
856c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
857c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(patch, sizeof(struct audio_patch));
858fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
859fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
860fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        if (status != NO_ERROR ||
861c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
862c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return status;
863c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        }
864c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
865fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        return status;
866c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
867c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
868c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
869c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
870fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
871c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
872c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
873c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (status != NO_ERROR) {
874c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            status = (status_t)reply.readInt32();
875fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        }
876c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return status;
877c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
878c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
879c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                                      struct audio_patch *patches)
880c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
881c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
882c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return BAD_VALUE;
883c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        }
884c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
885c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
886fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(*num_patches);
887c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
888c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (status != NO_ERROR ||
889c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
890c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return status;
891fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        }
892c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        *num_patches = (unsigned int)reply.readInt32();
893c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
894c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return status;
895c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
896c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
897c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
898c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (config == NULL) {
89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BAD_VALUE;
900fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        }
90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
903c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.write(config, sizeof(struct audio_port_config));
90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
905c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        if (status != NO_ERROR) {
906fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            status = (status_t)reply.readInt32();
907fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        }
90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return status;
90989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
910f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
911f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
912f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
913f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
914f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInt32(sessionId);
915f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        status_t status = remote()->transact(GET_AUDIO_HW_SYNC, data, &reply);
916342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status != NO_ERROR) {
917342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return AUDIO_HW_SYNC_INVALID;
918342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
919342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return (audio_hw_sync_t)reply.readInt32();
920342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
921342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    virtual status_t systemReady()
922342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
923342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
924342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
925342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
926342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
927342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
928342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
92905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
93005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
93105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInt32((int32_t) ioHandle);
93205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
93305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        if (status != NO_ERROR) {
93405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return 0;
935be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
936be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return reply.readInt64();
937be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
938be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent};
939be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
9403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco NelissenIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
9413a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
9423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen// ----------------------------------------------------------------------
9433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
9443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissenstatus_t BnAudioFlinger::onTransact(
9453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
9463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen{
9473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    // Whitelist of relevant events to trigger log merging.
9483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    // Log merging should activate during audio activity of any kind. This are considered the
9493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    // most relevant events.
9503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    // TODO should select more wisely the items from the list
9513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    switch (code) {
952be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_TRACK:
953be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case OPEN_RECORD:
954be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SET_MASTER_VOLUME:
955be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SET_MASTER_MUTE:
956be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SET_STREAM_VOLUME:
957be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SET_STREAM_MUTE:
958be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SET_MIC_MUTE:
959be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SET_PARAMETERS:
960be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case OPEN_INPUT:
961be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SET_VOICE_VOLUME:
962ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case CREATE_EFFECT:
963be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case SYSTEM_READY: {
964be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            requestLogMerge();
965ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            break;
966be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
967be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        default:
968be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            break;
969be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
970be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    switch (code) {
971be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_TRACK: {
972be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
973be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int streamType = data.readInt32();
974be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            uint32_t sampleRate = data.readInt32();
975be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            audio_format_t format = (audio_format_t) data.readInt32();
976be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            audio_channel_mask_t channelMask = data.readInt32();
977be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            size_t frameCount = data.readInt64();
978be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
979be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            bool haveSharedBuffer = data.readInt32() != 0;
980be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IMemory> buffer;
981be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (haveSharedBuffer) {
982be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                buffer = interface_cast<IMemory>(data.readStrongBinder());
983be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
984be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
985be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            pid_t pid = (pid_t) data.readInt32();
986be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            pid_t tid = (pid_t) data.readInt32();
987be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            audio_session_t sessionId = (audio_session_t) data.readInt32();
988be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int clientUid = data.readInt32();
989be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
990be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = NO_ERROR;
991be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IAudioTrack> track;
992be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if ((haveSharedBuffer && (buffer == 0)) ||
993be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                    ((buffer != 0) && (buffer->pointer() == NULL))) {
994be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                ALOGW("CREATE_TRACK: cannot retrieve shared memory");
995be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                status = DEAD_OBJECT;
99605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            } else {
997be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                track = createTrack(
998be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                        (audio_stream_type_t) streamType, sampleRate, format,
999be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                        channelMask, &frameCount, &flags, buffer, output, pid, tid,
1000be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                        &sessionId, clientUid, &status, portId);
1001be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
1002be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1003be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt64(frameCount);
1004be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(flags);
1005de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(sessionId);
1006de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(status);
1007de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeStrongBinder(IInterface::asBinder(track));
1008de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1009de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1010de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case OPEN_RECORD: {
1011de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1012de070137f11d346fba77605bd76a44c040a618fcEric Laurent            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            audio_format_t format = (audio_format_t) data.readInt32();
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            audio_channel_mask_t channelMask = data.readInt32();
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            const String16& opPackageName = data.readString16();
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            size_t frameCount = data.readInt64();
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t pid = (pid_t) data.readInt32();
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pid_t tid = (pid_t) data.readInt32();
1021            int clientUid = data.readInt32();
1022            audio_session_t sessionId = (audio_session_t) data.readInt32();
1023            size_t notificationFrames = data.readInt64();
1024            audio_port_handle_t portId = (audio_port_handle_t) data.readInt32();
1025            sp<IMemory> cblk;
1026            sp<IMemory> buffers;
1027            status_t status = NO_ERROR;
1028            sp<IAudioRecord> record = openRecord(input,
1029                    sampleRate, format, channelMask, opPackageName, &frameCount, &flags,
1030                    pid, tid, clientUid, &sessionId, &notificationFrames, cblk, buffers,
1031                    &status, portId);
1032            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
1033            reply->writeInt64(frameCount);
1034            reply->writeInt32(flags);
1035            reply->writeInt32(sessionId);
1036            reply->writeInt64(notificationFrames);
1037            reply->writeInt32(status);
1038            reply->writeStrongBinder(IInterface::asBinder(record));
1039            reply->writeStrongBinder(IInterface::asBinder(cblk));
1040            reply->writeStrongBinder(IInterface::asBinder(buffers));
1041            return NO_ERROR;
1042        } break;
1043        case SAMPLE_RATE: {
1044            CHECK_INTERFACE(IAudioFlinger, data, reply);
1045            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
1046            return NO_ERROR;
1047        } break;
1048
1049        // RESERVED for channelCount()
1050
1051        case FORMAT: {
1052            CHECK_INTERFACE(IAudioFlinger, data, reply);
1053            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
1054            return NO_ERROR;
1055        } break;
1056        case FRAME_COUNT: {
1057            CHECK_INTERFACE(IAudioFlinger, data, reply);
1058            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
1059            return NO_ERROR;
1060        } break;
1061        case LATENCY: {
1062            CHECK_INTERFACE(IAudioFlinger, data, reply);
1063            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
1064            return NO_ERROR;
1065        } break;
1066        case SET_MASTER_VOLUME: {
1067            CHECK_INTERFACE(IAudioFlinger, data, reply);
1068            reply->writeInt32( setMasterVolume(data.readFloat()) );
1069            return NO_ERROR;
1070        } break;
1071        case SET_MASTER_MUTE: {
1072            CHECK_INTERFACE(IAudioFlinger, data, reply);
1073            reply->writeInt32( setMasterMute(data.readInt32()) );
1074            return NO_ERROR;
1075        } break;
1076        case MASTER_VOLUME: {
1077            CHECK_INTERFACE(IAudioFlinger, data, reply);
1078            reply->writeFloat( masterVolume() );
1079            return NO_ERROR;
1080        } break;
1081        case MASTER_MUTE: {
1082            CHECK_INTERFACE(IAudioFlinger, data, reply);
1083            reply->writeInt32( masterMute() );
1084            return NO_ERROR;
1085        } break;
1086        case SET_STREAM_VOLUME: {
1087            CHECK_INTERFACE(IAudioFlinger, data, reply);
1088            int stream = data.readInt32();
1089            float volume = data.readFloat();
1090            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1091            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
1092            return NO_ERROR;
1093        } break;
1094        case SET_STREAM_MUTE: {
1095            CHECK_INTERFACE(IAudioFlinger, data, reply);
1096            int stream = data.readInt32();
1097            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
1098            return NO_ERROR;
1099        } break;
1100        case STREAM_VOLUME: {
1101            CHECK_INTERFACE(IAudioFlinger, data, reply);
1102            int stream = data.readInt32();
1103            int output = data.readInt32();
1104            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
1105            return NO_ERROR;
1106        } break;
1107        case STREAM_MUTE: {
1108            CHECK_INTERFACE(IAudioFlinger, data, reply);
1109            int stream = data.readInt32();
1110            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
1111            return NO_ERROR;
1112        } break;
1113        case SET_MODE: {
1114            CHECK_INTERFACE(IAudioFlinger, data, reply);
1115            audio_mode_t mode = (audio_mode_t) data.readInt32();
1116            reply->writeInt32( setMode(mode) );
1117            return NO_ERROR;
1118        } break;
1119        case SET_MIC_MUTE: {
1120            CHECK_INTERFACE(IAudioFlinger, data, reply);
1121            int state = data.readInt32();
1122            reply->writeInt32( setMicMute(state) );
1123            return NO_ERROR;
1124        } break;
1125        case GET_MIC_MUTE: {
1126            CHECK_INTERFACE(IAudioFlinger, data, reply);
1127            reply->writeInt32( getMicMute() );
1128            return NO_ERROR;
1129        } break;
1130        case SET_PARAMETERS: {
1131            CHECK_INTERFACE(IAudioFlinger, data, reply);
1132            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1133            String8 keyValuePairs(data.readString8());
1134            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
1135            return NO_ERROR;
1136        } break;
1137        case GET_PARAMETERS: {
1138            CHECK_INTERFACE(IAudioFlinger, data, reply);
1139            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1140            String8 keys(data.readString8());
1141            reply->writeString8(getParameters(ioHandle, keys));
1142            return NO_ERROR;
1143        } break;
1144
1145        case REGISTER_CLIENT: {
1146            CHECK_INTERFACE(IAudioFlinger, data, reply);
1147            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
1148                    data.readStrongBinder());
1149            registerClient(client);
1150            return NO_ERROR;
1151        } break;
1152        case GET_INPUTBUFFERSIZE: {
1153            CHECK_INTERFACE(IAudioFlinger, data, reply);
1154            uint32_t sampleRate = data.readInt32();
1155            audio_format_t format = (audio_format_t) data.readInt32();
1156            audio_channel_mask_t channelMask = data.readInt32();
1157            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
1158            return NO_ERROR;
1159        } break;
1160        case OPEN_OUTPUT: {
1161            CHECK_INTERFACE(IAudioFlinger, data, reply);
1162            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1163            audio_config_t config = {};
1164            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1165                ALOGE("b/23905951");
1166            }
1167            audio_devices_t devices = (audio_devices_t)data.readInt32();
1168            String8 address(data.readString8());
1169            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1170            uint32_t latencyMs = 0;
1171            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1172            status_t status = openOutput(module, &output, &config,
1173                                         &devices, address, &latencyMs, flags);
1174            ALOGV("OPEN_OUTPUT output, %d", output);
1175            reply->writeInt32((int32_t)status);
1176            if (status == NO_ERROR) {
1177                reply->writeInt32((int32_t)output);
1178                reply->write(&config, sizeof(audio_config_t));
1179                reply->writeInt32(devices);
1180                reply->writeInt32(latencyMs);
1181            }
1182            return NO_ERROR;
1183        } break;
1184        case OPEN_DUPLICATE_OUTPUT: {
1185            CHECK_INTERFACE(IAudioFlinger, data, reply);
1186            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
1187            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
1188            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1189            return NO_ERROR;
1190        } break;
1191        case CLOSE_OUTPUT: {
1192            CHECK_INTERFACE(IAudioFlinger, data, reply);
1193            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1194            return NO_ERROR;
1195        } break;
1196        case SUSPEND_OUTPUT: {
1197            CHECK_INTERFACE(IAudioFlinger, data, reply);
1198            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1199            return NO_ERROR;
1200        } break;
1201        case RESTORE_OUTPUT: {
1202            CHECK_INTERFACE(IAudioFlinger, data, reply);
1203            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1204            return NO_ERROR;
1205        } break;
1206        case OPEN_INPUT: {
1207            CHECK_INTERFACE(IAudioFlinger, data, reply);
1208            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1209            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1210            audio_config_t config = {};
1211            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1212                ALOGE("b/23905951");
1213            }
1214            audio_devices_t device = (audio_devices_t)data.readInt32();
1215            String8 address(data.readString8());
1216            audio_source_t source = (audio_source_t)data.readInt32();
1217            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1218
1219            status_t status = openInput(module, &input, &config,
1220                                        &device, address, source, flags);
1221            reply->writeInt32((int32_t) status);
1222            if (status == NO_ERROR) {
1223                reply->writeInt32((int32_t) input);
1224                reply->write(&config, sizeof(audio_config_t));
1225                reply->writeInt32(device);
1226            }
1227            return NO_ERROR;
1228        } break;
1229        case CLOSE_INPUT: {
1230            CHECK_INTERFACE(IAudioFlinger, data, reply);
1231            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
1232            return NO_ERROR;
1233        } break;
1234        case INVALIDATE_STREAM: {
1235            CHECK_INTERFACE(IAudioFlinger, data, reply);
1236            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1237            reply->writeInt32(invalidateStream(stream));
1238            return NO_ERROR;
1239        } break;
1240        case SET_VOICE_VOLUME: {
1241            CHECK_INTERFACE(IAudioFlinger, data, reply);
1242            float volume = data.readFloat();
1243            reply->writeInt32( setVoiceVolume(volume) );
1244            return NO_ERROR;
1245        } break;
1246        case GET_RENDER_POSITION: {
1247            CHECK_INTERFACE(IAudioFlinger, data, reply);
1248            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1249            uint32_t halFrames = 0;
1250            uint32_t dspFrames = 0;
1251            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1252            reply->writeInt32(status);
1253            if (status == NO_ERROR) {
1254                reply->writeInt32(halFrames);
1255                reply->writeInt32(dspFrames);
1256            }
1257            return NO_ERROR;
1258        }
1259        case GET_INPUT_FRAMES_LOST: {
1260            CHECK_INTERFACE(IAudioFlinger, data, reply);
1261            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1262            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
1263            return NO_ERROR;
1264        } break;
1265        case NEW_AUDIO_SESSION_ID: {
1266            CHECK_INTERFACE(IAudioFlinger, data, reply);
1267            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1268            return NO_ERROR;
1269        } break;
1270        case ACQUIRE_AUDIO_SESSION_ID: {
1271            CHECK_INTERFACE(IAudioFlinger, data, reply);
1272            audio_session_t audioSession = (audio_session_t) data.readInt32();
1273            int pid = data.readInt32();
1274            acquireAudioSessionId(audioSession, pid);
1275            return NO_ERROR;
1276        } break;
1277        case RELEASE_AUDIO_SESSION_ID: {
1278            CHECK_INTERFACE(IAudioFlinger, data, reply);
1279            audio_session_t audioSession = (audio_session_t) data.readInt32();
1280            int pid = data.readInt32();
1281            releaseAudioSessionId(audioSession, pid);
1282            return NO_ERROR;
1283        } break;
1284        case QUERY_NUM_EFFECTS: {
1285            CHECK_INTERFACE(IAudioFlinger, data, reply);
1286            uint32_t numEffects = 0;
1287            status_t status = queryNumberEffects(&numEffects);
1288            reply->writeInt32(status);
1289            if (status == NO_ERROR) {
1290                reply->writeInt32((int32_t)numEffects);
1291            }
1292            return NO_ERROR;
1293        }
1294        case QUERY_EFFECT: {
1295            CHECK_INTERFACE(IAudioFlinger, data, reply);
1296            effect_descriptor_t desc = {};
1297            status_t status = queryEffect(data.readInt32(), &desc);
1298            reply->writeInt32(status);
1299            if (status == NO_ERROR) {
1300                reply->write(&desc, sizeof(effect_descriptor_t));
1301            }
1302            return NO_ERROR;
1303        }
1304        case GET_EFFECT_DESCRIPTOR: {
1305            CHECK_INTERFACE(IAudioFlinger, data, reply);
1306            effect_uuid_t uuid;
1307            data.read(&uuid, sizeof(effect_uuid_t));
1308            effect_descriptor_t desc = {};
1309            status_t status = getEffectDescriptor(&uuid, &desc);
1310            reply->writeInt32(status);
1311            if (status == NO_ERROR) {
1312                reply->write(&desc, sizeof(effect_descriptor_t));
1313            }
1314            return NO_ERROR;
1315        }
1316        case CREATE_EFFECT: {
1317            CHECK_INTERFACE(IAudioFlinger, data, reply);
1318            effect_descriptor_t desc = {};
1319            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1320                ALOGE("b/23905951");
1321            }
1322            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1323            int32_t priority = data.readInt32();
1324            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1325            audio_session_t sessionId = (audio_session_t) data.readInt32();
1326            const String16 opPackageName = data.readString16();
1327            pid_t pid = (pid_t)data.readInt32();
1328
1329            status_t status = NO_ERROR;
1330            int id = 0;
1331            int enabled = 0;
1332
1333            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1334                    opPackageName, pid, &status, &id, &enabled);
1335            reply->writeInt32(status);
1336            reply->writeInt32(id);
1337            reply->writeInt32(enabled);
1338            reply->writeStrongBinder(IInterface::asBinder(effect));
1339            reply->write(&desc, sizeof(effect_descriptor_t));
1340            return NO_ERROR;
1341        } break;
1342        case MOVE_EFFECTS: {
1343            CHECK_INTERFACE(IAudioFlinger, data, reply);
1344            audio_session_t session = (audio_session_t) data.readInt32();
1345            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1346            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1347            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1348            return NO_ERROR;
1349        } break;
1350        case LOAD_HW_MODULE: {
1351            CHECK_INTERFACE(IAudioFlinger, data, reply);
1352            reply->writeInt32(loadHwModule(data.readCString()));
1353            return NO_ERROR;
1354        } break;
1355        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1356            CHECK_INTERFACE(IAudioFlinger, data, reply);
1357            reply->writeInt32(getPrimaryOutputSamplingRate());
1358            return NO_ERROR;
1359        } break;
1360        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1361            CHECK_INTERFACE(IAudioFlinger, data, reply);
1362            reply->writeInt64(getPrimaryOutputFrameCount());
1363            return NO_ERROR;
1364        } break;
1365        case SET_LOW_RAM_DEVICE: {
1366            CHECK_INTERFACE(IAudioFlinger, data, reply);
1367            bool isLowRamDevice = data.readInt32() != 0;
1368            reply->writeInt32(setLowRamDevice(isLowRamDevice));
1369            return NO_ERROR;
1370        } break;
1371        case LIST_AUDIO_PORTS: {
1372            CHECK_INTERFACE(IAudioFlinger, data, reply);
1373            unsigned int numPortsReq = data.readInt32();
1374            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1375                numPortsReq = MAX_ITEMS_PER_LIST;
1376            }
1377            unsigned int numPorts = numPortsReq;
1378            struct audio_port *ports =
1379                    (struct audio_port *)calloc(numPortsReq,
1380                                                           sizeof(struct audio_port));
1381            if (ports == NULL) {
1382                reply->writeInt32(NO_MEMORY);
1383                reply->writeInt32(0);
1384                return NO_ERROR;
1385            }
1386            status_t status = listAudioPorts(&numPorts, ports);
1387            reply->writeInt32(status);
1388            reply->writeInt32(numPorts);
1389            if (status == NO_ERROR) {
1390                if (numPortsReq > numPorts) {
1391                    numPortsReq = numPorts;
1392                }
1393                reply->write(ports, numPortsReq * sizeof(struct audio_port));
1394            }
1395            free(ports);
1396            return NO_ERROR;
1397        } break;
1398        case GET_AUDIO_PORT: {
1399            CHECK_INTERFACE(IAudioFlinger, data, reply);
1400            struct audio_port port = {};
1401            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1402                ALOGE("b/23905951");
1403            }
1404            status_t status = getAudioPort(&port);
1405            reply->writeInt32(status);
1406            if (status == NO_ERROR) {
1407                reply->write(&port, sizeof(struct audio_port));
1408            }
1409            return NO_ERROR;
1410        } break;
1411        case CREATE_AUDIO_PATCH: {
1412            CHECK_INTERFACE(IAudioFlinger, data, reply);
1413            struct audio_patch patch;
1414            data.read(&patch, sizeof(struct audio_patch));
1415            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1416            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1417                ALOGE("b/23905951");
1418            }
1419            status_t status = createAudioPatch(&patch, &handle);
1420            reply->writeInt32(status);
1421            if (status == NO_ERROR) {
1422                reply->write(&handle, sizeof(audio_patch_handle_t));
1423            }
1424            return NO_ERROR;
1425        } break;
1426        case RELEASE_AUDIO_PATCH: {
1427            CHECK_INTERFACE(IAudioFlinger, data, reply);
1428            audio_patch_handle_t handle;
1429            data.read(&handle, sizeof(audio_patch_handle_t));
1430            status_t status = releaseAudioPatch(handle);
1431            reply->writeInt32(status);
1432            return NO_ERROR;
1433        } break;
1434        case LIST_AUDIO_PATCHES: {
1435            CHECK_INTERFACE(IAudioFlinger, data, reply);
1436            unsigned int numPatchesReq = data.readInt32();
1437            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1438                numPatchesReq = MAX_ITEMS_PER_LIST;
1439            }
1440            unsigned int numPatches = numPatchesReq;
1441            struct audio_patch *patches =
1442                    (struct audio_patch *)calloc(numPatchesReq,
1443                                                 sizeof(struct audio_patch));
1444            if (patches == NULL) {
1445                reply->writeInt32(NO_MEMORY);
1446                reply->writeInt32(0);
1447                return NO_ERROR;
1448            }
1449            status_t status = listAudioPatches(&numPatches, patches);
1450            reply->writeInt32(status);
1451            reply->writeInt32(numPatches);
1452            if (status == NO_ERROR) {
1453                if (numPatchesReq > numPatches) {
1454                    numPatchesReq = numPatches;
1455                }
1456                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
1457            }
1458            free(patches);
1459            return NO_ERROR;
1460        } break;
1461        case SET_AUDIO_PORT_CONFIG: {
1462            CHECK_INTERFACE(IAudioFlinger, data, reply);
1463            struct audio_port_config config;
1464            data.read(&config, sizeof(struct audio_port_config));
1465            status_t status = setAudioPortConfig(&config);
1466            reply->writeInt32(status);
1467            return NO_ERROR;
1468        } break;
1469        case GET_AUDIO_HW_SYNC: {
1470            CHECK_INTERFACE(IAudioFlinger, data, reply);
1471            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
1472            return NO_ERROR;
1473        } break;
1474        case SYSTEM_READY: {
1475            CHECK_INTERFACE(IAudioFlinger, data, reply);
1476            systemReady();
1477            return NO_ERROR;
1478        } break;
1479        case FRAME_COUNT_HAL: {
1480            CHECK_INTERFACE(IAudioFlinger, data, reply);
1481            reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
1482            return NO_ERROR;
1483        } break;
1484        default:
1485            return BBinder::onTransact(code, data, reply, flags);
1486    }
1487}
1488
1489// ----------------------------------------------------------------------------
1490
1491} // namespace android
1492