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" 19a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent//#define LOG_NDEBUG 0 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 250795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#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, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MODE, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_MIC_MUTE, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_MIC_MUTE, 5023f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent IS_STREAM_ACTIVE, 51a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SET_PARAMETERS, 52a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent GET_PARAMETERS, 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REGISTER_CLIENT, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_INPUTBUFFERSIZE, 55a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OPEN_OUTPUT, 56a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OPEN_DUPLICATE_OUTPUT, 57a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CLOSE_OUTPUT, 58a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SUSPEND_OUTPUT, 59a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RESTORE_OUTPUT, 60a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OPEN_INPUT, 61a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CLOSE_INPUT, 62415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent SET_STREAM_OUTPUT, 630986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent SET_VOICE_VOLUME, 6447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent GET_RENDER_POSITION, 6565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent GET_INPUT_FRAMES_LOST, 6665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent NEW_AUDIO_SESSION_ID, 6765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent LOAD_EFFECT_LIBRARY, 6865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent UNLOAD_EFFECT_LIBRARY, 6965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent QUERY_NUM_EFFECTS, 7053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent QUERY_EFFECT, 7165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent GET_EFFECT_DESCRIPTOR, 728ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent CREATE_EFFECT, 738ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 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, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 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, 93ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output, 9465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *sessionId, 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 988a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent 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()); 108ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output); 10965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int lSessionId = 0; 11065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (sessionId != NULL) { 11165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent lSessionId = *sessionId; 11265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 11365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 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)); 1178a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent } else { 11865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent lSessionId = reply.readInt32(); 11965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (sessionId != NULL) { 12065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *sessionId = lSessionId; 12165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 1228a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent lStatus = reply.readInt32(); 1238a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent 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; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1288a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent 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, 133ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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, 13965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *sessionId, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1438a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent sp<IAudioRecord> record; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(pid); 146ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(input); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(sampleRate); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(format); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(channelCount); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(frameCount); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(flags); 15265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int lSessionId = 0; 15365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (sessionId != NULL) { 15465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent lSessionId = *sessionId; 15565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 15665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInt32(lSessionId); 1578a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 1588a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent if (lStatus != NO_ERROR) { 1598a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent LOGE("openRecord error: %s", strerror(-lStatus)); 1608a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent } else { 16165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent lSessionId = reply.readInt32(); 16265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (sessionId != NULL) { 16365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *sessionId = lSessionId; 16465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 1658a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent lStatus = reply.readInt32(); 1668a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 1678a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *status = lStatus; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1718a77a995c961c7c9a3888f4212f7be87d08afae1Eric Laurent return record; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 174ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t sampleRate(int output) const 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 178ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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 183ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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()); 187ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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 192ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int format(int output) const 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 196ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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 201ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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()); 205ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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 210ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t latency(int output) const 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 214ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(LATENCY, data, &reply); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 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 253ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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); 259ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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 274ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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); 279ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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 293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 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); 298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(SET_MODE, data, &reply); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 302a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 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()); 306a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(state); 307a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 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 311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 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()); 315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 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 31923f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent 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()); 32323f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent data.writeInt32(stream); 32423f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent 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 328ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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()); 332ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(ioHandle); 333a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeString8(keyValuePairs); 334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(SET_PARAMETERS, data, &reply); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 338ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent 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()); 342ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(ioHandle); 343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeString8(keys); 344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(GET_PARAMETERS, data, &reply); 345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return reply.readString8(); 346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void registerClient(const sp<IAudioFlingerClient>& client) 349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Parcel data, reply; 351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 352a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeStrongBinder(client->asBinder()); 353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(REGISTER_CLIENT, data, &reply); 354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 356a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 357a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 358a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Parcel data, reply; 359a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(sampleRate); 361a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(format); 362a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(channelCount); 363a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 367ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openOutput(uint32_t *pDevices, 368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pSamplingRate, 369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pFormat, 370a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pChannels, 371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pLatencyMs, 372a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags) 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 375a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t devices = pDevices ? *pDevices : 0; 376a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 377a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format = pFormat ? *pFormat : 0; 378a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = pChannels ? *pChannels : 0; 379a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 380a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 382a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(devices); 383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(samplingRate); 384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(format); 385a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(channels); 386a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(latency); 387a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(flags); 388a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(OPEN_OUTPUT, data, &reply); 389ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output = reply.readInt32(); 390a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("openOutput() returned output, %p", output); 391a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent devices = reply.readInt32(); 392a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pDevices) *pDevices = devices; 393a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent samplingRate = reply.readInt32(); 394a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 395a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent format = reply.readInt32(); 396a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pFormat) *pFormat = format; 397a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent channels = reply.readInt32(); 398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pChannels) *pChannels = channels; 399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent latency = reply.readInt32(); 400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pLatencyMs) *pLatencyMs = latency; 401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return output; 402a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 403a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 404ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openDuplicateOutput(int output1, int output2) 405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Parcel data, reply; 407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 408ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output1); 409ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output2); 410a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 411ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent return reply.readInt32(); 412a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 413a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 414ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeOutput(int output) 415a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 416a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Parcel data, reply; 417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 418ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output); 419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(CLOSE_OUTPUT, data, &reply); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 423ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t suspendOutput(int output) 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 427ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output); 428a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(SUSPEND_OUTPUT, data, &reply); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 432ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t restoreOutput(int output) 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 436ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output); 437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(RESTORE_OUTPUT, data, &reply); 438a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return reply.readInt32(); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 440a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 441ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openInput(uint32_t *pDevices, 442ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent uint32_t *pSamplingRate, 443ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent uint32_t *pFormat, 444ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent uint32_t *pChannels, 445ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent uint32_t acoustics) 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 448a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t devices = pDevices ? *pDevices : 0; 449a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 450a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format = pFormat ? *pFormat : 0; 451a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = pChannels ? *pChannels : 0; 452a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 454a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(devices); 455a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(samplingRate); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(format); 457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(channels); 458a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(acoustics); 459a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(OPEN_INPUT, data, &reply); 460ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int input = reply.readInt32(); 461a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent devices = reply.readInt32(); 462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pDevices) *pDevices = devices; 463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent samplingRate = reply.readInt32(); 464a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pSamplingRate) *pSamplingRate = samplingRate; 465a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent format = reply.readInt32(); 466a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pFormat) *pFormat = format; 467a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent channels = reply.readInt32(); 468a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (pChannels) *pChannels = channels; 469a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return input; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 471a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 472ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeInput(int input) 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 476ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(input); 477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(CLOSE_INPUT, data, &reply); 478a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return reply.readInt32(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 481ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setStreamOutput(uint32_t stream, int output) 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 485a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent data.writeInt32(stream); 486ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent data.writeInt32(output); 487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent remote()->transact(SET_STREAM_OUTPUT, data, &reply); 488a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return reply.readInt32(); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 490415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent 491415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent virtual status_t setVoiceVolume(float volume) 492415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent { 493415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent Parcel data, reply; 494415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 495415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent data.writeFloat(volume); 496415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent remote()->transact(SET_VOICE_VOLUME, data, &reply); 497415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent return reply.readInt32(); 498415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent } 4990986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 5000986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) 5010986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent { 5020986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent Parcel data, reply; 5030986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5040986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent data.writeInt32(output); 5050986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent remote()->transact(GET_RENDER_POSITION, data, &reply); 5060986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent status_t status = reply.readInt32(); 5070986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (status == NO_ERROR) { 5080986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent uint32_t tmp = reply.readInt32(); 5090986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (halFrames) { 5100986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent *halFrames = tmp; 5110986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 5120986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent tmp = reply.readInt32(); 5130986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (dspFrames) { 5140986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent *dspFrames = tmp; 5150986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 5160986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 5170986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent return status; 5180986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 51947d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 52047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent virtual unsigned int getInputFramesLost(int ioHandle) 52147d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent { 52247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent Parcel data, reply; 52347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 52447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent data.writeInt32(ioHandle); 52547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 52647d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent return reply.readInt32(); 52747d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent } 52865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 52965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual int newAudioSessionId() 53065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent { 53165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel data, reply; 53265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 53365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 53465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int id = 0; 53565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 53665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent id = reply.readInt32(); 53765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 53865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return id; 53965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 54065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 54165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t loadEffectLibrary(const char *libPath, int *handle) 54265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent { 54365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (libPath == NULL || handle == NULL) { 54465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return BAD_VALUE; 54565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 54665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *handle = 0; 54765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel data, reply; 54865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 54965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeCString(libPath); 55065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply); 55165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 55265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status = reply.readInt32(); 55365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 55465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *handle = reply.readInt32(); 55565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 55665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 55765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 55865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 55965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 56065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t unloadEffectLibrary(int handle) 56165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent { 56265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel data, reply; 56365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 56465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInt32(handle); 56565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply); 56665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 56765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status = reply.readInt32(); 56865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 56965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 57065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 57165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 57265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t queryNumberEffects(uint32_t *numEffects) 57365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent { 57465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel data, reply; 57565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 57665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 57765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status != NO_ERROR) { 57865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 57965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 58065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status = reply.readInt32(); 58165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status != NO_ERROR) { 58265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 58365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 58465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (numEffects) { 58565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *numEffects = (uint32_t)reply.readInt32(); 58665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 58765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 58865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 58965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 59053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) 59165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent { 59265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (pDescriptor == NULL) { 59365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return BAD_VALUE; 59465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 59565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel data, reply; 59665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 59753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent data.writeInt32(index); 59853334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 59965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status != NO_ERROR) { 60065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 60165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 60265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status = reply.readInt32(); 60365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status != NO_ERROR) { 60465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 60565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 60665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 60765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 60865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 60965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 61065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor) 61165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent { 61265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (pUuid == NULL || pDescriptor == NULL) { 61365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return BAD_VALUE; 61465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 61565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel data, reply; 61665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 61765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.write(pUuid, sizeof(effect_uuid_t)); 61865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 61965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status != NO_ERROR) { 62065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 62165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 62265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status = reply.readInt32(); 62365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status != NO_ERROR) { 62465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return status; 62565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 62665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply.read(pDescriptor, sizeof(effect_descriptor_t)); 62765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 62865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 62965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 63065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual sp<IEffect> createEffect(pid_t pid, 63165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t *pDesc, 63265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IEffectClient>& client, 63365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t priority, 63465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int output, 63565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId, 63665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t *status, 63765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *id, 63865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *enabled) 63965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent { 64065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel data, reply; 64165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<IEffect> effect; 64265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 64365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (pDesc == NULL) { 64465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return effect; 64565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status) { 64665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *status = BAD_VALUE; 64765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 64865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 64965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 65065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 65165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInt32(pid); 65265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.write(pDesc, sizeof(effect_descriptor_t)); 65365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeStrongBinder(client->asBinder()); 65465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInt32(priority); 65565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInt32(output); 65665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.writeInt32(sessionId); 65765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 65865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 65965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (lStatus != NO_ERROR) { 66065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent LOGE("createEffect error: %s", strerror(-lStatus)); 66165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } else { 66265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent lStatus = reply.readInt32(); 66365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int tmp = reply.readInt32(); 66465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (id) { 66565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *id = tmp; 66665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 66765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent tmp = reply.readInt32(); 66865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (enabled) { 66965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *enabled = tmp; 67065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 67165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect = interface_cast<IEffect>(reply.readStrongBinder()); 67265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply.read(pDesc, sizeof(effect_descriptor_t)); 67365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 67465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status) { 67565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent *status = lStatus; 67665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 67765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 67865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return effect; 67965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 6808ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6818ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent virtual status_t moveEffects(int session, int srcOutput, int dstOutput) 6828ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent { 6838ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent Parcel data, reply; 6848ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6858ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent data.writeInt32(session); 6868ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent data.writeInt32(srcOutput); 6878ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent data.writeInt32(dstOutput); 6888ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent remote()->transact(MOVE_EFFECTS, data, &reply); 6898ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return reply.readInt32(); 6908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnAudioFlinger::onTransact( 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(code) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CREATE_TRACK: { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid = data.readInt32(); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType = data.readInt32(); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = data.readInt32(); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = data.readInt32(); 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount = data.readInt32(); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t bufferCount = data.readInt32(); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = data.readInt32(); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 711ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output = data.readInt32(); 71265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId = data.readInt32(); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status; 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioTrack> track = createTrack(pid, 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project streamType, sampleRate, format, 71665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent channelCount, bufferCount, flags, buffer, output, &sessionId, &status); 71765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(sessionId); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(status); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(track->asBinder()); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OPEN_RECORD: { 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid = data.readInt32(); 725ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int input = data.readInt32(); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = data.readInt32(); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = data.readInt32(); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount = data.readInt32(); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t bufferCount = data.readInt32(); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = data.readInt32(); 73165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId = data.readInt32(); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status; 733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<IAudioRecord> record = openRecord(pid, input, 73465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status); 73565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(sessionId); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(status); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(record->asBinder()); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SAMPLE_RATE: { 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 742ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32( sampleRate(data.readInt32()) ); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHANNEL_COUNT: { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 747ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32( channelCount(data.readInt32()) ); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FORMAT: { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 752ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32( format(data.readInt32()) ); 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FRAME_COUNT: { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 757ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32( frameCount(data.readInt32()) ); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LATENCY: { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 762ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32( latency(data.readInt32()) ); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_MASTER_VOLUME: { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_MASTER_MUTE: { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MASTER_VOLUME: { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeFloat( masterVolume() ); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MASTER_MUTE: { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( masterMute() ); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_STREAM_VOLUME: { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int stream = data.readInt32(); 788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float volume = data.readFloat(); 789ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output = data.readInt32(); 790a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32( setStreamVolume(stream, volume, output) ); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_STREAM_MUTE: { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int stream = data.readInt32(); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STREAM_VOLUME: { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int stream = data.readInt32(); 802ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output = data.readInt32(); 803a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeFloat( streamVolume(stream, output) ); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STREAM_MUTE: { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int stream = data.readInt32(); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( streamMute(stream) ); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_MODE: { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mode = data.readInt32(); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setMode(mode) ); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_MIC_MUTE: { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int state = data.readInt32(); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setMicMute(state) ); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_MIC_MUTE: { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( getMicMute() ); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 82923f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent case IS_STREAM_ACTIVE: { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 83123f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent int stream = data.readInt32(); 83223f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent reply->writeInt32( isStreamActive(stream) ); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 835a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case SET_PARAMETERS: { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 837ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int ioHandle = data.readInt32(); 838a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 keyValuePairs(data.readString8()); 839a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 841a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 842a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case GET_PARAMETERS: { 843a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 844ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int ioHandle = data.readInt32(); 845a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 keys(data.readString8()); 846a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeString8(getParameters(ioHandle, keys)); 847a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 848a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 849a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REGISTER_CLIENT: { 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project registerClient(client); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_INPUTBUFFERSIZE: { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = data.readInt32(); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = data.readInt32(); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount = data.readInt32(); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 864a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OPEN_OUTPUT: { 865a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 866a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t devices = data.readInt32(); 867a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate = data.readInt32(); 868a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format = data.readInt32(); 869a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = data.readInt32(); 870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t latency = data.readInt32(); 871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags = data.readInt32(); 872ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output = openOutput(&devices, 873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent &samplingRate, 874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent &format, 875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent &channels, 876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent &latency, 877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent flags); 878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent LOGV("OPEN_OUTPUT output, %p", output); 879ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32(output); 880a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(devices); 881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(samplingRate); 882a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(format); 883a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(channels); 884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(latency); 885a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 886a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 887a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OPEN_DUPLICATE_OUTPUT: { 888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 889ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output1 = data.readInt32(); 890ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output2 = data.readInt32(); 891ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32(openDuplicateOutput(output1, output2)); 892a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 893a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 894a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case CLOSE_OUTPUT: { 895a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 896ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32(closeOutput(data.readInt32())); 897a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 898a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 899a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case SUSPEND_OUTPUT: { 900a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 901ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32(suspendOutput(data.readInt32())); 902a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 903a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 904a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case RESTORE_OUTPUT: { 905a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 906ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32(restoreOutput(data.readInt32())); 907a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 908a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 909a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case OPEN_INPUT: { 910a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 911a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t devices = data.readInt32(); 912a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t samplingRate = data.readInt32(); 913a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t format = data.readInt32(); 914a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = data.readInt32(); 915a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t acoutics = data.readInt32(); 916a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 917ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int input = openInput(&devices, 918a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent &samplingRate, 919a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent &format, 920a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent &channels, 921a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent acoutics); 922ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32(input); 923a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(devices); 924a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(samplingRate); 925a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(format); 926a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(channels); 927a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return NO_ERROR; 928a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } break; 929a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case CLOSE_INPUT: { 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 931ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent reply->writeInt32(closeInput(data.readInt32())); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 934a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent case SET_STREAM_OUTPUT: { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 936a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t stream = data.readInt32(); 937ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output = data.readInt32(); 938a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent reply->writeInt32(setStreamOutput(stream, output)); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 941415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent case SET_VOICE_VOLUME: { 942415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 943415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent float volume = data.readFloat(); 944415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent reply->writeInt32( setVoiceVolume(volume) ); 945415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent return NO_ERROR; 946415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent } break; 9470986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent case GET_RENDER_POSITION: { 9480986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 9490986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent int output = data.readInt32(); 9500986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent uint32_t halFrames; 9510986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent uint32_t dspFrames; 9520986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent status_t status = getRenderPosition(&halFrames, &dspFrames, output); 9530986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent reply->writeInt32(status); 9540986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent if (status == NO_ERROR) { 9550986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent reply->writeInt32(halFrames); 9560986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent reply->writeInt32(dspFrames); 9570986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 9580986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent return NO_ERROR; 9590986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent } 96047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent case GET_INPUT_FRAMES_LOST: { 96147d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 96247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent int ioHandle = data.readInt32(); 96347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent reply->writeInt32(getInputFramesLost(ioHandle)); 96447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent return NO_ERROR; 96547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent } break; 96665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent case NEW_AUDIO_SESSION_ID: { 96765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 96865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(newAudioSessionId()); 96965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 97065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } break; 97165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent case LOAD_EFFECT_LIBRARY: { 97265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 97365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int handle; 97465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = loadEffectLibrary(data.readCString(), &handle); 97565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(status); 97665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 97765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(handle); 97865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 97965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 98065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 98165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent case UNLOAD_EFFECT_LIBRARY: { 98265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 98365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(unloadEffectLibrary(data.readInt32())); 98465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 98565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 98665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent case QUERY_NUM_EFFECTS: { 98765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 98865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint32_t numEffects; 98965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = queryNumberEffects(&numEffects); 99065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(status); 99165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 99265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32((int32_t)numEffects); 99365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 99465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 99565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 99653334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent case QUERY_EFFECT: { 99765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 99865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t desc; 99953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent status_t status = queryEffect(data.readInt32(), &desc); 100065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(status); 100165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 100265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 100365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 100465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 100565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 100665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent case GET_EFFECT_DESCRIPTOR: { 100765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 100865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_uuid_t uuid; 100965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.read(&uuid, sizeof(effect_uuid_t)); 101065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t desc; 101165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status = getEffectDescriptor(&uuid, &desc); 101265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(status); 101365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent if (status == NO_ERROR) { 101465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 101565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 101665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 101765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 101865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent case CREATE_EFFECT: { 101965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 102065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent pid_t pid = data.readInt32(); 102165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t desc; 102265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent data.read(&desc, sizeof(effect_descriptor_t)); 102365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 102465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t priority = data.readInt32(); 102565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int output = data.readInt32(); 102665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId = data.readInt32(); 102765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t status; 102865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int id; 102965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int enabled; 103047d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 103165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled); 103265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(status); 103365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(id); 103465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeInt32(enabled); 103565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->writeStrongBinder(effect->asBinder()); 103665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent reply->write(&desc, sizeof(effect_descriptor_t)); 103765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return NO_ERROR; 103865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } break; 10398ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent case MOVE_EFFECTS: { 10408ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent CHECK_INTERFACE(IAudioFlinger, data, reply); 10418ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int session = data.readInt32(); 10428ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int srcOutput = data.readInt32(); 10438ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int dstOutput = data.readInt32(); 10448ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 10458ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return NO_ERROR; 10468ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent } break; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1055