IAudioFlinger.cpp revision 9ff780e58ff96ff98acaae4166bb218880bf9e73
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>
274980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent#include <private/android_filesystem_config.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2925a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "IAudioFlinger.h"
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
35f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent    CREATE_RECORD,
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SAMPLE_RATE,
375876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten    RESERVED,   // obsolete, was CHANNEL_COUNT
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
52f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    SET_RECORD_SILENCED,
53c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
62c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
63c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
64d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    INVALIDATE_STREAM,
65342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
67be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
689eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    NEW_AUDIO_UNIQUE_ID,
693a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    ACQUIRE_AUDIO_SESSION_ID,
703a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    RELEASE_AUDIO_SESSION_ID,
71be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
72ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
73be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
74de070137f11d346fba77605bd76a44c040a618fcEric Laurent    CREATE_EFFECT,
75a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    MOVE_EFFECTS,
76cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    LOAD_HW_MODULE,
77cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
78cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_FRAME_COUNT,
794182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    SET_LOW_RAM_DEVICE,
804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PORTS,
814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    GET_AUDIO_PORT,
824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    CREATE_AUDIO_PATCH,
834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    RELEASE_AUDIO_PATCH,
844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PATCHES,
8593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    SET_AUDIO_PORT_CONFIG,
869eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    GET_AUDIO_HW_SYNC_FOR_SESSION,
874a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    SYSTEM_READY,
884a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    FRAME_COUNT_HAL,
899ff780e58ff96ff98acaae4166bb218880bf9e73jiabin    GET_MICROPHONES,
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
92f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024
93f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
97090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioFlinger(const sp<IBinder>& impl)
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent    virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
10321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        CreateTrackOutput& output,
10421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        status_t *status)
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1075841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
10921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (status == nullptr) {
11121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
11321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        input.writeToParcel(&data);
11521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
11821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack transaction error %d", lStatus);
11921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
12021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
12221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        *status = reply.readInt32();
12321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (*status != NO_ERROR) {
12421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned error %d", *status);
12521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
12721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        track = interface_cast<IAudioTrack>(reply.readStrongBinder());
12821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (track == 0) {
12921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned an NULL IAudioTrack with status OK");
13021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
13121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
13221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
13321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        output.readFromParcel(&reply);
1345841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
137f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent    virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input,
138f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                 CreateRecordOutput& output,
139f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                 status_t *status)
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
142ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano        sp<media::IAudioRecord> record;
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
144f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
145f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (status == nullptr) {
146f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
147f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        }
148f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
149f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        input.writeToParcel(&data);
150f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
151f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply);
1525841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
153f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord transaction error %d", lStatus);
154f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            *status = DEAD_OBJECT;
155f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
157f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        *status = reply.readInt32();
158f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (*status != NO_ERROR) {
159f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord returned error %d", *status);
160f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
1613e1acc0c58b337dec4054d78c28b48b2e77e0784Eric Laurent        }
162f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
163f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
164f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (record == 0) {
165f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord returned a NULL IAudioRecord with status OK");
166f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            *status = DEAD_OBJECT;
167f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
168f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        }
169f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        output.readFromParcel(&reply);
1705841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1732c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1772c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1824a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    // RESERVED for channelCount()
1834a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
18472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
18872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
19058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1932c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual size_t frameCount(audio_io_handle_t ioHandle) const
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1972c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
199e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
24672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
250fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
25272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
261fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
271fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
27272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
277fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
281fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
286f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
291c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
295c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
299c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
300c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
304c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
308c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
312f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    virtual void setRecordSilenced(uid_t uid, bool silenced)
313f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    {
314f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        Parcel data, reply;
315f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
316f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        data.writeInt32(uid);
317f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        data.writeInt32(silenced ? 1 : 0);
318f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        remote()->transact(SET_RECORD_SILENCED, data, &reply);
319f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov    }
320f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov
32172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
33172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
33572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
337c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
338c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
344c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
34506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
346c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
347c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
348c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
349dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
350dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
351c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
352c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
353c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
354c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
355c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
356dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
357c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
358e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
361cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
362cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_io_handle_t *output,
363cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_config_t *config,
364cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_devices_t *devices,
365cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                const String8& address,
366cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                uint32_t *latencyMs,
367cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_output_flags_t flags)
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
369cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
370cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
371cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
374a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
375cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
376cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*devices);
377cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
37818868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
379cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
380cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
381cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
382cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
383507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
384cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
385cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
386cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
387cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
388507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
389cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
390cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGV("openOutput() returned output, %d", *output);
391cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
392cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *devices = (audio_devices_t)reply.readInt32();
393cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *latencyMs = reply.readInt32();
394cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
396c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
39772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
39872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
400c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
40272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
40372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
404c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
406c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
407c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
40872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
409c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
411c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
42172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
425c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
42672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
43072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
431c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
432c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
434c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
435cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openInput(audio_module_handle_t module,
436cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_io_handle_t *input,
437cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_config_t *config,
438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_devices_t *device,
439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               const String8& address,
440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_source_t source,
441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_input_flags_t flags)
44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (input == NULL || config == NULL || device == NULL) {
444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
448a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
449cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*input);
450cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*device);
452cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(source);
454ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten        data.writeInt32(flags);
455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
457cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
458cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
459507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
460cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
461cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
462cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
463cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
464507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
465cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
466cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
467cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *device = (audio_devices_t)reply.readInt32();
468cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
470c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
471fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
475fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
476c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
477c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
480d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    virtual status_t invalidateStream(audio_stream_type_t stream)
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
484fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
485d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        remote()->transact(INVALIDATE_STREAM, data, &reply);
486c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
488f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
489f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
490f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
491f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
492f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
493f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
494f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
495f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
496f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
498377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
49972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
500342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
50372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
506342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
507342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
508507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
509342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
510342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
511342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
512507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
513342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
514342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
515342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
516342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
517342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
51805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
5195f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
52005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
52105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
52205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
52372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
5245f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
5255f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
5265f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
5275f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
5285f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
52905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
531eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
532be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
533be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
534be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
535eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten        data.writeInt32((int32_t) use);
5369eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply);
5379eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE;
538be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
539be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
540be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
541be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
542be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
543be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
544d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5463a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
549d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
5503a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
5513a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5523a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
553d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
5543a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5553a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5563a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5573a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
558d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
5593a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
5603a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5613a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
562f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
568be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
5749d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
575be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
576be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
580f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
587ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
588ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
589be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6005e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
601f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
609be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
613be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
614be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
615be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
616be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6218d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
62572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
626d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                    audio_session_t sessionId,
627be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                    const String16& opPackageName,
628b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                                    pid_t pid,
629be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
633be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
635be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
637e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
638507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
639e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
640e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
641e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
642be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
64506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
646be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
64772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
649be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
650b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent        data.writeInt32((int32_t) pid);
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
65429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
656be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
658507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
662a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
663be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
664be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
665be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
666be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
667be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
668507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
669be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
670be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
671be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
672be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
673be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
674de070137f11d346fba77605bd76a44c040a618fcEric Laurent
675d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
67672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
677de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
678de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
679de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
680de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
68172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
68272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
683de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
684de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
685de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
686a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
687a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
688a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
689a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
690a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
691a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
692a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
693a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
694a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
695cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
6963b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
697cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
698cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
699cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
700cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
701cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
702cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
703cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
704e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
705cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
706cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
707cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
708cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
709e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
710cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
711cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7126f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung    virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override
7134182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7144182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7156f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung
7166f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung        static_assert(NO_ERROR == 0, "NO_ERROR must be 0");
7176f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung        return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor())
7186f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: data.writeInt32((int) isLowRamDevice)
7196f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: data.writeInt64(totalMemory)
7206f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply)
7216f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                ?: reply.readInt32();
7224182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7236f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung
7244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
7254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
7264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
7284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
7334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
7344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
7394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
7404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
7434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
7454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
7504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
7514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
7564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
7594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
7604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
7624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
7674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
7684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
7694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
7744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
7774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
7814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
7824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
7834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
7844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
7884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
7894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
7914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
8034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
8054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
8064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
8074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
8084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
8094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
8114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
8134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
8144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
8154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
81993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
82093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
82193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
82293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
82393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
8249eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply);
82593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
82693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
82793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
82893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
82993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
83072e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    virtual status_t systemReady()
83172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    {
83272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        Parcel data, reply;
83372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
83472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
83572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    }
8364a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
8374a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    {
8384a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        Parcel data, reply;
8394a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8404a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInt32((int32_t) ioHandle);
8414a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
8424a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        if (status != NO_ERROR) {
8434a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return 0;
8444a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        }
8454a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        return reply.readInt64();
8464a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    }
84746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin    virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones)
84846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin    {
84946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        Parcel data, reply;
85046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8519ff780e58ff96ff98acaae4166bb218880bf9e73jiabin        status_t status = remote()->transact(GET_MICROPHONES, data, &reply);
85246a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        if (status != NO_ERROR ||
85346a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin                (status = (status_t)reply.readInt32()) != NO_ERROR) {
85446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            return status;
85546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        }
85646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        status = reply.readParcelableVector(microphones);
85746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        return status;
85846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin    }
85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
868b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    // make sure transactions reserved to AudioPolicyManager do not come from other processes
869b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    switch (code) {
870b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_STREAM_VOLUME:
871b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_STREAM_MUTE:
872b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_MODE:
873b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_OUTPUT:
874b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_DUPLICATE_OUTPUT:
875b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CLOSE_OUTPUT:
876b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SUSPEND_OUTPUT:
877b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RESTORE_OUTPUT:
878b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_INPUT:
879b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CLOSE_INPUT:
880b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case INVALIDATE_STREAM:
881b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_VOICE_VOLUME:
882b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case MOVE_EFFECTS:
883b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LOAD_HW_MODULE:
884b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LIST_AUDIO_PORTS:
885b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case GET_AUDIO_PORT:
886b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CREATE_AUDIO_PATCH:
887b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RELEASE_AUDIO_PATCH:
888b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LIST_AUDIO_PATCHES:
889b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_AUDIO_PORT_CONFIG:
890f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        case SET_RECORD_SILENCED:
891b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            ALOGW("%s: transaction %d received from PID %d",
892b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent                  __func__, code, IPCThreadState::self()->getCallingPid());
893b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            return INVALID_OPERATION;
894b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        default:
895b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            break;
896b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    }
897b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent
8984980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    // make sure the following transactions come from system components
8994980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    switch (code) {
9004980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MASTER_VOLUME:
9014980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MASTER_MUTE:
9024980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MODE:
9034980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_MIC_MUTE:
9044980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SET_LOW_RAM_DEVICE:
9054980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        case SYSTEM_READY:
9064980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent            if (IPCThreadState::self()->getCallingUid() >= AID_APP_START) {
9074980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
9084980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                      __func__, code, IPCThreadState::self()->getCallingPid(),
9094980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                      IPCThreadState::self()->getCallingUid());
9104980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent                return INVALID_OPERATION;
9114980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent            }
9124980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent        default:
9134980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent            break;
9144980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent    }
9154980df29f61d5fad95e17ca1d1969f6ca4c1f296Eric Laurent
916dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Whitelist of relevant events to trigger log merging.
917dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Log merging should activate during audio activity of any kind. This are considered the
918dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // most relevant events.
919dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // TODO should select more wisely the items from the list
920dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    switch (code) {
921dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_TRACK:
922f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        case CREATE_RECORD:
923dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_VOLUME:
924dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_MUTE:
925dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MIC_MUTE:
926dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_PARAMETERS:
927dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_EFFECT:
928dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SYSTEM_READY: {
929dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            requestLogMerge();
930dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
931dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        }
932dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        default:
933dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
934dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    }
935b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent
936e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
93921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
94021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackInput input;
94121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
94221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                reply->writeInt32(DEAD_OBJECT);
94321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
9443d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
94521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
94621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            status_t status;
94721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackOutput output;
94821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
94921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            sp<IAudioTrack> track= createTrack(input,
95021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               output,
95121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               &status);
95221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
95321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
95521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (status != NO_ERROR) {
95621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
95721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            }
95806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(track));
95921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            output.writeToParcel(reply);
96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
962f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        case CREATE_RECORD: {
96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
964f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
965f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            CreateRecordInput input;
966f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
967f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                reply->writeInt32(DEAD_OBJECT);
968f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                return NO_ERROR;
969f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            }
970f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
971f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            status_t status;
972f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            CreateRecordOutput output;
973f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
974f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            sp<media::IAudioRecord> record = createRecord(input,
975f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                          output,
976f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                          &status);
977f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
978e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
980f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            if (status != NO_ERROR) {
981f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                return NO_ERROR;
982f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            }
98306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(record));
984f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            output.writeToParcel(reply);
98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
98972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
9924a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
9934a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        // RESERVED for channelCount()
9944a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1002e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1010e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1033c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
103472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1035fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1041fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1047fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1048fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1054fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1059f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1074f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        case SET_RECORD_SILENCED: {
1075f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            CHECK_INTERFACE(IAudioFlinger, data, reply);
1076f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            uid_t uid = data.readInt32();
1077f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            audio_source_t source;
1078f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            data.read(&source, sizeof(audio_source_t));
1079f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            bool silenced = data.readInt32() == 1;
1080f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            setRecordSilenced(uid, silenced);
1081f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov            return NO_ERROR;
1082f4ddfefc8ba59a8486d91826154cc9447821409eSvet Ganov        } break;
1083c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
108572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1089e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1090c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1091c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
109272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1093c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1094c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1095c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1096e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1097c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
110085ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
110185ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
110389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
110689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
110789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
110858f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1109dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1110e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
111189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1113c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1114c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1115a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1116e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1117e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1118e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1119e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1120a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
11220ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1123983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t latencyMs = 0;
11244cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1125cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1126cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
11277074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1128cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1129cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1130cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1131cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1132cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1133cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1134cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1135c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1136c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1137c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1138c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
113972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
114072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
114172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1142c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1143c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1144c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1145c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
114672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1147c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1148c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1149c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1150c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
115172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1152c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1153c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1154c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1155c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
115672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1157c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1158c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1159c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1160c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1161a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1162cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1163e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1164e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1165e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1166e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1167cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1168cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1169cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1170ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1171c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1172cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1173cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1174cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1175cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1176cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1177cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1178cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1179cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1180c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1181c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1182c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
118472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
118589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
118689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1187d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
118889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1189d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1190d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
119189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
119289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1193f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1194f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1195f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1196f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1197f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1198f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1199342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1200342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
120172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1202983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t halFrames = 0;
1203983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t dspFrames = 0;
1204342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1205342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1206342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1207342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1208342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1209342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1210342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1211342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
121205bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
121305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
121472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
12155f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
121605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
121705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
12189eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case NEW_AUDIO_UNIQUE_ID: {
1219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1220eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1221be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1222be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
12233a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
12243a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1225d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1226d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1227d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
12283a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12293a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
12303a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
12313a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1232d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1233d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1234d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
12353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
12363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1238be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1239983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t numEffects = 0;
1240be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1241be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1242be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1243be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1244be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1245be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1246be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1247ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1248be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1249983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1250ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1251be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1252be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1253be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1254be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1255be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1256be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1257be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1258be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1259be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1260be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1261983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1262be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1263be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1264be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1265be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1266be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1267be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1268be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1269be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1270be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1271e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            effect_descriptor_t desc = {};
1272e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1273e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1274e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1275be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1276be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
127772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1278d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
1279be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1280b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent            pid_t pid = (pid_t)data.readInt32();
1281b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent
1282983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
1283983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int id = 0;
1284983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int enabled = 0;
128505bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
12868d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1287b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                    opPackageName, pid, &status, &id, &enabled);
1288be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1289be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1290be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
129106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(effect));
1292be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1293be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1294be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1295de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1296de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1297d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t session = (audio_session_t) data.readInt32();
129872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
129972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1300de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1301de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1302de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1303a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1304a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1305a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1306a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1307a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1308cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1309cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1310cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1311cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1312cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1313cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1314cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1315e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1316cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1317cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
13184182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
13194182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
13206f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            int32_t isLowRamDevice;
13216f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            int64_t totalMemory;
13226f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            const status_t status =
13236f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                    data.readInt32(&isLowRamDevice) ?:
13246f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                    data.readInt64(&totalMemory) ?:
13256f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung                    setLowRamDevice(isLowRamDevice != 0, totalMemory);
13266f248bb57a6a0febe8fc0f253acc86289237ace8Andy Hung            (void)reply->writeInt32(status);
13274182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
13284182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1331f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPortsReq = data.readInt32();
1332f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1335f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPorts = numPortsReq;
13364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
1337f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_port *)calloc(numPortsReq,
13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
1339f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (ports == NULL) {
1340f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1341f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1342f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1343f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1344f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPorts(&numPorts, ports);
13454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1346f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPorts);
13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1348f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPortsReq > numPorts) {
1349f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPortsReq = numPorts;
1350f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1351f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
13524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
13574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1358e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1359e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1360e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1361e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
13664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
13704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
13724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1373a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1374e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1375e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1376e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
13784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
13814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
13854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
13874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
13884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
13894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
13934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1394f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatchesReq = data.readInt32();
1395f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1396f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
1397f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1398f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatches = numPatchesReq;
13994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
1400f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
14014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
1402f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (patches == NULL) {
1403f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1404f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1405f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1406f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1407f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPatches(&numPatches, patches);
14084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1409f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPatches);
14104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1411f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPatchesReq > numPatches) {
1412f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPatchesReq = numPatches;
1413f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1414f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
14154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
14164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
14174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
14204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
14214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
14224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
14234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
14244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
14254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
14264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
14279eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case GET_AUDIO_HW_SYNC_FOR_SESSION: {
142893c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1429d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
143093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
143193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
143272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        case SYSTEM_READY: {
143372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
143472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            systemReady();
143572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            return NO_ERROR;
143672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        } break;
14374a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        case FRAME_COUNT_HAL: {
14384a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
14394a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
14404a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return NO_ERROR;
14414a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        } break;
14429ff780e58ff96ff98acaae4166bb218880bf9e73jiabin        case GET_MICROPHONES: {
144346a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            CHECK_INTERFACE(IAudioFlinger, data, reply);
144446a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            std::vector<media::MicrophoneInfo> microphones;
144546a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            status_t status = getMicrophones(&microphones);
144646a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            reply->writeInt32(status);
144746a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            if (status == NO_ERROR) {
144846a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin                reply->writeParcelableVector(microphones);
144946a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            }
145046a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin            return NO_ERROR;
145146a76fa5ffb88dbde2c67335dbc5cf20b75b10b6jiabin        }
145289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
145389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
145489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
145589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
145689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
145789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
145889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
145940bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1460