IAudioFlinger.cpp revision de070137f11d346fba77605bd76a44c040a618fc
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/extlibs/pv/android/IAudioflinger.cpp 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "IAudioFlinger" 19417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye//#define LOG_NDEBUG 0 20417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye#include <utils/Log.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette#include <stdint.h> 23b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette#include <sys/types.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <binder/Parcel.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_RECORD, 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SAMPLE_RATE, 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHANNEL_COUNT, 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FORMAT, 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FRAME_COUNT, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LATENCY, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MASTER_VOLUME, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MASTER_MUTE, 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MASTER_VOLUME, 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MASTER_MUTE, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_VOLUME, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_MUTE, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STREAM_VOLUME, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STREAM_MUTE, 47b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette SET_MODE, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MIC_MUTE, 49b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette GET_MIC_MUTE, 50b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette IS_STREAM_ACTIVE, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_PARAMETERS, 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_PARAMETERS, 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REGISTER_CLIENT, 542add9bcf8c33c59f300551bdb0671bbff0b55794Alan Viverette GET_INPUTBUFFERSIZE, 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_OUTPUT, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_DUPLICATE_OUTPUT, 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_OUTPUT, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SUSPEND_OUTPUT, 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESTORE_OUTPUT, 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_INPUT, 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_INPUT, 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_STREAM_OUTPUT, 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_VOICE_VOLUME, 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_RENDER_POSITION, 65b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette GET_INPUT_FRAMES_LOST, 66b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette NEW_AUDIO_SESSION_ID, 67b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette LOAD_EFFECT_LIBRARY, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project UNLOAD_EFFECT_LIBRARY, 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project QUERY_NUM_EFFECTS, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project QUERY_EFFECT, 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_EFFECT_DESCRIPTOR, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_EFFECT, 73b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette MOVE_EFFECTS 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpAudioFlinger : public BpInterface<IAudioFlinger> 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpAudioFlinger(const sp<IBinder>& impl) 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BpInterface<IAudioFlinger>(impl) 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioTrack> createTrack( 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 87417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye uint32_t sampleRate, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int output, 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int *sessionId, 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioTrack> track; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(pid); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(streamType); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(sampleRate); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(format); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(channelCount); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(frameCount); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(flags); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStrongBinder(sharedBuffer->asBinder()); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lSessionId = 0; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sessionId != NULL) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lSessionId = *sessionId; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(lSessionId); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lStatus != NO_ERROR) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("createTrack error: %s", strerror(-lStatus)); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lSessionId = reply.readInt32(); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sessionId != NULL) { 120b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette *sessionId = lSessionId; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStatus = reply.readInt32(); 123b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *status = lStatus; 127b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return track; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioRecord> openRecord( 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int input, 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int *sessionId, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioRecord> record; 144b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 145b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(pid); 146b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(input); 147b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(sampleRate); 148b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(format); 149b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(channelCount); 150b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(frameCount); 151b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(flags); 152b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette int lSessionId = 0; 153b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette if (sessionId != NULL) { 154b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette lSessionId = *sessionId; 155b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 156b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(lSessionId); 157b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 158b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette if (lStatus != NO_ERROR) { 159b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette LOGE("openRecord error: %s", strerror(-lStatus)); 160b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } else { 161b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette lSessionId = reply.readInt32(); 162b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette if (sessionId != NULL) { 163b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette *sessionId = lSessionId; 164b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 165b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette lStatus = reply.readInt32(); 166b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 167b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 168b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette if (status) { 169b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette *status = lStatus; 170b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 171b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette return record; 172b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t sampleRate(int output) const 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 177b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 178b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette data.writeInt32(output); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual int channelCount(int output) const 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(CHANNEL_COUNT, data, &reply); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual int format(int output) const 193c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(FORMAT, data, &reply); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual size_t frameCount(int output) const 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy virtual uint32_t latency(int output) const 211b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy { 212b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy Parcel data, reply; 213b187a847a5b1ad7b03c1fff95366e8cf6bc96be2Romain Guy data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(LATENCY, data, &reply); 216c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy return reply.readInt32(); 217c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value) 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeFloat(value); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted) 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(muted); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MASTER_MUTE, data, &reply); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readFloat(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamVolume(int stream, float value, int output) 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(stream); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeFloat(value); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_STREAM_VOLUME, data, &reply); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted) 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(stream); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(muted); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_STREAM_MUTE, data, &reply); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float streamVolume(int stream, int output) const 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(stream); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readFloat(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(stream); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMode(int mode) 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(mode); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MODE, data, &reply); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMicMute(bool state) 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 306f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa data.writeInt32(state); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MIC_MUTE, data, &reply); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool getMicMute() const 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(GET_MIC_MUTE, data, &reply); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool isStreamActive(int stream) const 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(stream); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(IS_STREAM_ACTIVE, data, &reply); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setParameters(int ioHandle, const String8& keyValuePairs) 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(ioHandle); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString8(keyValuePairs); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_PARAMETERS, data, &reply); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual String8 getParameters(int ioHandle, const String8& keys) 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(ioHandle); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString8(keys); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(GET_PARAMETERS, data, &reply); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readString8(); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void registerClient(const sp<IAudioFlingerClient>& client) 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStrongBinder(client->asBinder()); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(REGISTER_CLIENT, data, &reply); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(sampleRate); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(format); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(channelCount); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual int openOutput(uint32_t *pDevices, 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t *pSamplingRate, 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t *pFormat, 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t *pChannels, 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t *pLatencyMs, 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags) 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t devices = pDevices ? *pDevices : 0; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t format = pFormat ? *pFormat : 0; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t channels = pChannels ? *pChannels : 0; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(devices); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(samplingRate); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(format); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(channels); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(latency); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(flags); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(OPEN_OUTPUT, data, &reply); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int output = reply.readInt32(); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("openOutput() returned output, %p", output); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project devices = reply.readInt32(); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pDevices) *pDevices = devices; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project samplingRate = reply.readInt32(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pSamplingRate) *pSamplingRate = samplingRate; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project format = reply.readInt32(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pFormat) *pFormat = format; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = reply.readInt32(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pChannels) *pChannels = channels; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project latency = reply.readInt32(); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pLatencyMs) *pLatencyMs = latency; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return output; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual int openDuplicateOutput(int output1, int output2) 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output1); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output2); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t closeOutput(int output) 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(output); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(CLOSE_OUTPUT, data, &reply); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 423 virtual status_t suspendOutput(int output) 424 { 425 Parcel data, reply; 426 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 427 data.writeInt32(output); 428 remote()->transact(SUSPEND_OUTPUT, data, &reply); 429 return reply.readInt32(); 430 } 431 432 virtual status_t restoreOutput(int output) 433 { 434 Parcel data, reply; 435 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 436 data.writeInt32(output); 437 remote()->transact(RESTORE_OUTPUT, data, &reply); 438 return reply.readInt32(); 439 } 440 441 virtual int openInput(uint32_t *pDevices, 442 uint32_t *pSamplingRate, 443 uint32_t *pFormat, 444 uint32_t *pChannels, 445 uint32_t acoustics) 446 { 447 Parcel data, reply; 448 uint32_t devices = pDevices ? *pDevices : 0; 449 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 450 uint32_t format = pFormat ? *pFormat : 0; 451 uint32_t channels = pChannels ? *pChannels : 0; 452 453 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 454 data.writeInt32(devices); 455 data.writeInt32(samplingRate); 456 data.writeInt32(format); 457 data.writeInt32(channels); 458 data.writeInt32(acoustics); 459 remote()->transact(OPEN_INPUT, data, &reply); 460 int input = reply.readInt32(); 461 devices = reply.readInt32(); 462 if (pDevices) *pDevices = devices; 463 samplingRate = reply.readInt32(); 464 if (pSamplingRate) *pSamplingRate = samplingRate; 465 format = reply.readInt32(); 466 if (pFormat) *pFormat = format; 467 channels = reply.readInt32(); 468 if (pChannels) *pChannels = channels; 469 return input; 470 } 471 472 virtual status_t closeInput(int input) 473 { 474 Parcel data, reply; 475 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 476 data.writeInt32(input); 477 remote()->transact(CLOSE_INPUT, data, &reply); 478 return reply.readInt32(); 479 } 480 481 virtual status_t setStreamOutput(uint32_t stream, int output) 482 { 483 Parcel data, reply; 484 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 485 data.writeInt32(stream); 486 data.writeInt32(output); 487 remote()->transact(SET_STREAM_OUTPUT, data, &reply); 488 return reply.readInt32(); 489 } 490 491 virtual status_t setVoiceVolume(float volume) 492 { 493 Parcel data, reply; 494 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 495 data.writeFloat(volume); 496 remote()->transact(SET_VOICE_VOLUME, data, &reply); 497 return reply.readInt32(); 498 } 499 500 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) 501 { 502 Parcel data, reply; 503 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 504 data.writeInt32(output); 505 remote()->transact(GET_RENDER_POSITION, data, &reply); 506 status_t status = reply.readInt32(); 507 if (status == NO_ERROR) { 508 uint32_t tmp = reply.readInt32(); 509 if (halFrames) { 510 *halFrames = tmp; 511 } 512 tmp = reply.readInt32(); 513 if (dspFrames) { 514 *dspFrames = tmp; 515 } 516 } 517 return status; 518 } 519 520 virtual unsigned int getInputFramesLost(int ioHandle) 521 { 522 Parcel data, reply; 523 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 524 data.writeInt32(ioHandle); 525 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 526 return reply.readInt32(); 527 } 528 529 virtual int newAudioSessionId() 530 { 531 Parcel data, reply; 532 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 533 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 534 int id = 0; 535 if (status == NO_ERROR) { 536 id = reply.readInt32(); 537 } 538 return id; 539 } 540 541 virtual status_t loadEffectLibrary(const char *libPath, int *handle) 542 { 543 if (libPath == NULL || handle == NULL) { 544 return BAD_VALUE; 545 } 546 *handle = 0; 547 Parcel data, reply; 548 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 549 data.writeCString(libPath); 550 status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply); 551 if (status == NO_ERROR) { 552 status = reply.readInt32(); 553 if (status == NO_ERROR) { 554 *handle = reply.readInt32(); 555 } 556 } 557 return status; 558 } 559 560 virtual status_t unloadEffectLibrary(int handle) 561 { 562 Parcel data, reply; 563 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 564 data.writeInt32(handle); 565 status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply); 566 if (status == NO_ERROR) { 567 status = reply.readInt32(); 568 } 569 return status; 570 } 571 572 virtual status_t queryNumberEffects(uint32_t *numEffects) 573 { 574 Parcel data, reply; 575 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 576 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 577 if (status != NO_ERROR) { 578 return status; 579 } 580 status = reply.readInt32(); 581 if (status != NO_ERROR) { 582 return status; 583 } 584 if (numEffects) { 585 *numEffects = (uint32_t)reply.readInt32(); 586 } 587 return NO_ERROR; 588 } 589 590 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) 591 { 592 if (pDescriptor == NULL) { 593 return BAD_VALUE; 594 } 595 Parcel data, reply; 596 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 597 data.writeInt32(index); 598 status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 599 if (status != NO_ERROR) { 600 return status; 601 } 602 status = reply.readInt32(); 603 if (status != NO_ERROR) { 604 return status; 605 } 606 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 607 return NO_ERROR; 608 } 609 610 virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor) 611 { 612 if (pUuid == NULL || pDescriptor == NULL) { 613 return BAD_VALUE; 614 } 615 Parcel data, reply; 616 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 617 data.write(pUuid, sizeof(effect_uuid_t)); 618 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 619 if (status != NO_ERROR) { 620 return status; 621 } 622 status = reply.readInt32(); 623 if (status != NO_ERROR) { 624 return status; 625 } 626 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 627 return NO_ERROR; 628 } 629 630 virtual sp<IEffect> createEffect(pid_t pid, 631 effect_descriptor_t *pDesc, 632 const sp<IEffectClient>& client, 633 int32_t priority, 634 int output, 635 int sessionId, 636 status_t *status, 637 int *id, 638 int *enabled) 639 { 640 Parcel data, reply; 641 sp<IEffect> effect; 642 643 if (pDesc == NULL) { 644 return effect; 645 if (status) { 646 *status = BAD_VALUE; 647 } 648 } 649 650 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 651 data.writeInt32(pid); 652 data.write(pDesc, sizeof(effect_descriptor_t)); 653 data.writeStrongBinder(client->asBinder()); 654 data.writeInt32(priority); 655 data.writeInt32(output); 656 data.writeInt32(sessionId); 657 658 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 659 if (lStatus != NO_ERROR) { 660 LOGE("createEffect error: %s", strerror(-lStatus)); 661 } else { 662 lStatus = reply.readInt32(); 663 int tmp = reply.readInt32(); 664 if (id) { 665 *id = tmp; 666 } 667 tmp = reply.readInt32(); 668 if (enabled) { 669 *enabled = tmp; 670 } 671 effect = interface_cast<IEffect>(reply.readStrongBinder()); 672 reply.read(pDesc, sizeof(effect_descriptor_t)); 673 } 674 if (status) { 675 *status = lStatus; 676 } 677 678 return effect; 679 } 680 681 virtual status_t moveEffects(int session, int srcOutput, int dstOutput) 682 { 683 Parcel data, reply; 684 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 685 data.writeInt32(session); 686 data.writeInt32(srcOutput); 687 data.writeInt32(dstOutput); 688 remote()->transact(MOVE_EFFECTS, data, &reply); 689 return reply.readInt32(); 690 } 691}; 692 693IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 694 695// ---------------------------------------------------------------------- 696 697status_t BnAudioFlinger::onTransact( 698 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 699{ 700 switch(code) { 701 case CREATE_TRACK: { 702 CHECK_INTERFACE(IAudioFlinger, data, reply); 703 pid_t pid = data.readInt32(); 704 int streamType = data.readInt32(); 705 uint32_t sampleRate = data.readInt32(); 706 int format = data.readInt32(); 707 int channelCount = data.readInt32(); 708 size_t bufferCount = data.readInt32(); 709 uint32_t flags = data.readInt32(); 710 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 711 int output = data.readInt32(); 712 int sessionId = data.readInt32(); 713 status_t status; 714 sp<IAudioTrack> track = createTrack(pid, 715 streamType, sampleRate, format, 716 channelCount, bufferCount, flags, buffer, output, &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 int input = data.readInt32(); 726 uint32_t sampleRate = data.readInt32(); 727 int format = data.readInt32(); 728 int channelCount = data.readInt32(); 729 size_t bufferCount = data.readInt32(); 730 uint32_t flags = data.readInt32(); 731 int sessionId = data.readInt32(); 732 status_t status; 733 sp<IAudioRecord> record = openRecord(pid, input, 734 sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status); 735 reply->writeInt32(sessionId); 736 reply->writeInt32(status); 737 reply->writeStrongBinder(record->asBinder()); 738 return NO_ERROR; 739 } break; 740 case SAMPLE_RATE: { 741 CHECK_INTERFACE(IAudioFlinger, data, reply); 742 reply->writeInt32( sampleRate(data.readInt32()) ); 743 return NO_ERROR; 744 } break; 745 case CHANNEL_COUNT: { 746 CHECK_INTERFACE(IAudioFlinger, data, reply); 747 reply->writeInt32( channelCount(data.readInt32()) ); 748 return NO_ERROR; 749 } break; 750 case FORMAT: { 751 CHECK_INTERFACE(IAudioFlinger, data, reply); 752 reply->writeInt32( format(data.readInt32()) ); 753 return NO_ERROR; 754 } break; 755 case FRAME_COUNT: { 756 CHECK_INTERFACE(IAudioFlinger, data, reply); 757 reply->writeInt32( frameCount(data.readInt32()) ); 758 return NO_ERROR; 759 } break; 760 case LATENCY: { 761 CHECK_INTERFACE(IAudioFlinger, data, reply); 762 reply->writeInt32( latency(data.readInt32()) ); 763 return NO_ERROR; 764 } break; 765 case SET_MASTER_VOLUME: { 766 CHECK_INTERFACE(IAudioFlinger, data, reply); 767 reply->writeInt32( setMasterVolume(data.readFloat()) ); 768 return NO_ERROR; 769 } break; 770 case SET_MASTER_MUTE: { 771 CHECK_INTERFACE(IAudioFlinger, data, reply); 772 reply->writeInt32( setMasterMute(data.readInt32()) ); 773 return NO_ERROR; 774 } break; 775 case MASTER_VOLUME: { 776 CHECK_INTERFACE(IAudioFlinger, data, reply); 777 reply->writeFloat( masterVolume() ); 778 return NO_ERROR; 779 } break; 780 case MASTER_MUTE: { 781 CHECK_INTERFACE(IAudioFlinger, data, reply); 782 reply->writeInt32( masterMute() ); 783 return NO_ERROR; 784 } break; 785 case SET_STREAM_VOLUME: { 786 CHECK_INTERFACE(IAudioFlinger, data, reply); 787 int stream = data.readInt32(); 788 float volume = data.readFloat(); 789 int output = data.readInt32(); 790 reply->writeInt32( setStreamVolume(stream, volume, output) ); 791 return NO_ERROR; 792 } break; 793 case SET_STREAM_MUTE: { 794 CHECK_INTERFACE(IAudioFlinger, data, reply); 795 int stream = data.readInt32(); 796 reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 797 return NO_ERROR; 798 } break; 799 case STREAM_VOLUME: { 800 CHECK_INTERFACE(IAudioFlinger, data, reply); 801 int stream = data.readInt32(); 802 int output = data.readInt32(); 803 reply->writeFloat( streamVolume(stream, output) ); 804 return NO_ERROR; 805 } break; 806 case STREAM_MUTE: { 807 CHECK_INTERFACE(IAudioFlinger, data, reply); 808 int stream = data.readInt32(); 809 reply->writeInt32( streamMute(stream) ); 810 return NO_ERROR; 811 } break; 812 case SET_MODE: { 813 CHECK_INTERFACE(IAudioFlinger, data, reply); 814 int mode = data.readInt32(); 815 reply->writeInt32( setMode(mode) ); 816 return NO_ERROR; 817 } break; 818 case SET_MIC_MUTE: { 819 CHECK_INTERFACE(IAudioFlinger, data, reply); 820 int state = data.readInt32(); 821 reply->writeInt32( setMicMute(state) ); 822 return NO_ERROR; 823 } break; 824 case GET_MIC_MUTE: { 825 CHECK_INTERFACE(IAudioFlinger, data, reply); 826 reply->writeInt32( getMicMute() ); 827 return NO_ERROR; 828 } break; 829 case IS_STREAM_ACTIVE: { 830 CHECK_INTERFACE(IAudioFlinger, data, reply); 831 int stream = data.readInt32(); 832 reply->writeInt32( isStreamActive(stream) ); 833 return NO_ERROR; 834 } break; 835 case SET_PARAMETERS: { 836 CHECK_INTERFACE(IAudioFlinger, data, reply); 837 int ioHandle = data.readInt32(); 838 String8 keyValuePairs(data.readString8()); 839 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 840 return NO_ERROR; 841 } break; 842 case GET_PARAMETERS: { 843 CHECK_INTERFACE(IAudioFlinger, data, reply); 844 int ioHandle = data.readInt32(); 845 String8 keys(data.readString8()); 846 reply->writeString8(getParameters(ioHandle, keys)); 847 return NO_ERROR; 848 } break; 849 850 case REGISTER_CLIENT: { 851 CHECK_INTERFACE(IAudioFlinger, data, reply); 852 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 853 registerClient(client); 854 return NO_ERROR; 855 } break; 856 case GET_INPUTBUFFERSIZE: { 857 CHECK_INTERFACE(IAudioFlinger, data, reply); 858 uint32_t sampleRate = data.readInt32(); 859 int format = data.readInt32(); 860 int channelCount = data.readInt32(); 861 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 862 return NO_ERROR; 863 } break; 864 case OPEN_OUTPUT: { 865 CHECK_INTERFACE(IAudioFlinger, data, reply); 866 uint32_t devices = data.readInt32(); 867 uint32_t samplingRate = data.readInt32(); 868 uint32_t format = data.readInt32(); 869 uint32_t channels = data.readInt32(); 870 uint32_t latency = data.readInt32(); 871 uint32_t flags = data.readInt32(); 872 int output = openOutput(&devices, 873 &samplingRate, 874 &format, 875 &channels, 876 &latency, 877 flags); 878 LOGV("OPEN_OUTPUT output, %p", output); 879 reply->writeInt32(output); 880 reply->writeInt32(devices); 881 reply->writeInt32(samplingRate); 882 reply->writeInt32(format); 883 reply->writeInt32(channels); 884 reply->writeInt32(latency); 885 return NO_ERROR; 886 } break; 887 case OPEN_DUPLICATE_OUTPUT: { 888 CHECK_INTERFACE(IAudioFlinger, data, reply); 889 int output1 = data.readInt32(); 890 int output2 = data.readInt32(); 891 reply->writeInt32(openDuplicateOutput(output1, output2)); 892 return NO_ERROR; 893 } break; 894 case CLOSE_OUTPUT: { 895 CHECK_INTERFACE(IAudioFlinger, data, reply); 896 reply->writeInt32(closeOutput(data.readInt32())); 897 return NO_ERROR; 898 } break; 899 case SUSPEND_OUTPUT: { 900 CHECK_INTERFACE(IAudioFlinger, data, reply); 901 reply->writeInt32(suspendOutput(data.readInt32())); 902 return NO_ERROR; 903 } break; 904 case RESTORE_OUTPUT: { 905 CHECK_INTERFACE(IAudioFlinger, data, reply); 906 reply->writeInt32(restoreOutput(data.readInt32())); 907 return NO_ERROR; 908 } break; 909 case OPEN_INPUT: { 910 CHECK_INTERFACE(IAudioFlinger, data, reply); 911 uint32_t devices = data.readInt32(); 912 uint32_t samplingRate = data.readInt32(); 913 uint32_t format = data.readInt32(); 914 uint32_t channels = data.readInt32(); 915 uint32_t acoutics = data.readInt32(); 916 917 int input = openInput(&devices, 918 &samplingRate, 919 &format, 920 &channels, 921 acoutics); 922 reply->writeInt32(input); 923 reply->writeInt32(devices); 924 reply->writeInt32(samplingRate); 925 reply->writeInt32(format); 926 reply->writeInt32(channels); 927 return NO_ERROR; 928 } break; 929 case CLOSE_INPUT: { 930 CHECK_INTERFACE(IAudioFlinger, data, reply); 931 reply->writeInt32(closeInput(data.readInt32())); 932 return NO_ERROR; 933 } break; 934 case SET_STREAM_OUTPUT: { 935 CHECK_INTERFACE(IAudioFlinger, data, reply); 936 uint32_t stream = data.readInt32(); 937 int output = data.readInt32(); 938 reply->writeInt32(setStreamOutput(stream, output)); 939 return NO_ERROR; 940 } break; 941 case SET_VOICE_VOLUME: { 942 CHECK_INTERFACE(IAudioFlinger, data, reply); 943 float volume = data.readFloat(); 944 reply->writeInt32( setVoiceVolume(volume) ); 945 return NO_ERROR; 946 } break; 947 case GET_RENDER_POSITION: { 948 CHECK_INTERFACE(IAudioFlinger, data, reply); 949 int output = data.readInt32(); 950 uint32_t halFrames; 951 uint32_t dspFrames; 952 status_t status = getRenderPosition(&halFrames, &dspFrames, output); 953 reply->writeInt32(status); 954 if (status == NO_ERROR) { 955 reply->writeInt32(halFrames); 956 reply->writeInt32(dspFrames); 957 } 958 return NO_ERROR; 959 } 960 case GET_INPUT_FRAMES_LOST: { 961 CHECK_INTERFACE(IAudioFlinger, data, reply); 962 int ioHandle = data.readInt32(); 963 reply->writeInt32(getInputFramesLost(ioHandle)); 964 return NO_ERROR; 965 } break; 966 case NEW_AUDIO_SESSION_ID: { 967 CHECK_INTERFACE(IAudioFlinger, data, reply); 968 reply->writeInt32(newAudioSessionId()); 969 return NO_ERROR; 970 } break; 971 case LOAD_EFFECT_LIBRARY: { 972 CHECK_INTERFACE(IAudioFlinger, data, reply); 973 int handle; 974 status_t status = loadEffectLibrary(data.readCString(), &handle); 975 reply->writeInt32(status); 976 if (status == NO_ERROR) { 977 reply->writeInt32(handle); 978 } 979 return NO_ERROR; 980 } 981 case UNLOAD_EFFECT_LIBRARY: { 982 CHECK_INTERFACE(IAudioFlinger, data, reply); 983 reply->writeInt32(unloadEffectLibrary(data.readInt32())); 984 return NO_ERROR; 985 } 986 case QUERY_NUM_EFFECTS: { 987 CHECK_INTERFACE(IAudioFlinger, data, reply); 988 uint32_t numEffects; 989 status_t status = queryNumberEffects(&numEffects); 990 reply->writeInt32(status); 991 if (status == NO_ERROR) { 992 reply->writeInt32((int32_t)numEffects); 993 } 994 return NO_ERROR; 995 } 996 case QUERY_EFFECT: { 997 CHECK_INTERFACE(IAudioFlinger, data, reply); 998 effect_descriptor_t desc; 999 status_t status = queryEffect(data.readInt32(), &desc); 1000 reply->writeInt32(status); 1001 if (status == NO_ERROR) { 1002 reply->write(&desc, sizeof(effect_descriptor_t)); 1003 } 1004 return NO_ERROR; 1005 } 1006 case GET_EFFECT_DESCRIPTOR: { 1007 CHECK_INTERFACE(IAudioFlinger, data, reply); 1008 effect_uuid_t uuid; 1009 data.read(&uuid, sizeof(effect_uuid_t)); 1010 effect_descriptor_t desc; 1011 status_t status = getEffectDescriptor(&uuid, &desc); 1012 reply->writeInt32(status); 1013 if (status == NO_ERROR) { 1014 reply->write(&desc, sizeof(effect_descriptor_t)); 1015 } 1016 return NO_ERROR; 1017 } 1018 case CREATE_EFFECT: { 1019 CHECK_INTERFACE(IAudioFlinger, data, reply); 1020 pid_t pid = data.readInt32(); 1021 effect_descriptor_t desc; 1022 data.read(&desc, sizeof(effect_descriptor_t)); 1023 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1024 int32_t priority = data.readInt32(); 1025 int output = data.readInt32(); 1026 int sessionId = data.readInt32(); 1027 status_t status; 1028 int id; 1029 int enabled; 1030 1031 sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled); 1032 reply->writeInt32(status); 1033 reply->writeInt32(id); 1034 reply->writeInt32(enabled); 1035 reply->writeStrongBinder(effect->asBinder()); 1036 reply->write(&desc, sizeof(effect_descriptor_t)); 1037 return NO_ERROR; 1038 } break; 1039 case MOVE_EFFECTS: { 1040 CHECK_INTERFACE(IAudioFlinger, data, reply); 1041 int session = data.readInt32(); 1042 int srcOutput = data.readInt32(); 1043 int dstOutput = data.readInt32(); 1044 reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1045 return NO_ERROR; 1046 } break; 1047 default: 1048 return BBinder::onTransact(code, data, reply, flags); 1049 } 1050} 1051 1052// ---------------------------------------------------------------------------- 1053 1054}; // namespace android 1055