IAudioFlinger.cpp revision 28b76b334f92a15a2be3cc9e2f7d229a3275d1ac
1d18304287dbabc7835be771400b85d4ae8b63de6San Mehat/*
2d18304287dbabc7835be771400b85d4ae8b63de6San Mehat**
3d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** Copyright 2007, The Android Open Source Project
4d18304287dbabc7835be771400b85d4ae8b63de6San Mehat**
5d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** Licensed under the Apache License, Version 2.0 (the "License");
6d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** you may not use this file except in compliance with the License.
7d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** You may obtain a copy of the License at
8d18304287dbabc7835be771400b85d4ae8b63de6San Mehat**
9d18304287dbabc7835be771400b85d4ae8b63de6San Mehat**     http://www.apache.org/licenses/LICENSE-2.0
10d18304287dbabc7835be771400b85d4ae8b63de6San Mehat**
11d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** Unless required by applicable law or agreed to in writing, software
12d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** distributed under the License is distributed on an "AS IS" BASIS,
13d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** See the License for the specific language governing permissions and
15d18304287dbabc7835be771400b85d4ae8b63de6San Mehat** limitations under the License.
16d18304287dbabc7835be771400b85d4ae8b63de6San Mehat*/
17d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
18d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "IAudioFlinger"
19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat//#define LOG_NDEBUG 0
20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <utils/Log.h>
21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdint.h>
23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h>
24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <binder/Parcel.h>
265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
27d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <media/IAudioFlinger.h>
28d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
29d18304287dbabc7835be771400b85d4ae8b63de6San Mehatnamespace android {
30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
31d18304287dbabc7835be771400b85d4ae8b63de6San Mehatenum {
32d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION,
33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    OPEN_RECORD,
34a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat    SAMPLE_RATE,
35a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat    CHANNEL_COUNT,  // obsolete
36d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    FORMAT,
375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    FRAME_COUNT,
385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    LATENCY,
395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    SET_MASTER_VOLUME,
405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    SET_MASTER_MUTE,
415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    MASTER_VOLUME,
425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    MASTER_MUTE,
435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    SET_STREAM_VOLUME,
445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    SET_STREAM_MUTE,
459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    STREAM_VOLUME,
469ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat    STREAM_MUTE,
47d5573d34c8fac49e16b20cf144486125bf940086San Mehat    SET_MODE,
481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    SET_MIC_MUTE,
495af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    GET_MIC_MUTE,
503e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt    SET_PARAMETERS,
519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    GET_PARAMETERS,
52d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    REGISTER_CLIENT,
53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    GET_INPUTBUFFERSIZE,
545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    OPEN_OUTPUT,
55d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    OPEN_DUPLICATE_OUTPUT,
56d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    CLOSE_OUTPUT,
57d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    SUSPEND_OUTPUT,
58d5573d34c8fac49e16b20cf144486125bf940086San Mehat    RESTORE_OUTPUT,
59d5573d34c8fac49e16b20cf144486125bf940086San Mehat    OPEN_INPUT,
601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    CLOSE_INPUT,
615af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    SET_STREAM_OUTPUT,
623e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt    SET_VOICE_VOLUME,
639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    GET_RENDER_POSITION,
649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    GET_INPUT_FRAMES_LOST,
659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    NEW_AUDIO_SESSION_ID,
669ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat    ACQUIRE_AUDIO_SESSION_ID,
679ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat    RELEASE_AUDIO_SESSION_ID,
68d5573d34c8fac49e16b20cf144486125bf940086San Mehat    QUERY_NUM_EFFECTS,
69d5573d34c8fac49e16b20cf144486125bf940086San Mehat    QUERY_EFFECT,
701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    GET_EFFECT_DESCRIPTOR,
711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    CREATE_EFFECT,
725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    MOVE_EFFECTS,
735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    LOAD_HW_MODULE
743e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt};
753e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt
76d18304287dbabc7835be771400b85d4ae8b63de6San Mehatclass BpAudioFlinger : public BpInterface<IAudioFlinger>
77d18304287dbabc7835be771400b85d4ae8b63de6San Mehat{
785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatpublic:
795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    BpAudioFlinger(const sp<IBinder>& impl)
80d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        : BpInterface<IAudioFlinger>(impl)
81d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    {
825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
83d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual sp<IAudioTrack> createTrack(
855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                pid_t pid,
865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                audio_stream_type_t streamType,
875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                uint32_t sampleRate,
885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                audio_format_t format,
895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                audio_channel_mask_t channelMask,
905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                int frameCount,
915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                track_flags_t flags,
925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                const sp<IMemory>& sharedBuffer,
935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                audio_io_handle_t output,
945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                pid_t tid,
955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                int *sessionId,
965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat                                status_t *status)
975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        sp<IAudioTrack> track;
1005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32(pid);
1025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) streamType);
1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32(sampleRate);
1045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32(format);
1055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32(channelMask);
1068e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32(frameCount);
1078e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32((int32_t) flags);
1088e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeStrongBinder(sharedBuffer->asBinder());
1098e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32((int32_t) output);
1108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32((int32_t) tid);
1118e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        int lSessionId = 0;
1128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        if (sessionId != NULL) {
1138e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            lSessionId = *sessionId;
1148e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        }
1158e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32(lSessionId);
1168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
1178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        if (lStatus != NO_ERROR) {
1188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            ALOGE("createTrack error: %s", strerror(-lStatus));
1198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        } else {
1208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            lSessionId = reply.readInt32();
1218e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            if (sessionId != NULL) {
1228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                *sessionId = lSessionId;
1238e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            }
1248e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            lStatus = reply.readInt32();
1258e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
1268e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        }
1278e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        if (status) {
1288e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            *status = lStatus;
1298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        }
1308e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        return track;
1318e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    }
1328e46896b4c4be5deaef651a12b17314f63ae9070San Mehat
1338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    virtual sp<IAudioRecord> openRecord(
1348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                pid_t pid,
1358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                audio_io_handle_t input,
1368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                uint32_t sampleRate,
1378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                audio_format_t format,
1388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                audio_channel_mask_t channelMask,
1398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                int frameCount,
1408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                track_flags_t flags,
1418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                pid_t tid,
142a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat                                int *sessionId,
1438e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                                status_t *status)
1448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    {
1458e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        Parcel data, reply;
1468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        sp<IAudioRecord> record;
147a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
148a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32(pid);
149a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32((int32_t) input);
150a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32(sampleRate);
151a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32(format);
152a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32(channelMask);
153a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32(frameCount);
154a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32(flags);
155a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32((int32_t) tid);
156a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        int lSessionId = 0;
157a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        if (sessionId != NULL) {
158a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat            lSessionId = *sessionId;
159a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        }
160a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        data.writeInt32(lSessionId);
161a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
162a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        if (lStatus != NO_ERROR) {
163a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat            ALOGE("openRecord error: %s", strerror(-lStatus));
164a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        } else {
165a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat            lSessionId = reply.readInt32();
1668e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            if (sessionId != NULL) {
1678e46896b4c4be5deaef651a12b17314f63ae9070San Mehat                *sessionId = lSessionId;
1688e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            }
1698e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            lStatus = reply.readInt32();
170a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
1718e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        }
1728e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        if (status) {
173a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat            *status = lStatus;
174a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        }
175a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat        return record;
176a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat    }
177a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat
1788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    virtual uint32_t sampleRate(audio_io_handle_t output) const
1795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
1805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
1815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) output);
1835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(SAMPLE_RATE, data, &reply);
1845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
1855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
1865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
1875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#if 0
1885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual int channelCount(audio_io_handle_t output) const
1895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
1905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
1915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
1925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) output);
1935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(CHANNEL_COUNT, data, &reply);
1945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
1955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
1965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#endif
1975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
1985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual audio_format_t format(audio_io_handle_t output) const
1995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) output);
2035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(FORMAT, data, &reply);
2045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return (audio_format_t) reply.readInt32();
2055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
2065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
2075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual size_t frameCount(audio_io_handle_t output) const
2085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) output);
2125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(FRAME_COUNT, data, &reply);
2135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
2145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
2155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
2165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual uint32_t latency(audio_io_handle_t output) const
217e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    {
2185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) output);
2215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(LATENCY, data, &reply);
2225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
2235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
22401fed783828b592cda3b774deea4099a9e690e3dSan Mehat
2255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual status_t setMasterVolume(float value)
2265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeFloat(value);
2305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(SET_MASTER_VOLUME, data, &reply);
2315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
232e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    }
2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual status_t setMasterMute(bool muted)
2355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
237e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32(muted);
2395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(SET_MASTER_MUTE, data, &reply);
2405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
2415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
2425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
2435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual float masterVolume() const
2445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(MASTER_VOLUME, data, &reply);
2485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readFloat();
2495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
2505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
2515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual bool masterMute() const
2525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(MASTER_MUTE, data, &reply);
2565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
2575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
2585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
2595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
2605c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat            audio_io_handle_t output)
2615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2635c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
264e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        data.writeInt32((int32_t) stream);
265e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        data.writeFloat(value);
2665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) output);
267e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        remote()->transact(SET_STREAM_VOLUME, data, &reply);
268e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        return reply.readInt32();
269e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    }
270e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt
271e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    virtual status_t setStreamMute(audio_stream_type_t stream, bool muted)
272e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    {
273e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        Parcel data, reply;
274e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
275e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        data.writeInt32((int32_t) stream);
276e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        data.writeInt32(muted);
277e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        remote()->transact(SET_STREAM_MUTE, data, &reply);
278e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        return reply.readInt32();
279e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    }
280e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt
281e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
282e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    {
2835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
2855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) stream);
2865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32((int32_t) output);
2875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(STREAM_VOLUME, data, &reply);
288e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        return reply.readFloat();
289e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    }
2905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
2915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual bool streamMute(audio_stream_type_t stream) const
2925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
2935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
2945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
295e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        data.writeInt32((int32_t) stream);
296e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        remote()->transact(STREAM_MUTE, data, &reply);
297e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt        return reply.readInt32();
298e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt    }
2995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
3005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual status_t setMode(audio_mode_t mode)
3015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
3025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        Parcel data, reply;
3035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        data.writeInt32(mode);
3055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        remote()->transact(SET_MODE, data, &reply);
3065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat        return reply.readInt32();
3075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    }
3085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat
3095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    virtual status_t setMicMute(bool state)
3105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat    {
311d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        Parcel data, reply;
312d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
313d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        data.writeInt32(state);
314d5573d34c8fac49e16b20cf144486125bf940086San Mehat        remote()->transact(SET_MIC_MUTE, data, &reply);
315d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return reply.readInt32();
316d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
317d5573d34c8fac49e16b20cf144486125bf940086San Mehat
318d5573d34c8fac49e16b20cf144486125bf940086San Mehat    virtual bool getMicMute() const
319d5573d34c8fac49e16b20cf144486125bf940086San Mehat    {
320d5573d34c8fac49e16b20cf144486125bf940086San Mehat        Parcel data, reply;
321d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
322d5573d34c8fac49e16b20cf144486125bf940086San Mehat        remote()->transact(GET_MIC_MUTE, data, &reply);
323d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return reply.readInt32();
324d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
325d5573d34c8fac49e16b20cf144486125bf940086San Mehat
326d5573d34c8fac49e16b20cf144486125bf940086San Mehat    virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
327d5573d34c8fac49e16b20cf144486125bf940086San Mehat    {
328d5573d34c8fac49e16b20cf144486125bf940086San Mehat        Parcel data, reply;
329d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
330d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInt32((int32_t) ioHandle);
331d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        data.writeString8(keyValuePairs);
332d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        remote()->transact(SET_PARAMETERS, data, &reply);
333d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        return reply.readInt32();
334d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    }
335d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
336d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const
3379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
3389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
3399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32((int32_t) ioHandle);
3419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeString8(keys);
3429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(GET_PARAMETERS, data, &reply);
3439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        return reply.readString8();
3449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    }
3459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
3469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual void registerClient(const sp<IAudioFlingerClient>& client)
3479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
3489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
3499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeStrongBinder(client->asBinder());
3519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(REGISTER_CLIENT, data, &reply);
3529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    }
3539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
3549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
3559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat            audio_channel_mask_t channelMask) const
3569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
3579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
3589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(sampleRate);
3609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(format);
3619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(channelMask);
3629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(GET_INPUTBUFFERSIZE, data, &reply);
3639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        return reply.readInt32();
3649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    }
365d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
366d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    virtual audio_io_handle_t openOutput(audio_module_handle_t module,
367d18304287dbabc7835be771400b85d4ae8b63de6San Mehat                                         audio_devices_t *pDevices,
368d18304287dbabc7835be771400b85d4ae8b63de6San Mehat                                         uint32_t *pSamplingRate,
369d18304287dbabc7835be771400b85d4ae8b63de6San Mehat                                         audio_format_t *pFormat,
370d18304287dbabc7835be771400b85d4ae8b63de6San Mehat                                         audio_channel_mask_t *pChannelMask,
371d18304287dbabc7835be771400b85d4ae8b63de6San Mehat                                         uint32_t *pLatencyMs,
372d18304287dbabc7835be771400b85d4ae8b63de6San Mehat                                         audio_output_flags_t flags)
373d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    {
374d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        Parcel data, reply;
3759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        audio_devices_t devices = pDevices ? *pDevices : (audio_devices_t)0;
3769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
377d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT;
378d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        audio_channel_mask_t channelMask = pChannelMask ? *pChannelMask : (audio_channel_mask_t)0;
379d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
380d18304287dbabc7835be771400b85d4ae8b63de6San Mehat
381d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
3829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(module);
3839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(devices);
384d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        data.writeInt32(samplingRate);
3859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(format);
3869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(channelMask);
3879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(latency);
3889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32((int32_t) flags);
3899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(OPEN_OUTPUT, data, &reply);
3909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        audio_io_handle_t output = (audio_io_handle_t) reply.readInt32();
391d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        ALOGV("openOutput() returned output, %d", output);
3929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        devices = (audio_devices_t)reply.readInt32();
3939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        if (pDevices) *pDevices = devices;
3949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        samplingRate = reply.readInt32();
3959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        if (pSamplingRate) *pSamplingRate = samplingRate;
3969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        format = (audio_format_t) reply.readInt32();
3979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        if (pFormat) *pFormat = format;
3989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        channelMask = (audio_channel_mask_t)reply.readInt32();
3999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        if (pChannelMask) *pChannelMask = channelMask;
4009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        latency = reply.readInt32();
4019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        if (pLatencyMs) *pLatencyMs = latency;
4023208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        return output;
4033208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt    }
4049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
4059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
4063208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt            audio_io_handle_t output2)
4073208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt    {
4083208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        Parcel data, reply;
4093208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4103208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        data.writeInt32((int32_t) output1);
4113208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        data.writeInt32((int32_t) output2);
4123208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply);
4133208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        return (audio_io_handle_t) reply.readInt32();
4143208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt    }
4153208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt
4163208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt    virtual status_t closeOutput(audio_io_handle_t output)
4179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
4183208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        Parcel data, reply;
4193208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32((int32_t) output);
4219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(CLOSE_OUTPUT, data, &reply);
4229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        return reply.readInt32();
4239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    }
4249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
4259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual status_t suspendOutput(audio_io_handle_t output)
4269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
4279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
4289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32((int32_t) output);
4309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(SUSPEND_OUTPUT, data, &reply);
4319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        return reply.readInt32();
4329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    }
4339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
4349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual status_t restoreOutput(audio_io_handle_t output)
4359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
4369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
4379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32((int32_t) output);
4399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(RESTORE_OUTPUT, data, &reply);
4409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        return reply.readInt32();
4419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    }
4429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
4439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual audio_io_handle_t openInput(audio_module_handle_t module,
4449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat                                        audio_devices_t *pDevices,
4459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat                                        uint32_t *pSamplingRate,
4469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat                                        audio_format_t *pFormat,
4479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat                                        audio_channel_mask_t *pChannelMask)
4489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
4499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
4509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        audio_devices_t devices = pDevices ? *pDevices : (audio_devices_t)0;
4519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
4529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        audio_format_t format = pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT;
4539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        audio_channel_mask_t channelMask = pChannelMask ? *pChannelMask : (audio_channel_mask_t)0;
4549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
4559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(module);
4579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(devices);
4589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(samplingRate);
4599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(format);
4609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(channelMask);
4619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(OPEN_INPUT, data, &reply);
462d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        audio_io_handle_t input = (audio_io_handle_t) reply.readInt32();
463d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        devices = (audio_devices_t)reply.readInt32();
464d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        if (pDevices) *pDevices = devices;
465d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        samplingRate = reply.readInt32();
466d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        if (pSamplingRate) *pSamplingRate = samplingRate;
467d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        format = (audio_format_t) reply.readInt32();
468d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        if (pFormat) *pFormat = format;
469d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        channelMask = (audio_channel_mask_t)reply.readInt32();
470d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        if (pChannelMask) *pChannelMask = channelMask;
471d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        return input;
472d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    }
4739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
4749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual status_t closeInput(int input)
4759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
4769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
4779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32(input);
4799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(CLOSE_INPUT, data, &reply);
4809ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat        return reply.readInt32();
4819ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat    }
4829ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat
4839ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat    virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output)
4849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    {
4859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        Parcel data, reply;
4869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
4879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32((int32_t) stream);
4889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        data.writeInt32((int32_t) output);
4899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        remote()->transact(SET_STREAM_OUTPUT, data, &reply);
4909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat        return reply.readInt32();
4919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    }
4929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat
4939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat    virtual status_t setVoiceVolume(float volume)
494d18304287dbabc7835be771400b85d4ae8b63de6San Mehat    {
495d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        Parcel data, reply;
496d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
497d18304287dbabc7835be771400b85d4ae8b63de6San Mehat        data.writeFloat(volume);
498d5573d34c8fac49e16b20cf144486125bf940086San Mehat        remote()->transact(SET_VOICE_VOLUME, data, &reply);
499d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return reply.readInt32();
500d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
501d5573d34c8fac49e16b20cf144486125bf940086San Mehat
502d5573d34c8fac49e16b20cf144486125bf940086San Mehat    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
503d5573d34c8fac49e16b20cf144486125bf940086San Mehat            audio_io_handle_t output) const
504d5573d34c8fac49e16b20cf144486125bf940086San Mehat    {
505d5573d34c8fac49e16b20cf144486125bf940086San Mehat        Parcel data, reply;
506d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
507d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInt32((int32_t) output);
508d5573d34c8fac49e16b20cf144486125bf940086San Mehat        remote()->transact(GET_RENDER_POSITION, data, &reply);
509d5573d34c8fac49e16b20cf144486125bf940086San Mehat        status_t status = reply.readInt32();
510d5573d34c8fac49e16b20cf144486125bf940086San Mehat        if (status == NO_ERROR) {
511d5573d34c8fac49e16b20cf144486125bf940086San Mehat            uint32_t tmp = reply.readInt32();
51274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt            if (halFrames) {
51374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt                *halFrames = tmp;
51474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt            }
51574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt            tmp = reply.readInt32();
516d5573d34c8fac49e16b20cf144486125bf940086San Mehat            if (dspFrames) {
517d5573d34c8fac49e16b20cf144486125bf940086San Mehat                *dspFrames = tmp;
518d5573d34c8fac49e16b20cf144486125bf940086San Mehat            }
519d5573d34c8fac49e16b20cf144486125bf940086San Mehat        }
520d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return status;
521d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
522d5573d34c8fac49e16b20cf144486125bf940086San Mehat
523d5573d34c8fac49e16b20cf144486125bf940086San Mehat    virtual unsigned int getInputFramesLost(audio_io_handle_t ioHandle) const
524d5573d34c8fac49e16b20cf144486125bf940086San Mehat    {
52574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt        Parcel data, reply;
52674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
52774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt        data.writeInt32((int32_t) ioHandle);
52874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
52974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt        return reply.readInt32();
53074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt    }
53174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt
53274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt    virtual int newAudioSessionId()
53374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt    {
534d5573d34c8fac49e16b20cf144486125bf940086San Mehat        Parcel data, reply;
535d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
536d5573d34c8fac49e16b20cf144486125bf940086San Mehat        status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply);
537d5573d34c8fac49e16b20cf144486125bf940086San Mehat        int id = 0;
538d5573d34c8fac49e16b20cf144486125bf940086San Mehat        if (status == NO_ERROR) {
539d5573d34c8fac49e16b20cf144486125bf940086San Mehat            id = reply.readInt32();
540d5573d34c8fac49e16b20cf144486125bf940086San Mehat        }
541d5573d34c8fac49e16b20cf144486125bf940086San Mehat        return id;
542d5573d34c8fac49e16b20cf144486125bf940086San Mehat    }
543d5573d34c8fac49e16b20cf144486125bf940086San Mehat
544d5573d34c8fac49e16b20cf144486125bf940086San Mehat    virtual void acquireAudioSessionId(int audioSession)
545d5573d34c8fac49e16b20cf144486125bf940086San Mehat    {
546d5573d34c8fac49e16b20cf144486125bf940086San Mehat        Parcel data, reply;
547d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
548d5573d34c8fac49e16b20cf144486125bf940086San Mehat        data.writeInt32(audioSession);
5491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply);
5501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
5511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
5521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    virtual void releaseAudioSessionId(int audioSession)
5531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    {
5541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        Parcel data, reply;
5551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        data.writeInt32(audioSession);
5571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply);
5581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
5591bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
5601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    virtual status_t queryNumberEffects(uint32_t *numEffects) const
5611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    {
5621bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        Parcel data, reply;
5631bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply);
5651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        if (status != NO_ERROR) {
5661bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat            return status;
5671bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        }
5681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        status = reply.readInt32();
5691bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        if (status != NO_ERROR) {
5701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat            return status;
5711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        }
5721bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        if (numEffects != NULL) {
5731bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat            *numEffects = (uint32_t)reply.readInt32();
5741bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        }
5751bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        return NO_ERROR;
5761bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    }
5771bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat
5781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const
5791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat    {
5801bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        if (pDescriptor == NULL) {
5811bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat            return BAD_VALUE;
5821bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        }
5831bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        Parcel data, reply;
5841bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
5851bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        data.writeInt32(index);
5861bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        status_t status = remote()->transact(QUERY_EFFECT, data, &reply);
5871bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat        if (status != NO_ERROR) {
5885af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            return status;
5895af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        }
5905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        status = reply.readInt32();
5915af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        if (status != NO_ERROR) {
5925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            return status;
5935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        }
5945af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        reply.read(pDescriptor, sizeof(effect_descriptor_t));
59531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt        return NO_ERROR;
5965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    }
5975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt
5985af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
5995af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            effect_descriptor_t *pDescriptor) const
6005af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    {
6015af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        if (pUuid == NULL || pDescriptor == NULL) {
6025af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            return BAD_VALUE;
603c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt        }
6045af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        Parcel data, reply;
605c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
606c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt        data.write(pUuid, sizeof(effect_uuid_t));
607c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt        status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply);
608c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt        if (status != NO_ERROR) {
6095af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            return status;
61031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt        }
61131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt        status = reply.readInt32();
6125af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        if (status != NO_ERROR) {
6135af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            return status;
6145af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        }
6155af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        reply.read(pDescriptor, sizeof(effect_descriptor_t));
6165af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        return NO_ERROR;
6175af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    }
6185af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt
6195af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    virtual sp<IEffect> createEffect(pid_t pid,
6205af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    effect_descriptor_t *pDesc,
6215af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    const sp<IEffectClient>& client,
6225af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    int32_t priority,
6235af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    audio_io_handle_t output,
6245af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    int sessionId,
6255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    status_t *status,
6265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    int *id,
6275af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt                                    int *enabled)
6285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt    {
6295af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        Parcel data, reply;
6305af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        sp<IEffect> effect;
6315af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt
6325af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt        if (pDesc == NULL) {
6335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            return effect;
6345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt            if (status) {
6353e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt                *status = BAD_VALUE;
6363e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            }
6373e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        }
6383e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt
6393e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6403e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        data.writeInt32(pid);
6413e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        data.write(pDesc, sizeof(effect_descriptor_t));
6423e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        data.writeStrongBinder(client->asBinder());
6433e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        data.writeInt32(priority);
6443e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        data.writeInt32((int32_t) output);
6453e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        data.writeInt32(sessionId);
6463e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt
6473e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply);
6483e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        if (lStatus != NO_ERROR) {
6493e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            ALOGE("createEffect error: %s", strerror(-lStatus));
6503e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        } else {
6513e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            lStatus = reply.readInt32();
6523e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            int tmp = reply.readInt32();
6533e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            if (id) {
6543e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt                *id = tmp;
6553e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            }
6563e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            tmp = reply.readInt32();
6573e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            if (enabled != NULL) {
6583e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt                *enabled = tmp;
6593e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            }
6603e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            effect = interface_cast<IEffect>(reply.readStrongBinder());
6613e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            reply.read(pDesc, sizeof(effect_descriptor_t));
6623e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        }
6633e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        if (status) {
6643e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            *status = lStatus;
6653e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        }
6663e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt
6673e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt        return effect;
6683e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt    }
6693e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt
6703e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt    virtual status_t moveEffects(int session, audio_io_handle_t srcOutput,
6713e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt            audio_io_handle_t dstOutput)
6723e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt    {
6738e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        Parcel data, reply;
6748e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6758e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32(session);
6768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32((int32_t) srcOutput);
6778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInt32((int32_t) dstOutput);
6788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        remote()->transact(MOVE_EFFECTS, data, &reply);
6798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        return reply.readInt32();
6808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    }
6818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat
6828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    virtual audio_module_handle_t loadHwModule(const char *name)
6838e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    {
6848e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        Parcel data, reply;
6858e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
6868e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        data.writeCString(name);
6878e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        remote()->transact(LOAD_HW_MODULE, data, &reply);
6888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        return (audio_module_handle_t) reply.readInt32();
6898e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    }
690321efa7340e327b25b4ea4e49d86817070a301c9Robert Greenwalt};
6918e46896b4c4be5deaef651a12b17314f63ae9070San Mehat
6928e46896b4c4be5deaef651a12b17314f63ae9070San MehatIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
6938e46896b4c4be5deaef651a12b17314f63ae9070San Mehat
6948e46896b4c4be5deaef651a12b17314f63ae9070San Mehat// ----------------------------------------------------------------------
6958e46896b4c4be5deaef651a12b17314f63ae9070San Mehat
6968e46896b4c4be5deaef651a12b17314f63ae9070San Mehatstatus_t BnAudioFlinger::onTransact(
6978e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
6988e46896b4c4be5deaef651a12b17314f63ae9070San Mehat{
6998e46896b4c4be5deaef651a12b17314f63ae9070San Mehat    switch (code) {
7008e46896b4c4be5deaef651a12b17314f63ae9070San Mehat        case CREATE_TRACK: {
7018e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            CHECK_INTERFACE(IAudioFlinger, data, reply);
7028e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            pid_t pid = data.readInt32();
7038e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            int streamType = data.readInt32();
7048e46896b4c4be5deaef651a12b17314f63ae9070San Mehat            uint32_t sampleRate = data.readInt32();
705            audio_format_t format = (audio_format_t) data.readInt32();
706            audio_channel_mask_t channelMask = data.readInt32();
707            size_t bufferCount = data.readInt32();
708            track_flags_t flags = (track_flags_t) data.readInt32();
709            sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
710            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
711            pid_t tid = (pid_t) data.readInt32();
712            int sessionId = data.readInt32();
713            status_t status;
714            sp<IAudioTrack> track = createTrack(pid,
715                    (audio_stream_type_t) streamType, sampleRate, format,
716                    channelMask, bufferCount, flags, buffer, output, tid, &sessionId, &status);
717            reply->writeInt32(sessionId);
718            reply->writeInt32(status);
719            reply->writeStrongBinder(track->asBinder());
720            return NO_ERROR;
721        } break;
722        case OPEN_RECORD: {
723            CHECK_INTERFACE(IAudioFlinger, data, reply);
724            pid_t pid = data.readInt32();
725            audio_io_handle_t input = (audio_io_handle_t) data.readInt32();
726            uint32_t sampleRate = data.readInt32();
727            audio_format_t format = (audio_format_t) data.readInt32();
728            audio_channel_mask_t channelMask = data.readInt32();
729            size_t bufferCount = data.readInt32();
730            track_flags_t flags = (track_flags_t) data.readInt32();
731            pid_t tid = (pid_t) data.readInt32();
732            int sessionId = data.readInt32();
733            status_t status;
734            sp<IAudioRecord> record = openRecord(pid, input,
735                    sampleRate, format, channelMask, bufferCount, flags, tid, &sessionId, &status);
736            reply->writeInt32(sessionId);
737            reply->writeInt32(status);
738            reply->writeStrongBinder(record->asBinder());
739            return NO_ERROR;
740        } break;
741        case SAMPLE_RATE: {
742            CHECK_INTERFACE(IAudioFlinger, data, reply);
743            reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) );
744            return NO_ERROR;
745        } break;
746#if 0
747        case CHANNEL_COUNT: {
748            CHECK_INTERFACE(IAudioFlinger, data, reply);
749            reply->writeInt32( channelCount((audio_io_handle_t) data.readInt32()) );
750            return NO_ERROR;
751        } break;
752#endif
753        case FORMAT: {
754            CHECK_INTERFACE(IAudioFlinger, data, reply);
755            reply->writeInt32( format((audio_io_handle_t) data.readInt32()) );
756            return NO_ERROR;
757        } break;
758        case FRAME_COUNT: {
759            CHECK_INTERFACE(IAudioFlinger, data, reply);
760            reply->writeInt32( frameCount((audio_io_handle_t) data.readInt32()) );
761            return NO_ERROR;
762        } break;
763        case LATENCY: {
764            CHECK_INTERFACE(IAudioFlinger, data, reply);
765            reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) );
766            return NO_ERROR;
767        } break;
768        case SET_MASTER_VOLUME: {
769            CHECK_INTERFACE(IAudioFlinger, data, reply);
770            reply->writeInt32( setMasterVolume(data.readFloat()) );
771            return NO_ERROR;
772        } break;
773        case SET_MASTER_MUTE: {
774            CHECK_INTERFACE(IAudioFlinger, data, reply);
775            reply->writeInt32( setMasterMute(data.readInt32()) );
776            return NO_ERROR;
777        } break;
778        case MASTER_VOLUME: {
779            CHECK_INTERFACE(IAudioFlinger, data, reply);
780            reply->writeFloat( masterVolume() );
781            return NO_ERROR;
782        } break;
783        case MASTER_MUTE: {
784            CHECK_INTERFACE(IAudioFlinger, data, reply);
785            reply->writeInt32( masterMute() );
786            return NO_ERROR;
787        } break;
788        case SET_STREAM_VOLUME: {
789            CHECK_INTERFACE(IAudioFlinger, data, reply);
790            int stream = data.readInt32();
791            float volume = data.readFloat();
792            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
793            reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) );
794            return NO_ERROR;
795        } break;
796        case SET_STREAM_MUTE: {
797            CHECK_INTERFACE(IAudioFlinger, data, reply);
798            int stream = data.readInt32();
799            reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) );
800            return NO_ERROR;
801        } break;
802        case STREAM_VOLUME: {
803            CHECK_INTERFACE(IAudioFlinger, data, reply);
804            int stream = data.readInt32();
805            int output = data.readInt32();
806            reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) );
807            return NO_ERROR;
808        } break;
809        case STREAM_MUTE: {
810            CHECK_INTERFACE(IAudioFlinger, data, reply);
811            int stream = data.readInt32();
812            reply->writeInt32( streamMute((audio_stream_type_t) stream) );
813            return NO_ERROR;
814        } break;
815        case SET_MODE: {
816            CHECK_INTERFACE(IAudioFlinger, data, reply);
817            audio_mode_t mode = (audio_mode_t) data.readInt32();
818            reply->writeInt32( setMode(mode) );
819            return NO_ERROR;
820        } break;
821        case SET_MIC_MUTE: {
822            CHECK_INTERFACE(IAudioFlinger, data, reply);
823            int state = data.readInt32();
824            reply->writeInt32( setMicMute(state) );
825            return NO_ERROR;
826        } break;
827        case GET_MIC_MUTE: {
828            CHECK_INTERFACE(IAudioFlinger, data, reply);
829            reply->writeInt32( getMicMute() );
830            return NO_ERROR;
831        } break;
832        case SET_PARAMETERS: {
833            CHECK_INTERFACE(IAudioFlinger, data, reply);
834            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
835            String8 keyValuePairs(data.readString8());
836            reply->writeInt32(setParameters(ioHandle, keyValuePairs));
837            return NO_ERROR;
838        } break;
839        case GET_PARAMETERS: {
840            CHECK_INTERFACE(IAudioFlinger, data, reply);
841            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
842            String8 keys(data.readString8());
843            reply->writeString8(getParameters(ioHandle, keys));
844            return NO_ERROR;
845        } break;
846
847        case REGISTER_CLIENT: {
848            CHECK_INTERFACE(IAudioFlinger, data, reply);
849            sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder());
850            registerClient(client);
851            return NO_ERROR;
852        } break;
853        case GET_INPUTBUFFERSIZE: {
854            CHECK_INTERFACE(IAudioFlinger, data, reply);
855            uint32_t sampleRate = data.readInt32();
856            audio_format_t format = (audio_format_t) data.readInt32();
857            audio_channel_mask_t channelMask = data.readInt32();
858            reply->writeInt32( getInputBufferSize(sampleRate, format, channelMask) );
859            return NO_ERROR;
860        } break;
861        case OPEN_OUTPUT: {
862            CHECK_INTERFACE(IAudioFlinger, data, reply);
863            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
864            audio_devices_t devices = (audio_devices_t)data.readInt32();
865            uint32_t samplingRate = data.readInt32();
866            audio_format_t format = (audio_format_t) data.readInt32();
867            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
868            uint32_t latency = data.readInt32();
869            audio_output_flags_t flags = (audio_output_flags_t) data.readInt32();
870            audio_io_handle_t output = openOutput(module,
871                                                 &devices,
872                                                 &samplingRate,
873                                                 &format,
874                                                 &channelMask,
875                                                 &latency,
876                                                 flags);
877            ALOGV("OPEN_OUTPUT output, %p", output);
878            reply->writeInt32((int32_t) output);
879            reply->writeInt32(devices);
880            reply->writeInt32(samplingRate);
881            reply->writeInt32(format);
882            reply->writeInt32(channelMask);
883            reply->writeInt32(latency);
884            return NO_ERROR;
885        } break;
886        case OPEN_DUPLICATE_OUTPUT: {
887            CHECK_INTERFACE(IAudioFlinger, data, reply);
888            audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32();
889            audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32();
890            reply->writeInt32((int32_t) openDuplicateOutput(output1, output2));
891            return NO_ERROR;
892        } break;
893        case CLOSE_OUTPUT: {
894            CHECK_INTERFACE(IAudioFlinger, data, reply);
895            reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32()));
896            return NO_ERROR;
897        } break;
898        case SUSPEND_OUTPUT: {
899            CHECK_INTERFACE(IAudioFlinger, data, reply);
900            reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32()));
901            return NO_ERROR;
902        } break;
903        case RESTORE_OUTPUT: {
904            CHECK_INTERFACE(IAudioFlinger, data, reply);
905            reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32()));
906            return NO_ERROR;
907        } break;
908        case OPEN_INPUT: {
909            CHECK_INTERFACE(IAudioFlinger, data, reply);
910            audio_module_handle_t module = (audio_module_handle_t)data.readInt32();
911            audio_devices_t devices = (audio_devices_t)data.readInt32();
912            uint32_t samplingRate = data.readInt32();
913            audio_format_t format = (audio_format_t) data.readInt32();
914            audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32();
915
916            audio_io_handle_t input = openInput(module,
917                                             &devices,
918                                             &samplingRate,
919                                             &format,
920                                             &channelMask);
921            reply->writeInt32((int32_t) input);
922            reply->writeInt32(devices);
923            reply->writeInt32(samplingRate);
924            reply->writeInt32(format);
925            reply->writeInt32(channelMask);
926            return NO_ERROR;
927        } break;
928        case CLOSE_INPUT: {
929            CHECK_INTERFACE(IAudioFlinger, data, reply);
930            reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32()));
931            return NO_ERROR;
932        } break;
933        case SET_STREAM_OUTPUT: {
934            CHECK_INTERFACE(IAudioFlinger, data, reply);
935            uint32_t stream = data.readInt32();
936            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
937            reply->writeInt32(setStreamOutput((audio_stream_type_t) stream, output));
938            return NO_ERROR;
939        } break;
940        case SET_VOICE_VOLUME: {
941            CHECK_INTERFACE(IAudioFlinger, data, reply);
942            float volume = data.readFloat();
943            reply->writeInt32( setVoiceVolume(volume) );
944            return NO_ERROR;
945        } break;
946        case GET_RENDER_POSITION: {
947            CHECK_INTERFACE(IAudioFlinger, data, reply);
948            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
949            uint32_t halFrames;
950            uint32_t dspFrames;
951            status_t status = getRenderPosition(&halFrames, &dspFrames, output);
952            reply->writeInt32(status);
953            if (status == NO_ERROR) {
954                reply->writeInt32(halFrames);
955                reply->writeInt32(dspFrames);
956            }
957            return NO_ERROR;
958        }
959        case GET_INPUT_FRAMES_LOST: {
960            CHECK_INTERFACE(IAudioFlinger, data, reply);
961            audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32();
962            reply->writeInt32(getInputFramesLost(ioHandle));
963            return NO_ERROR;
964        } break;
965        case NEW_AUDIO_SESSION_ID: {
966            CHECK_INTERFACE(IAudioFlinger, data, reply);
967            reply->writeInt32(newAudioSessionId());
968            return NO_ERROR;
969        } break;
970        case ACQUIRE_AUDIO_SESSION_ID: {
971            CHECK_INTERFACE(IAudioFlinger, data, reply);
972            int audioSession = data.readInt32();
973            acquireAudioSessionId(audioSession);
974            return NO_ERROR;
975        } break;
976        case RELEASE_AUDIO_SESSION_ID: {
977            CHECK_INTERFACE(IAudioFlinger, data, reply);
978            int audioSession = data.readInt32();
979            releaseAudioSessionId(audioSession);
980            return NO_ERROR;
981        } break;
982        case QUERY_NUM_EFFECTS: {
983            CHECK_INTERFACE(IAudioFlinger, data, reply);
984            uint32_t numEffects;
985            status_t status = queryNumberEffects(&numEffects);
986            reply->writeInt32(status);
987            if (status == NO_ERROR) {
988                reply->writeInt32((int32_t)numEffects);
989            }
990            return NO_ERROR;
991        }
992        case QUERY_EFFECT: {
993            CHECK_INTERFACE(IAudioFlinger, data, reply);
994            effect_descriptor_t desc;
995            status_t status = queryEffect(data.readInt32(), &desc);
996            reply->writeInt32(status);
997            if (status == NO_ERROR) {
998                reply->write(&desc, sizeof(effect_descriptor_t));
999            }
1000            return NO_ERROR;
1001        }
1002        case GET_EFFECT_DESCRIPTOR: {
1003            CHECK_INTERFACE(IAudioFlinger, data, reply);
1004            effect_uuid_t uuid;
1005            data.read(&uuid, sizeof(effect_uuid_t));
1006            effect_descriptor_t desc;
1007            status_t status = getEffectDescriptor(&uuid, &desc);
1008            reply->writeInt32(status);
1009            if (status == NO_ERROR) {
1010                reply->write(&desc, sizeof(effect_descriptor_t));
1011            }
1012            return NO_ERROR;
1013        }
1014        case CREATE_EFFECT: {
1015            CHECK_INTERFACE(IAudioFlinger, data, reply);
1016            pid_t pid = data.readInt32();
1017            effect_descriptor_t desc;
1018            data.read(&desc, sizeof(effect_descriptor_t));
1019            sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder());
1020            int32_t priority = data.readInt32();
1021            audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
1022            int sessionId = data.readInt32();
1023            status_t status;
1024            int id;
1025            int enabled;
1026
1027            sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled);
1028            reply->writeInt32(status);
1029            reply->writeInt32(id);
1030            reply->writeInt32(enabled);
1031            reply->writeStrongBinder(effect->asBinder());
1032            reply->write(&desc, sizeof(effect_descriptor_t));
1033            return NO_ERROR;
1034        } break;
1035        case MOVE_EFFECTS: {
1036            CHECK_INTERFACE(IAudioFlinger, data, reply);
1037            int session = data.readInt32();
1038            audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32();
1039            audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32();
1040            reply->writeInt32(moveEffects(session, srcOutput, dstOutput));
1041            return NO_ERROR;
1042        } break;
1043        case LOAD_HW_MODULE: {
1044            CHECK_INTERFACE(IAudioFlinger, data, reply);
1045            reply->writeInt32(loadHwModule(data.readCString()));
1046            return NO_ERROR;
1047        } break;
1048        default:
1049            return BBinder::onTransact(code, data, reply, flags);
1050    }
1051}
1052
1053// ----------------------------------------------------------------------------
1054
1055}; // namespace android
1056