IAudioFlinger.cpp revision b1cc36b5d52de7cb3d78426d41dee87f25d7164a
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>
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2825a9e5561a7f14e79b04f713a515a9464b9ea077Steven Moreland#include "IAudioFlinger.h"
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
34f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent    CREATE_RECORD,
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SAMPLE_RATE,
365876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kasten    RESERVED,   // obsolete, was CHANNEL_COUNT
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FORMAT,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FRAME_COUNT,
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LATENCY,
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_VOLUME,
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MASTER_MUTE,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_VOLUME,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MASTER_MUTE,
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_VOLUME,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_STREAM_MUTE,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_VOLUME,
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STREAM_MUTE,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MODE,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SET_MIC_MUTE,
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_MIC_MUTE,
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SET_PARAMETERS,
52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    GET_PARAMETERS,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    REGISTER_CLIENT,
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_INPUTBUFFERSIZE,
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_OUTPUT,
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_DUPLICATE_OUTPUT,
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_OUTPUT,
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    SUSPEND_OUTPUT,
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    RESTORE_OUTPUT,
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    OPEN_INPUT,
61c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    CLOSE_INPUT,
62d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    INVALIDATE_STREAM,
63342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    SET_VOICE_VOLUME,
6405bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    GET_RENDER_POSITION,
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_INPUT_FRAMES_LOST,
669eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    NEW_AUDIO_UNIQUE_ID,
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    ACQUIRE_AUDIO_SESSION_ID,
683a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    RELEASE_AUDIO_SESSION_ID,
69be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    QUERY_NUM_EFFECTS,
70ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    QUERY_EFFECT,
71be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    GET_EFFECT_DESCRIPTOR,
72de070137f11d346fba77605bd76a44c040a618fcEric Laurent    CREATE_EFFECT,
73a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    MOVE_EFFECTS,
74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    LOAD_HW_MODULE,
75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_SAMPLING_RATE,
76cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    GET_PRIMARY_OUTPUT_FRAME_COUNT,
774182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    SET_LOW_RAM_DEVICE,
784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PORTS,
794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    GET_AUDIO_PORT,
804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    CREATE_AUDIO_PATCH,
814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    RELEASE_AUDIO_PATCH,
824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    LIST_AUDIO_PATCHES,
8393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    SET_AUDIO_PORT_CONFIG,
849eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten    GET_AUDIO_HW_SYNC_FOR_SESSION,
854a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    SYSTEM_READY,
864a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    FRAME_COUNT_HAL,
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
89f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent#define MAX_ITEMS_PER_LIST 1024
90f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger>
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
94090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh    explicit BpAudioFlinger(const sp<IBinder>& impl)
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioFlinger>(impl)
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent    virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
10021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        CreateTrackOutput& output,
10121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                        status_t *status)
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
1045841db78dff14898538200287d246577b1fc37e2Eric Laurent        sp<IAudioTrack> track;
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
10621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
10721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (status == nullptr) {
10821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
11021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        input.writeToParcel(&data);
11221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus != NO_ERROR) {
11521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack transaction error %d", lStatus);
11621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
11721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
11821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
11921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        *status = reply.readInt32();
12021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (*status != NO_ERROR) {
12121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned error %d", *status);
12221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
12421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        track = interface_cast<IAudioTrack>(reply.readStrongBinder());
12521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        if (track == 0) {
12621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            ALOGE("createTrack returned an NULL IAudioTrack with status OK");
12721da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            *status = DEAD_OBJECT;
12821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            return track;
12921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        }
13021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent        output.readFromParcel(&reply);
1315841db78dff14898538200287d246577b1fc37e2Eric Laurent        return track;
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
134f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent    virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input,
135f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                 CreateRecordOutput& output,
136f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                 status_t *status)
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
139ff6900d8f991aac0b67b625f8a1d4d0461b4c50eIvan Lozano        sp<media::IAudioRecord> record;
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
141f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
142f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (status == nullptr) {
143f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
144f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        }
145f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
146f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        input.writeToParcel(&data);
147f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
148f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply);
1495841db78dff14898538200287d246577b1fc37e2Eric Laurent        if (lStatus != NO_ERROR) {
150f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord transaction error %d", lStatus);
151f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            *status = DEAD_OBJECT;
152f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
154f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        *status = reply.readInt32();
155f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (*status != NO_ERROR) {
156f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord returned error %d", *status);
157f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
1583e1acc0c58b337dec4054d78c28b48b2e77e0784Eric Laurent        }
159f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
160f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        record = interface_cast<media::IAudioRecord>(reply.readStrongBinder());
161f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        if (record == 0) {
162f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            ALOGE("createRecord returned a NULL IAudioRecord with status OK");
163f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            *status = DEAD_OBJECT;
164f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            return record;
165f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        }
166f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        output.readFromParcel(&reply);
1675841db78dff14898538200287d246577b1fc37e2Eric Laurent        return record;
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1702c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1742c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SAMPLE_RATE, data, &reply);
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1794a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    // RESERVED for channelCount()
1804a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
18172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_format_t format(audio_io_handle_t output) const
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
18572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FORMAT, data, &reply);
18758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        return (audio_format_t) reply.readInt32();
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1902c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten    virtual size_t frameCount(audio_io_handle_t ioHandle) const
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1942c073da0f02c3cf7cd4795af2d861222cbcab72aGlenn Kasten        data.writeInt32((int32_t) ioHandle);
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FRAME_COUNT, data, &reply);
196e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual uint32_t latency(audio_io_handle_t output) const
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
20372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(LATENCY, data, &reply);
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterVolume(float value)
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_VOLUME, data, &reply);
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t setMasterMute(bool muted)
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_MASTER_MUTE, data, &reply);
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual float masterVolume() const
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_VOLUME, data, &reply);
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool masterMute() const
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MASTER_MUTE, data, &reply);
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
24372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output)
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
247fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeFloat(value);
24972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_VOLUME, data, &reply);
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
254fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
258fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(muted);
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(SET_STREAM_MUTE, data, &reply);
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
268fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
26972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_VOLUME, data, &reply);
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readFloat();
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
274fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual bool streamMute(audio_stream_type_t stream) const
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
278fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STREAM_MUTE, data, &reply);
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
283f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten    virtual status_t setMode(audio_mode_t mode)
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(mode);
288c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MODE, data, &reply);
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
292c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual status_t setMicMute(bool state)
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
296c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(state);
297c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_MIC_MUTE, data, &reply);
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
301c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual bool getMicMute() const
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_MIC_MUTE, data, &reply);
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
31372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keyValuePairs);
315c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SET_PARAMETERS, data, &reply);
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
32372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
324c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeString8(keys);
325c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_PARAMETERS, data, &reply);
326c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readString8();
327c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
328c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
329c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    virtual void registerClient(const sp<IAudioFlingerClient>& client)
330c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
331c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
332c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
33306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
334c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(REGISTER_CLIENT, data, &reply);
335c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
336c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
337dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
338dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask) const
339c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
340c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
341c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
342c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(sampleRate);
343c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInt32(format);
344dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten        data.writeInt32(channelMask);
345c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
346e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
349cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openOutput(audio_module_handle_t module,
350cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_io_handle_t *output,
351cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_config_t *config,
352cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_devices_t *devices,
353cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                const String8& address,
354cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                uint32_t *latencyMs,
355cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                audio_output_flags_t flags)
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
357cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) {
358cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
359cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
362a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
363cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
364cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*devices);
365cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
36618868c5db2f90309c6d11e5837822135e4a0c0faGlenn Kasten        data.writeInt32((int32_t) flags);
367cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_OUTPUT, data, &reply);
368cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
369cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
370cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
371507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
372cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
373cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
374cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *output = AUDIO_IO_HANDLE_NONE;
375cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
376507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
377cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *output = (audio_io_handle_t)reply.readInt32();
378cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        ALOGV("openOutput() returned output, %d", *output);
379cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
380cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *devices = (audio_devices_t)reply.readInt32();
381cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *latencyMs = reply.readInt32();
382cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
383c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
384c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
38572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
38672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2)
387c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
388c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
389c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
39072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output1);
39172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output2);
392c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
39372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        return (audio_io_handle_t) reply.readInt32();
394c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    }
395c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
39672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t closeOutput(audio_io_handle_t output)
397c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    {
398c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        Parcel data, reply;
399c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
40072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
401c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_OUTPUT, data, &reply);
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
40572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t suspendOutput(audio_io_handle_t output)
40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
40972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
410c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(SUSPEND_OUTPUT, data, &reply);
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return reply.readInt32();
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
413c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
41472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    virtual status_t restoreOutput(audio_io_handle_t output)
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
41872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
419c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(RESTORE_OUTPUT, data, &reply);
420c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
422c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
423cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent    virtual status_t openInput(audio_module_handle_t module,
424cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_io_handle_t *input,
425cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_config_t *config,
426cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_devices_t *device,
427cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               const String8& address,
428cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_source_t source,
429cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                               audio_input_flags_t flags)
43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
431cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (input == NULL || config == NULL || device == NULL) {
432cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return BAD_VALUE;
433cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        }
43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
436a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInt32(module);
437cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*input);
438cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.write(config, sizeof(audio_config_t));
439cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(*device);
440cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeString8(address);
441cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        data.writeInt32(source);
442ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten        data.writeInt32(flags);
443cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status_t status = remote()->transact(OPEN_INPUT, data, &reply);
444cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
445cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
446cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
447507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
448cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        status = (status_t)reply.readInt32();
449cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        if (status != NO_ERROR) {
450cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            *input = AUDIO_IO_HANDLE_NONE;
451cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            return status;
452507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        }
453cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *input = (audio_io_handle_t)reply.readInt32();
454cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        reply.read(config, sizeof(audio_config_t));
455cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        *device = (audio_devices_t)reply.readInt32();
456cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent        return NO_ERROR;
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
458c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
459fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent    virtual status_t closeInput(int input)
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
463fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent        data.writeInt32(input);
464c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        remote()->transact(CLOSE_INPUT, data, &reply);
465c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
468d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten    virtual status_t invalidateStream(audio_stream_type_t stream)
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
472fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        data.writeInt32((int32_t) stream);
473d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        remote()->transact(INVALIDATE_STREAM, data, &reply);
474c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        return reply.readInt32();
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
476f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent
477f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    virtual status_t setVoiceVolume(float volume)
478f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    {
479f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        Parcel data, reply;
480f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
481f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        data.writeFloat(volume);
482f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        remote()->transact(SET_VOICE_VOLUME, data, &reply);
483f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        return reply.readInt32();
484f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    }
485342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent
486377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
48772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output) const
488342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    {
489342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        Parcel data, reply;
490342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
49172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
492342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        remote()->transact(GET_RENDER_POSITION, data, &reply);
493342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        status_t status = reply.readInt32();
494342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        if (status == NO_ERROR) {
495342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            uint32_t tmp = reply.readInt32();
496507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (halFrames != NULL) {
497342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *halFrames = tmp;
498342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
499342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            tmp = reply.readInt32();
500507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (dspFrames != NULL) {
501342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                *dspFrames = tmp;
502342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
503342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
504342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        return status;
505342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    }
50605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
5075f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const
50805bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    {
50905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        Parcel data, reply;
51005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
51172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) ioHandle);
5125f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
5135f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        if (status != NO_ERROR) {
5145f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            return 0;
5155f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        }
5165f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten        return (uint32_t) reply.readInt32();
51705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    }
518be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
519eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use)
520be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
521be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
522be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
523eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten        data.writeInt32((int32_t) use);
5249eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply);
5259eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE;
526be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
527be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            id = reply.readInt32();
528be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
529be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return id;
530be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
531be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
532d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void acquireAudioSessionId(audio_session_t audioSession, int pid)
5333a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5343a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5353a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5363a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
537d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
5383a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
5393a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5403a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
541d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual void releaseAudioSessionId(audio_session_t audioSession, int pid)
5423a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    {
5433a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        Parcel data, reply;
5443a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5453a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        data.writeInt32(audioSession);
546d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen        data.writeInt32(pid);
5473a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
5483a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    }
5493a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
550f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryNumberEffects(uint32_t *numEffects) const
551be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
552be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
553be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
554be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
555be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
556be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
557be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
558be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
559be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
560be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
561be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
5629d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten        if (numEffects != NULL) {
563be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *numEffects = (uint32_t)reply.readInt32();
564be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
565be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
566be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
567be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
568f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
569be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
570be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDescriptor == NULL) {
571be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
572be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
573be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
574be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
575ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        data.writeInt32(index);
576ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
577be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
578be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
579be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
580be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
581be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
582be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
583be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
584be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
585be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
586be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
587be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
5885e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
589f587ba5b991c7cd91e4df093d0d796bd419e5d67Glenn Kasten            effect_descriptor_t *pDescriptor) const
590be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
591be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pUuid == NULL || pDescriptor == NULL) {
592be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return BAD_VALUE;
593be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
594be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
595be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
596be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pUuid, sizeof(effect_uuid_t));
597be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
598be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
599be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
600be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
601be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status = reply.readInt32();
602be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status != NO_ERROR) {
603be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return status;
604be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
605be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        reply.read(pDescriptor, sizeof(effect_descriptor_t));
606be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return NO_ERROR;
607be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
608be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
6098d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten    virtual sp<IEffect> createEffect(
610be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    effect_descriptor_t *pDesc,
611be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    const sp<IEffectClient>& client,
612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int32_t priority,
61372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                                    audio_io_handle_t output,
614d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                    audio_session_t sessionId,
615be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                    const String16& opPackageName,
616b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                                    pid_t pid,
617be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    status_t *status,
618be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *id,
619be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                                    int *enabled)
620be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
621be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
622be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sp<IEffect> effect;
623be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
624be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (pDesc == NULL) {
625e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            return effect;
626507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (status != NULL) {
627e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten                *status = BAD_VALUE;
628e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
629e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        }
630be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
631be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
632be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.write(pDesc, sizeof(effect_descriptor_t));
63306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(client));
634be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(priority);
63572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) output);
636be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(sessionId);
637be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov        data.writeString16(opPackageName);
638b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent        data.writeInt32((int32_t) pid);
639be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
640be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
641be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (lStatus != NO_ERROR) {
64229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("createEffect error: %s", strerror(-lStatus));
643be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
644be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            lStatus = reply.readInt32();
645be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int tmp = reply.readInt32();
646507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten            if (id != NULL) {
647be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *id = tmp;
648be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
649be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            tmp = reply.readInt32();
650a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten            if (enabled != NULL) {
651be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                *enabled = tmp;
652be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
653be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect = interface_cast<IEffect>(reply.readStrongBinder());
654be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply.read(pDesc, sizeof(effect_descriptor_t));
655be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
656507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        if (status != NULL) {
657be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            *status = lStatus;
658be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
659be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
660be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return effect;
661be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
662de070137f11d346fba77605bd76a44c040a618fcEric Laurent
663d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
66472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput)
665de070137f11d346fba77605bd76a44c040a618fcEric Laurent    {
666de070137f11d346fba77605bd76a44c040a618fcEric Laurent        Parcel data, reply;
667de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
668de070137f11d346fba77605bd76a44c040a618fcEric Laurent        data.writeInt32(session);
66972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) srcOutput);
67072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        data.writeInt32((int32_t) dstOutput);
671de070137f11d346fba77605bd76a44c040a618fcEric Laurent        remote()->transact(MOVE_EFFECTS, data, &reply);
672de070137f11d346fba77605bd76a44c040a618fcEric Laurent        return reply.readInt32();
673de070137f11d346fba77605bd76a44c040a618fcEric Laurent    }
674a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent
675a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    virtual audio_module_handle_t loadHwModule(const char *name)
676a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    {
677a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        Parcel data, reply;
678a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
679a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        data.writeCString(name);
680a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        remote()->transact(LOAD_HW_MODULE, data, &reply);
681a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        return (audio_module_handle_t) reply.readInt32();
682a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    }
683cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
6843b16c766d1ae2cfd8487e8ffb2b23936fc0a8e17Glenn Kasten    virtual uint32_t getPrimaryOutputSamplingRate()
685cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
686cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
687cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
688cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply);
689cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        return reply.readInt32();
690cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
691cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
692e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten    virtual size_t getPrimaryOutputFrameCount()
693cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    {
694cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        Parcel data, reply;
695cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
696cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply);
697e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        return reply.readInt64();
698cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    }
699cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
7004182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    virtual status_t setLowRamDevice(bool isLowRamDevice)
7014182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    {
7024182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        Parcel data, reply;
7034182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7044182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        data.writeInt32((int) isLowRamDevice);
7054182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        remote()->transact(SET_LOW_RAM_DEVICE, data, &reply);
7064182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        return reply.readInt32();
7074182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten    }
7084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPorts(unsigned int *num_ports,
7094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                    struct audio_port *ports)
7104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_ports == NULL || *num_ports == 0 || ports == NULL) {
7124b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7134b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7144b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7154b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_ports);
7174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply);
7184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_ports = (unsigned int)reply.readInt32();
7234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(ports, *num_ports * sizeof(struct audio_port));
7244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t getAudioPort(struct audio_port *port)
7274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (port == NULL) {
7294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7334b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(port, sizeof(struct audio_port));
7344b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply);
7354b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7364b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7374b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7394b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(port, sizeof(struct audio_port));
7404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7414b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7424b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t createAudioPatch(const struct audio_patch *patch,
7434b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                       audio_patch_handle_t *handle)
7444b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7454b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (patch == NULL || handle == NULL) {
7464b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7484b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7504b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(patch, sizeof(struct audio_patch));
7514b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(handle, sizeof(audio_patch_handle_t));
7524b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply);
7534b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(handle, sizeof(audio_patch_handle_t));
7584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t releaseAudioPatch(audio_patch_handle_t handle)
7614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(&handle, sizeof(audio_patch_handle_t));
7654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply);
7664b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
7674b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
7684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7704b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7714b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t listAudioPatches(unsigned int *num_patches,
7724b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                      struct audio_patch *patches)
7734b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7744b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (num_patches == NULL || *num_patches == 0 || patches == NULL) {
7754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7764b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7784b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7794b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInt32(*num_patches);
7804b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply);
7814b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR ||
7824b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                (status = (status_t)reply.readInt32()) != NO_ERROR) {
7834b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return status;
7844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7854b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        *num_patches = (unsigned int)reply.readInt32();
7864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        reply.read(patches, *num_patches * sizeof(struct audio_patch));
7874b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
7884b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
7894b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    virtual status_t setAudioPortConfig(const struct audio_port_config *config)
7904b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    {
7914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (config == NULL) {
7924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return BAD_VALUE;
7934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
7944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        Parcel data, reply;
7954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
7964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        data.write(config, sizeof(struct audio_port_config));
7974b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply);
7984b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        if (status != NO_ERROR) {
7994b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status = (status_t)reply.readInt32();
8004b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        }
8014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        return status;
8024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent    }
80393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId)
80493c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    {
80593c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        Parcel data, reply;
80693c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
80793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        data.writeInt32(sessionId);
8089eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply);
80993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        if (status != NO_ERROR) {
81093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return AUDIO_HW_SYNC_INVALID;
81193c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        }
81293c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        return (audio_hw_sync_t)reply.readInt32();
81393c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent    }
81472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    virtual status_t systemReady()
81572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    {
81672e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        Parcel data, reply;
81772e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
81872e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY);
81972e3f39146fce4686bd96f11057c051bea376dfbEric Laurent    }
8204a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const
8214a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    {
8224a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        Parcel data, reply;
8234a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
8244a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        data.writeInt32((int32_t) ioHandle);
8254a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply);
8264a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        if (status != NO_ERROR) {
8274a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return 0;
8284a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        }
8294a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        return reply.readInt64();
8304a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten    }
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioFlinger::onTransact(
83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
840b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    // make sure transactions reserved to AudioPolicyManager do not come from other processes
841b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    switch (code) {
842b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_STREAM_VOLUME:
843b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_STREAM_MUTE:
844b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_MODE:
845b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_OUTPUT:
846b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_DUPLICATE_OUTPUT:
847b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CLOSE_OUTPUT:
848b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SUSPEND_OUTPUT:
849b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RESTORE_OUTPUT:
850b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case OPEN_INPUT:
851b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CLOSE_INPUT:
852b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case INVALIDATE_STREAM:
853b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_VOICE_VOLUME:
854b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case MOVE_EFFECTS:
855b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LOAD_HW_MODULE:
856b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LIST_AUDIO_PORTS:
857b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case GET_AUDIO_PORT:
858b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case CREATE_AUDIO_PATCH:
859b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case RELEASE_AUDIO_PATCH:
860b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case LIST_AUDIO_PATCHES:
861b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        case SET_AUDIO_PORT_CONFIG:
862b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            ALOGW("%s: transaction %d received from PID %d",
863b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent                  __func__, code, IPCThreadState::self()->getCallingPid());
864b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            return INVALID_OPERATION;
865b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent        default:
866b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent            break;
867b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent    }
868b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent
869dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Whitelist of relevant events to trigger log merging.
870dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // Log merging should activate during audio activity of any kind. This are considered the
871dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // most relevant events.
872dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    // TODO should select more wisely the items from the list
873dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    switch (code) {
874dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_TRACK:
875f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        case CREATE_RECORD:
876dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_VOLUME:
877dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MASTER_MUTE:
878dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_MIC_MUTE:
879dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SET_PARAMETERS:
880dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case CREATE_EFFECT:
881dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        case SYSTEM_READY: {
882dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            requestLogMerge();
883dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
884dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        }
885dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet        default:
886dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet            break;
887dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    }
888b1cc36b5d52de7cb3d78426d41dee87f25d7164aEric Laurent
889e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case CREATE_TRACK: {
89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
89221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
89321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackInput input;
89421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
89521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                reply->writeInt32(DEAD_OBJECT);
89621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
8973d00aa6de95fb46e36f2bab4e3facdf0b96acf06Eric Laurent            }
89821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
89921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            status_t status;
90021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            CreateTrackOutput output;
90121da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
90221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            sp<IAudioTrack> track= createTrack(input,
90321da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               output,
90421da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                                               &status);
90521da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent
90621da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR));
90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
90821da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            if (status != NO_ERROR) {
90921da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent                return NO_ERROR;
91021da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            }
91106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(track));
91221da647792c0b78ab3943be0f32066015d5e8c34Eric Laurent            output.writeToParcel(reply);
91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
915f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent        case CREATE_RECORD: {
91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
917f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
918f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            CreateRecordInput input;
919f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            if (input.readFromParcel((Parcel*)&data) != NO_ERROR) {
920f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                reply->writeInt32(DEAD_OBJECT);
921f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                return NO_ERROR;
922f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            }
923f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
924f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            status_t status;
925f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            CreateRecordOutput output;
926f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
927f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            sp<media::IAudioRecord> record = createRecord(input,
928f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                          output,
929f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                                                          &status);
930f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent
931e93cf2ca27ae6f4a81d4ef548bbf10a34db6d98fGlenn Kasten            LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32(status);
933f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            if (status != NO_ERROR) {
934f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent                return NO_ERROR;
935f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            }
93606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(record));
937f14db3c3ebc1ea29b3eb5b7e9b944cabcb5f83ffEric Laurent            output.writeToParcel(reply);
93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SAMPLE_RATE: {
94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
94272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
9454a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
9464a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        // RESERVED for channelCount()
9474a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten
94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FORMAT: {
94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
95072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
95289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
95389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FRAME_COUNT: {
95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
955e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) );
95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case LATENCY: {
95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
96072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
963e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case SET_MASTER_VOLUME: {
96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterVolume(data.readFloat()) );
96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MASTER_MUTE: {
96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMasterMute(data.readInt32()) );
97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_VOLUME: {
97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeFloat( masterVolume() );
97689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MASTER_MUTE: {
97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( masterMute() );
98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_VOLUME: {
98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
986c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            float volume = data.readFloat();
98772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
988fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_STREAM_MUTE: {
99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
994fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_VOLUME: {
99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1000fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent            int output = data.readInt32();
1001fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STREAM_MUTE: {
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int stream = data.readInt32();
1007fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MODE: {
101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1012f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten            audio_mode_t mode = (audio_mode_t) data.readInt32();
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMode(mode) );
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case SET_MIC_MUTE: {
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            int state = data.readInt32();
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( setMicMute(state) );
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_MIC_MUTE: {
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeInt32( getMicMute() );
102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1027c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SET_PARAMETERS: {
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
102972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1030c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keyValuePairs(data.readString8());
1031c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
1033e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1034c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case GET_PARAMETERS: {
1035c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
103672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
1037c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            String8 keys(data.readString8());
1038c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            reply->writeString8(getParameters(ioHandle, keys));
1039c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1040e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        } break;
1041c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case REGISTER_CLIENT: {
104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
104485ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(
104585ab62c4b433df3f1a9826bed1c9bec07a86c750Glenn Kasten                    data.readStrongBinder());
104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            registerClient(client);
104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case GET_INPUTBUFFERSIZE: {
105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            uint32_t sampleRate = data.readInt32();
105258f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten            audio_format_t format = (audio_format_t) data.readInt32();
1053dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten            audio_channel_mask_t channelMask = data.readInt32();
1054e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) );
105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1057c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_OUTPUT: {
1058c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1059a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1060e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1061e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1062e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1063e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1064a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_devices_t devices = (audio_devices_t)data.readInt32();
1065cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
10660ca3cf94c0dfc173ad7886ae162c4b67067539f6Eric Laurent            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
1067983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t latencyMs = 0;
10684cac44b53cc9f965cc2c9706b1d7ee2cd79f4066Wei Jia            audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
1069cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openOutput(module, &output, &config,
1070cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                         &devices, address, &latencyMs, flags);
10717074296c72b3be919ebc9dfd504f4572a188d2e7Glenn Kasten            ALOGV("OPEN_OUTPUT output, %d", output);
1072cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t)status);
1073cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1074cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t)output);
1075cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1076cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(devices);
1077cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(latencyMs);
1078cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1079c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1080c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1081c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_DUPLICATE_OUTPUT: {
1082c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
108372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
108472ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
108572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
1086c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1087c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1088c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_OUTPUT: {
1089c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
109072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
1091c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1092c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1093c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case SUSPEND_OUTPUT: {
1094c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
109572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
1096c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1097c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1098c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case RESTORE_OUTPUT: {
1099c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
110072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
1101c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1102c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1103c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case OPEN_INPUT: {
1104c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1105a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
1106cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_io_handle_t input = (audio_io_handle_t)data.readInt32();
1107e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            audio_config_t config = {};
1108e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) {
1109e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1110e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1111cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_devices_t device = (audio_devices_t)data.readInt32();
1112cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            String8 address(data.readString8());
1113cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            audio_source_t source = (audio_source_t)data.readInt32();
1114ec40d284218466d8f0e832e7eb88e6ea6c479c88Glenn Kasten            audio_input_flags_t flags = (audio_input_flags_t) data.readInt32();
1115c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
1116cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            status_t status = openInput(module, &input, &config,
1117cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                                        &device, address, source, flags);
1118cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            reply->writeInt32((int32_t) status);
1119cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            if (status == NO_ERROR) {
1120cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32((int32_t) input);
1121cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->write(&config, sizeof(audio_config_t));
1122cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent                reply->writeInt32(device);
1123cf2c0210c8afbe7d0661ccbbae3835b5ce73c0bfEric Laurent            }
1124c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            return NO_ERROR;
1125c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        } break;
1126c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        case CLOSE_INPUT: {
112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
112872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
113089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1131d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten        case INVALIDATE_STREAM: {
113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioFlinger, data, reply);
1133d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            audio_stream_type_t stream = (audio_stream_type_t) data.readInt32();
1134d2304db2fcb5112292105a0949a55986a4c9875fGlenn Kasten            reply->writeInt32(invalidateStream(stream));
113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
113689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
1137f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        case SET_VOICE_VOLUME: {
1138f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1139f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            float volume = data.readFloat();
1140f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            reply->writeInt32( setVoiceVolume(volume) );
1141f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent            return NO_ERROR;
1142f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent        } break;
1143342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        case GET_RENDER_POSITION: {
1144342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
114572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1146983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t halFrames = 0;
1147983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t dspFrames = 0;
1148342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
1149342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            reply->writeInt32(status);
1150342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            if (status == NO_ERROR) {
1151342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(halFrames);
1152342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent                reply->writeInt32(dspFrames);
1153342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            }
1154342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent            return NO_ERROR;
1155342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent        }
115605bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        case GET_INPUT_FRAMES_LOST: {
115705bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
115872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
11595f972c031d4061f4f037c9fda1ea4bd9b6a756cdGlenn Kasten            reply->writeInt32((int32_t) getInputFramesLost(ioHandle));
116005bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent            return NO_ERROR;
116105bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent        } break;
11629eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case NEW_AUDIO_UNIQUE_ID: {
1163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1164eeecb980ff4c202d0a3c4b0bfe040dce2f73336dGlenn Kasten            reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32()));
1165be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1166be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
11673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case ACQUIRE_AUDIO_SESSION_ID: {
11683a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1169d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1170d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1171d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            acquireAudioSessionId(audioSession, pid);
11723a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
11733a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
11743a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        case RELEASE_AUDIO_SESSION_ID: {
11753a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            CHECK_INTERFACE(IAudioFlinger, data, reply);
1176d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t audioSession = (audio_session_t) data.readInt32();
1177d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            int pid = data.readInt32();
1178d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen            releaseAudioSessionId(audioSession, pid);
11793a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen            return NO_ERROR;
11803a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen        } break;
1181be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case QUERY_NUM_EFFECTS: {
1182be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1183983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            uint32_t numEffects = 0;
1184be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = queryNumberEffects(&numEffects);
1185be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1186be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1187be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->writeInt32((int32_t)numEffects);
1188be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1189be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1190be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1191ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent        case QUERY_EFFECT: {
1192be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1193983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1194ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent            status_t status = queryEffect(data.readInt32(), &desc);
1195be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1196be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1197be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1198be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1199be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1200be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1201be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case GET_EFFECT_DESCRIPTOR: {
1202be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1203be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            effect_uuid_t uuid;
1204be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            data.read(&uuid, sizeof(effect_uuid_t));
1205983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            effect_descriptor_t desc = {};
1206be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status_t status = getEffectDescriptor(&uuid, &desc);
1207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1208be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            if (status == NO_ERROR) {
1209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent                reply->write(&desc, sizeof(effect_descriptor_t));
1210be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            }
1211be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1212be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
1213be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case CREATE_EFFECT: {
1214be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1215e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            effect_descriptor_t desc = {};
1216e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) {
1217e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1218e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
1219be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1220be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            int32_t priority = data.readInt32();
122172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1222d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t sessionId = (audio_session_t) data.readInt32();
1223be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov            const String16 opPackageName = data.readString16();
1224b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent            pid_t pid = (pid_t)data.readInt32();
1225b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent
1226983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            status_t status = NO_ERROR;
1227983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int id = 0;
1228983dca391a76fb45df999fc40e8766b9ddb63511Wei Jia            int enabled = 0;
122905bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent
12308d6cc842e8d525405c68e57fdf3bc5da0b4d7e87Glenn Kasten            sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
1231b643627a557e44b9ab5879cf71e162af2d514ce3Eric Laurent                    opPackageName, pid, &status, &id, &enabled);
1232be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(status);
1233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(id);
1234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(enabled);
123506b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(effect));
1236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->write(&desc, sizeof(effect_descriptor_t));
1237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
1238be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
1239de070137f11d346fba77605bd76a44c040a618fcEric Laurent        case MOVE_EFFECTS: {
1240de070137f11d346fba77605bd76a44c040a618fcEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1241d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            audio_session_t session = (audio_session_t) data.readInt32();
124272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
124372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1244de070137f11d346fba77605bd76a44c040a618fcEric Laurent            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1245de070137f11d346fba77605bd76a44c040a618fcEric Laurent            return NO_ERROR;
1246de070137f11d346fba77605bd76a44c040a618fcEric Laurent        } break;
1247a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        case LOAD_HW_MODULE: {
1248a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1249a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            reply->writeInt32(loadHwModule(data.readCString()));
1250a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent            return NO_ERROR;
1251a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent        } break;
1252cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_SAMPLING_RATE: {
1253cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1254cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            reply->writeInt32(getPrimaryOutputSamplingRate());
1255cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1256cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
1257cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        case GET_PRIMARY_OUTPUT_FRAME_COUNT: {
1258cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
1259e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            reply->writeInt64(getPrimaryOutputFrameCount());
1260cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten            return NO_ERROR;
1261cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten        } break;
12624182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        case SET_LOW_RAM_DEVICE: {
12634182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
12644182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            bool isLowRamDevice = data.readInt32() != 0;
12654182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            reply->writeInt32(setLowRamDevice(isLowRamDevice));
12664182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten            return NO_ERROR;
12674182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        } break;
12684b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PORTS: {
12694b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1270f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPortsReq = data.readInt32();
1271f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPortsReq > MAX_ITEMS_PER_LIST) {
1272f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPortsReq = MAX_ITEMS_PER_LIST;
1273f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1274f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPorts = numPortsReq;
12754b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port *ports =
1276f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_port *)calloc(numPortsReq,
12774b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                           sizeof(struct audio_port));
1278f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (ports == NULL) {
1279f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1280f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1281f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1282f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1283f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPorts(&numPorts, ports);
12844b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1285f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPorts);
12864b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1287f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPortsReq > numPorts) {
1288f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPortsReq = numPorts;
1289f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1290f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(ports, numPortsReq * sizeof(struct audio_port));
12914b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
12924b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(ports);
12934b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
12944b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
12954b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case GET_AUDIO_PORT: {
12964b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1297e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            struct audio_port port = {};
1298e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) {
1299e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1300e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13014b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = getAudioPort(&port);
13024b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13034b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13044b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&port, sizeof(struct audio_port));
13054b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13064b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13074b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13084b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case CREATE_AUDIO_PATCH: {
13094b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13104b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch patch;
13114b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&patch, sizeof(struct audio_patch));
1312a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten            audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;
1313e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) {
1314e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia                ALOGE("b/23905951");
1315e995e477ad59b79145200c8f1e9e13c16c682d59Wei Jia            }
13164b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = createAudioPatch(&patch, &handle);
13174b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13184b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
13194b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                reply->write(&handle, sizeof(audio_patch_handle_t));
13204b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13214b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13224b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13234b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case RELEASE_AUDIO_PATCH: {
13244b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13254b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            audio_patch_handle_t handle;
13264b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&handle, sizeof(audio_patch_handle_t));
13274b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = releaseAudioPatch(handle);
13284b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13294b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13304b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13314b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case LIST_AUDIO_PATCHES: {
13324b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1333f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatchesReq = data.readInt32();
1334f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (numPatchesReq > MAX_ITEMS_PER_LIST) {
1335f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                numPatchesReq = MAX_ITEMS_PER_LIST;
1336f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1337f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            unsigned int numPatches = numPatchesReq;
13384b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_patch *patches =
1339f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    (struct audio_patch *)calloc(numPatchesReq,
13404b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent                                                 sizeof(struct audio_patch));
1341f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            if (patches == NULL) {
1342f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(NO_MEMORY);
1343f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->writeInt32(0);
1344f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                return NO_ERROR;
1345f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            }
1346f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            status_t status = listAudioPatches(&numPatches, patches);
13474b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
1348f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent            reply->writeInt32(numPatches);
13494b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            if (status == NO_ERROR) {
1350f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                if (numPatchesReq > numPatches) {
1351f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                    numPatchesReq = numPatches;
1352f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                }
1353f75c2fef14354024ec27bff1444f9e50b5ef55a9Eric Laurent                reply->write(patches, numPatchesReq * sizeof(struct audio_patch));
13544b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            }
13554b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            free(patches);
13564b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13574b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13584b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        case SET_AUDIO_PORT_CONFIG: {
13594b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
13604b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            struct audio_port_config config;
13614b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            data.read(&config, sizeof(struct audio_port_config));
13624b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            status_t status = setAudioPortConfig(&config);
13634b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            reply->writeInt32(status);
13644b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent            return NO_ERROR;
13654b123406c10c17852734a1b691bb9ce2a4cb7cafEric Laurent        } break;
13669eae036a9822f9ba7d13b7d623310a15e23ba5f0Glenn Kasten        case GET_AUDIO_HW_SYNC_FOR_SESSION: {
136793c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
1368d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten            reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32()));
136993c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent            return NO_ERROR;
137093c3d41bdb15e39dac0faea9c5b60f1637cd477cEric Laurent        } break;
137172e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        case SYSTEM_READY: {
137272e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            CHECK_INTERFACE(IAudioFlinger, data, reply);
137372e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            systemReady();
137472e3f39146fce4686bd96f11057c051bea376dfbEric Laurent            return NO_ERROR;
137572e3f39146fce4686bd96f11057c051bea376dfbEric Laurent        } break;
13764a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        case FRAME_COUNT_HAL: {
13774a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            CHECK_INTERFACE(IAudioFlinger, data, reply);
13784a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) );
13794a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten            return NO_ERROR;
13804a8308b11b92e608cdaf29f73f7919e75706f9a2Glenn Kasten        } break;
138189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
138289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
138389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
138489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
138589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
138689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
138789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
138840bc906252974d0b389ae4a147232d0c9a97193fGlenn Kasten} // namespace android
1389