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
25b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent#include <binder/IPCThreadState.h>
267562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
27f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent#include <cutils/multiuser.h>
283528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent#include <media/TimeCheck.h>
294980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent#include <private/android_filesystem_config.h>
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3125a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "IAudioFlinger.h"
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
37f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent    CREATE_RECORD,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SAMPLE_RATE,
395876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten    RESERVED,   // obsolete, was CHANNEL_COUNT
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
54f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    SET_RECORD_SILENCED,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
62c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
63c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
64c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
65c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
66d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    INVALIDATE_STREAM,
67342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
69be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
709eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    NEW_AUDIO_UNIQUE_ID,
713a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    ACQUIRE_AUDIO_SESSION_ID,
723a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    RELEASE_AUDIO_SESSION_ID,
73be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
74ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
75be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
76de070137f11d346fba77605bd76a44c040a618fcEric Laurent    CREATE_EFFECT,
77a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    MOVE_EFFECTS,
78cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    LOAD_HW_MODULE,
79cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
80cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_FRAME_COUNT,
814182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    SET_LOW_RAM_DEVICE,
824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PORTS,
834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    GET_AUDIO_PORT,
844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    CREATE_AUDIO_PATCH,
854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    RELEASE_AUDIO_PATCH,
864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PATCHES,
8793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    SET_AUDIO_PORT_CONFIG,
889eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    GET_AUDIO_HW_SYNC_FOR_SESSION,
894a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    SYSTEM_READY,
904a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    FRAME_COUNT_HAL,
919ff780e58ff96ff98acaae4166bb218880bf9e73jiabin    GET_MICROPHONES,
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
94f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024
95f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
99090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioFlinger(const sp<IBinder>& impl)
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent    virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
10521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        CreateTrackOutput& output,
10621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        status_t *status)
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1095841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
11121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (status == nullptr) {
11321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
11521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        input.writeToParcel(&data);
11721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
12021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack transaction error %d", lStatus);
12121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
12221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
12421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        *status = reply.readInt32();
12521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (*status != NO_ERROR) {
12621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned error %d", *status);
12721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
12921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        track = interface_cast<IAudioTrack>(reply.readStrongBinder());
13021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (track == 0) {
13121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned an NULL IAudioTrack with status OK");
13221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
13321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
13421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
13521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        output.readFromParcel(&reply);
1365841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
139f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent    virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input,
140f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                 CreateRecordOutput& output,
141f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                 status_t *status)
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
144ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano        sp<media::IAudioRecord> record;
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
146f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
147f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (status == nullptr) {
148f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
149f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        }
150f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
151f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        input.writeToParcel(&data);
152f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
153f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply);
1545841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
155f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord transaction error %d", lStatus);
156f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            *status = DEAD_OBJECT;
157f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
159f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        *status = reply.readInt32();
160f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (*status != NO_ERROR) {
161f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord returned error %d", *status);
162f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
1633e1acc0c58b337dec4054d78c28b48b2e77e0784Eric Laurent        }
164f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
165f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
166f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (record == 0) {
167f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord returned a NULL IAudioRecord with status OK");
168f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            *status = DEAD_OBJECT;
169f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
170f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        }
171f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        output.readFromParcel(&reply);
1725841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1752c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1792c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1844a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    // RESERVED for channelCount()
1854a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
18672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
19072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
19258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1952c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual size_t frameCount(audio_io_handle_t ioHandle) const
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1992c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
201e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
24872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
252fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
25472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
259fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
263fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
273fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
27472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
279fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
283fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
288f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
293c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
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(state);
302c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
306c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() 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        remote()->transact(GET_MIC_MUTE, data, &reply);
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
314f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    virtual void setRecordSilenced(uid_t uid, bool silenced)
315f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    {
316f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        Parcel data, reply;
317f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
318f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        data.writeInt32(uid);
319f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        data.writeInt32(silenced ? 1 : 0);
320f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        remote()->transact(SET_RECORD_SILENCED, data, &reply);
321f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    }
322f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov
32372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
33772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
34706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
349c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
350c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
351dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
352dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
356c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
358dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
359c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
360e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
363cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
364cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_io_handle_t *output,
365cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_config_t *config,
366cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_devices_t *devices,
367cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                const String8& address,
368cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                uint32_t *latencyMs,
369cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_output_flags_t flags)
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
371cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
372cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
373cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
376a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
377cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
378cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*devices);
379cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
38018868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
381cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
382cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
383cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
384cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
385507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
386cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
387cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
388cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
389cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
390507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
391cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
392cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGV("openOutput() returned output, %d", *output);
393cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
394cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *devices = (audio_devices_t)reply.readInt32();
395cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *latencyMs = reply.readInt32();
396cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
39972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
40072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
402c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
403c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
40472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
40772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
408c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
41072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
412c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
415c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
42372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
424c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
427c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
42872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
43272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
433c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
436c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
437cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openInput(audio_module_handle_t module,
438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_io_handle_t *input,
439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_config_t *config,
440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_devices_t *device,
441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               const String8& address,
442cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_source_t source,
443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_input_flags_t flags)
44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (input == NULL || config == NULL || device == NULL) {
446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
447cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
450a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*input);
452cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*device);
454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(source);
456ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten        data.writeInt32(flags);
457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
459cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
461507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
464cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
466507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
467cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
469cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *device = (audio_devices_t)reply.readInt32();
470cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
472c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
473fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
477fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
478c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
479c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
482d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    virtual status_t invalidateStream(audio_stream_type_t stream)
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
486fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
487d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        remote()->transact(INVALIDATE_STREAM, data, &reply);
488c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
490f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
491f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
492f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
493f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
494f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
495f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
496f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
497f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
498f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
500377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
50172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
50572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
508342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
510507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
512342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
514507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
515342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
516342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
517342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
518342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
519342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
52005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
5215f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
52205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
52305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
52405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
52572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
5265f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
5275f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
5285f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
5295f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
5305f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
53105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
533eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
535be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
536be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
537eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten        data.writeInt32((int32_t) use);
5389eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply);
5399eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE;
540be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
542be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
543be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
544be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
545be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
546d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
551d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
5523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
5533a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5543a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
555d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
5563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5573a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5583a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
560d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
5613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
5623a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5633a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
564f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
5769d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
582f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
588be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
589ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
590ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6025e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
603f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6238d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
625be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
626be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
62772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
628d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                    audio_session_t sessionId,
629be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                    const String16& opPackageName,
630b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                                    pid_t pid,
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
637be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
638be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
639e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
640507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
641e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
642e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
643e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
64706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
64972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
650be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
651be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
652b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent        data.writeInt32((int32_t) pid);
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
65629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
660507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
662be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
664a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
668be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
670507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
674be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
675be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
676de070137f11d346fba77605bd76a44c040a618fcEric Laurent
677d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
67872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
679de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
680de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
681de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
682de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
68372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
68472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
685de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
686de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
687de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
688a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
689a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
690a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
691a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
692a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
693a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
694a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
695a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
696a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
697cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
6983b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
699cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
700cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
701cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
702cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
703cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
704cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
705cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
706e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
707cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
708cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
709cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
710cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
711e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
712cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
713cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7146f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung    virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override
7154182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7164182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7176f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung
7186f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung        static_assert(NO_ERROR == 0, "NO_ERROR must be 0");
7196f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung        return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor())
7206f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: data.writeInt32((int) isLowRamDevice)
7216f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: data.writeInt64(totalMemory)
7226f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply)
7236f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: reply.readInt32();
7244182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7256f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung
7264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
7274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
7284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
7304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
7354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
7364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
7414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
7424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
7454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
7474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
7524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
7534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
7584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
7614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
7624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
7644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
7694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
7704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
7714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
7764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
7794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
7834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
7844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
7854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
7864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
7904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
7914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
82193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
82293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
82393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
82493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
82593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
8269eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply);
82793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
82893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
82993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
83093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
83193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
83272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    virtual status_t systemReady()
83372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    {
83472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        Parcel data, reply;
83572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
83672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
83772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    }
8384a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
8394a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    {
8404a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        Parcel data, reply;
8414a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8424a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInt32((int32_t) ioHandle);
8434a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
8444a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        if (status != NO_ERROR) {
8454a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return 0;
8464a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        }
8474a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        return reply.readInt64();
8484a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    }
84946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin    virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones)
85046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin    {
85146a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        Parcel data, reply;
85246a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8539ff780e58ff96ff98acaae4166bb218880bf9e73jiabin        status_t status = remote()->transact(GET_MICROPHONES, data, &reply);
85446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        if (status != NO_ERROR ||
85546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin                (status = (status_t)reply.readInt32()) != NO_ERROR) {
85646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            return status;
85746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        }
85846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        status = reply.readParcelableVector(microphones);
85946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        return status;
86046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin    }
86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
870b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    // make sure transactions reserved to AudioPolicyManager do not come from other processes
871b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    switch (code) {
872b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_STREAM_VOLUME:
873b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_STREAM_MUTE:
874b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_OUTPUT:
875b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_DUPLICATE_OUTPUT:
876b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CLOSE_OUTPUT:
877b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SUSPEND_OUTPUT:
878b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RESTORE_OUTPUT:
879b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_INPUT:
880b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CLOSE_INPUT:
881b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case INVALIDATE_STREAM:
882b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_VOICE_VOLUME:
883b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case MOVE_EFFECTS:
884b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LOAD_HW_MODULE:
885b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LIST_AUDIO_PORTS:
886b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case GET_AUDIO_PORT:
887b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CREATE_AUDIO_PATCH:
888b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RELEASE_AUDIO_PATCH:
889b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LIST_AUDIO_PATCHES:
890b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_AUDIO_PORT_CONFIG:
891f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        case SET_RECORD_SILENCED:
892b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            ALOGW("%s: transaction %d received from PID %d",
893b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent                  __func__, code, IPCThreadState::self()->getCallingPid());
894ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            // return status only for non void methods
895ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            switch (code) {
896ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                case SET_RECORD_SILENCED:
897ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    break;
898ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                default:
899ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
900ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    break;
901ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            }
902ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent            return OK;
903b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        default:
904b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            break;
905b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    }
906b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent
9074980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    // make sure the following transactions come from system components
9084980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    switch (code) {
9094980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MASTER_VOLUME:
9104980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MASTER_MUTE:
9114980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MODE:
9124980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MIC_MUTE:
9134980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_LOW_RAM_DEVICE:
91496c7eed596077ff84e75b7b1c6f20c3a29219bd1Eric Laurent        case SYSTEM_READY: {
915f1047e87767be1acd2c32f4d36028d1d0014f4c0Eric Laurent            if (multiuser_get_app_id(IPCThreadState::self()->getCallingUid()) >= AID_APP_START) {
9164980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
9174980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                      __func__, code, IPCThreadState::self()->getCallingPid(),
9184980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                      IPCThreadState::self()->getCallingUid());
919ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                // return status only for non void methods
920ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                switch (code) {
921ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    case SYSTEM_READY:
922ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                        break;
923ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                    default:
924ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                        reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION));
925ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                        break;
926ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                }
927ef92bff8d2e8f6ec9a526fdb4fcfead0146a10f3Eric Laurent                return OK;
9284980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent            }
92996c7eed596077ff84e75b7b1c6f20c3a29219bd1Eric Laurent        } break;
9304980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        default:
9314980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent            break;
9324980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    }
9334980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent
934dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Whitelist of relevant events to trigger log merging.
935dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Log merging should activate during audio activity of any kind. This are considered the
936dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // most relevant events.
937dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // TODO should select more wisely the items from the list
938dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    switch (code) {
939dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_TRACK:
940f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        case CREATE_RECORD:
941dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_VOLUME:
942dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_MUTE:
943dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MIC_MUTE:
944dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_PARAMETERS:
945dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_EFFECT:
946dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SYSTEM_READY: {
947dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            requestLogMerge();
948dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
949dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        }
950dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        default:
951dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
952dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    }
953b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent
9543528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent    TimeCheck check("IAudioFlinger");
9553528c9330f481f236f16753cb0846c7d6ddcc7eeEric Laurent
956e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
95921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
96021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackInput input;
96121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
96221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                reply->writeInt32(DEAD_OBJECT);
96321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
9643d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
96521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
96621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            status_t status;
96721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackOutput output;
96821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
96921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            sp<IAudioTrack> track= createTrack(input,
97021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               output,
97121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               &status);
97221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
97321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
97521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (status != NO_ERROR) {
97621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
97721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            }
97806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(track));
97921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            output.writeToParcel(reply);
98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
982f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        case CREATE_RECORD: {
98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
984f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
985f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            CreateRecordInput input;
986f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
987f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                reply->writeInt32(DEAD_OBJECT);
988f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                return NO_ERROR;
989f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            }
990f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
991f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            status_t status;
992f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            CreateRecordOutput output;
993f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
994f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            sp<media::IAudioRecord> record = createRecord(input,
995f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                          output,
996f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                          &status);
997f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
998e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
1000f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            if (status != NO_ERROR) {
1001f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                return NO_ERROR;
1002f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            }
100306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(record));
1004f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            output.writeToParcel(reply);
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
10124a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
10134a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        // RESERVED for channelCount()
10144a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1022e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1030e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1053c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
105472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1055fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1061fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1067fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1068fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1074fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1079f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1094f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        case SET_RECORD_SILENCED: {
1095f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            CHECK_INTERFACE(IAudioFlinger, data, reply);
1096f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            uid_t uid = data.readInt32();
1097f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            audio_source_t source;
1098f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            data.read(&source, sizeof(audio_source_t));
1099f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            bool silenced = data.readInt32() == 1;
1100f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            setRecordSilenced(uid, silenced);
1101f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            return NO_ERROR;
1102f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        } break;
1103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
110572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1106c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1107c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1109e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1110c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1111c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
111272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1116e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1117c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
111889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
111989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
112085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
112185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
112489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
112589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
112689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
112858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1129dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1130e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1133c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1134c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1135a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1136e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1137e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1138e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1139e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1140a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1141cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
11420ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1143983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t latencyMs = 0;
11444cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1145cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1146cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
11477074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1148cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1149cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1150cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1151cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1152cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1153cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1154cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1156c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
115972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
116072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
116172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1162c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1163c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1164c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
116672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1167c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1168c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1169c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1170c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
117172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1172c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1173c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1174c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1175c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
117672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1177c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1178c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1179c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1180c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1181a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1182cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1183e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1184e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1185e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1186e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1187cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1188cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1189cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1190ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1191c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1192cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1193cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1194cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1195cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1196cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1197cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1198cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1199cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1200c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1201c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1202c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
120389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
120472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
120589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
120689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1207d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
120889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1209d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1210d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
121189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
121289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1213f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1214f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1215f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1216f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1217f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1218f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1219342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1220342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
122172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1222983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t halFrames = 0;
1223983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t dspFrames = 0;
1224342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1225342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1226342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1227342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1228342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1229342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1230342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1231342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
123205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
123305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
123472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
12355f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
123605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
123705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
12389eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case NEW_AUDIO_UNIQUE_ID: {
1239be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1240eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1241be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
12433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
12443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1245d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1246d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1247d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
12483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
12503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
12513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1252d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1253d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1254d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
12553a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1259983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t numEffects = 0;
1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1261be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1262be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1263be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1264be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1265be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1267ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1268be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1269983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1270ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1271be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1272be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1273be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1274be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1275be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1276be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1277be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1278be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1279be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1280be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1281983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1282be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1283be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1284be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1285be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1286be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1287be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1288be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1289be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1290be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1291e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            effect_descriptor_t desc = {};
1292e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1293e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1294e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1295be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1296be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
129772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1298d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
1299be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1300b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent            pid_t pid = (pid_t)data.readInt32();
1301b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent
1302983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
1303983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int id = 0;
1304983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int enabled = 0;
130505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
13068d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1307b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                    opPackageName, pid, &status, &id, &enabled);
1308be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1309be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1310be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
131106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(effect));
1312be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1313be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1314be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1315de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1316de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1317d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t session = (audio_session_t) data.readInt32();
131872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
131972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1320de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1321de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1322de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1323a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1324a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1325a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1326a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1327a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1328cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1329cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1330cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1331cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1332cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1333cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1334cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1335e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1336cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1337cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
13384182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
13394182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
13406f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            int32_t isLowRamDevice;
13416f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            int64_t totalMemory;
13426f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            const status_t status =
13436f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                    data.readInt32(&isLowRamDevice) ?:
13446f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                    data.readInt64(&totalMemory) ?:
13456f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                    setLowRamDevice(isLowRamDevice != 0, totalMemory);
13466f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            (void)reply->writeInt32(status);
13474182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
13484182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
13504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1351f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPortsReq = data.readInt32();
1352f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1353f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
1354f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1355f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPorts = numPortsReq;
13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
1357f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_port *)calloc(numPortsReq,
13584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
1359f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (ports == NULL) {
1360f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1361f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1362f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1363f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1364f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPorts(&numPorts, ports);
13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1366f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPorts);
13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1368f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPortsReq > numPorts) {
1369f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPortsReq = numPorts;
1370f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1371f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
13744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
13774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1378e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1379e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1380e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1381e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
13834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
13864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
13904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
13924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1393a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1394e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1395e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1396e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
13984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
14004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
14054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
14074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
14094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
14134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1414f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatchesReq = data.readInt32();
1415f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1416f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
1417f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1418f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatches = numPatchesReq;
14194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
1420f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
14214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
1422f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (patches == NULL) {
1423f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1424f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1425f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1426f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1427f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPatches(&numPatches, patches);
14284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1429f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPatches);
14304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1431f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPatchesReq > numPatches) {
1432f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPatchesReq = numPatches;
1433f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1434f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
14354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
14374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
14404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
14424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
14434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
14444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14479eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case GET_AUDIO_HW_SYNC_FOR_SESSION: {
144893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1449d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
145093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
145193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
145272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        case SYSTEM_READY: {
145372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
145472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            systemReady();
145572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            return NO_ERROR;
145672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        } break;
14574a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        case FRAME_COUNT_HAL: {
14584a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
14594a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
14604a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return NO_ERROR;
14614a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        } break;
14629ff780e58ff96ff98acaae4166bb218880bf9e73jiabin        case GET_MICROPHONES: {
146346a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            CHECK_INTERFACE(IAudioFlinger, data, reply);
146446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            std::vector<media::MicrophoneInfo> microphones;
146546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            status_t status = getMicrophones(&microphones);
146646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            reply->writeInt32(status);
146746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            if (status == NO_ERROR) {
146846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin                reply->writeParcelableVector(microphones);
146946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            }
147046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            return NO_ERROR;
147146a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        }
147289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
147389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
147489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
147589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
147689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
147789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
147889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
147940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1480