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