IAudioFlinger.cpp revision ec40d284218466d8f0e832e7eb88e6ea6c479c88
1d195e5ab401432ddac659791640a2927fc668699Elliott Hughes/* 2d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** 3d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** Copyright 2007, The Android Open Source Project 4d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** 5d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** Licensed under the Apache License, Version 2.0 (the "License"); 6d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** you may not use this file except in compliance with the License. 7d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** You may obtain a copy of the License at 8d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** 9d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** http://www.apache.org/licenses/LICENSE-2.0 10d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** 11d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** Unless required by applicable law or agreed to in writing, software 12d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** distributed under the License is distributed on an "AS IS" BASIS, 13d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** See the License for the specific language governing permissions and 15d195e5ab401432ddac659791640a2927fc668699Elliott Hughes** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "IAudioFlinger" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian 220bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick#include <stdint.h> 230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <sys/types.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <binder/Parcel.h> 260795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian 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, 359f8203a159d46124a0907a0d9500e599533beed3Brian Carlstrom RESERVED, // obsolete, was 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, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_PARAMETERS, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_PARAMETERS, 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REGISTER_CLIENT, 536b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen GET_INPUTBUFFERSIZE, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_OUTPUT, 55d0d7eaf129b48ea04c06902a11c2a4f74056d76cLeon Scroggins III OPEN_DUPLICATE_OUTPUT, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_OUTPUT, 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SUSPEND_OUTPUT, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESTORE_OUTPUT, 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OPEN_INPUT, 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLOSE_INPUT, 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INVALIDATE_STREAM, 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SET_VOICE_VOLUME, 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_RENDER_POSITION, 64bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen GET_INPUT_FRAMES_LOST, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NEW_AUDIO_SESSION_ID, 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ACQUIRE_AUDIO_SESSION_ID, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RELEASE_AUDIO_SESSION_ID, 686b1e838fc16d397359f82c3a4f5700f1ed7dd910Thomas Tafertshofer QUERY_NUM_EFFECTS, 69237c2b871f66e06498ad03aaa92964f4434982c5Jesse Hall QUERY_EFFECT, 701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich GET_EFFECT_DESCRIPTOR, 711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CREATE_EFFECT, 721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich MOVE_EFFECTS, 731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich LOAD_HW_MODULE, 74560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich GET_PRIMARY_OUTPUT_SAMPLING_RATE, 75d877efe3b12afdd84f06c180369f9d7399858f6eJesse Hall GET_PRIMARY_OUTPUT_FRAME_COUNT, 767ab63acdd0a257272512d0bcf5e06036fa0b9fdfJesse Hall SET_LOW_RAM_DEVICE, 777ab63acdd0a257272512d0bcf5e06036fa0b9fdfJesse Hall LIST_AUDIO_PORTS, 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GET_AUDIO_PORT, 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CREATE_AUDIO_PATCH, 802f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvala RELEASE_AUDIO_PATCH, 81feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk LIST_AUDIO_PATCHES, 82e1f57d6f44909a66c7ab0af33dbc5289287e823aEino-Ville Talvala SET_AUDIO_PORT_CONFIG 83b6079005ed0631c3972ff427f56e12523ec214a7Ruben Brunk}; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwoodclass BpAudioFlinger : public BpInterface<IAudioFlinger> 8660b62bc5c11c0bfcdf84ca8f5b2053e5747f86bcEric Laurent{ 87e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwoodpublic: 88acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood BpAudioFlinger(const sp<IBinder>& impl) 89e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood : BpInterface<IAudioFlinger>(impl) 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioTrack> createTrack( 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_stream_type_t streamType, 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_format_t format, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_channel_mask_t channelMask, 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t *pFrameCount, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track_flags_t *flags, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t tid, 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int *sessionId, 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int clientUid, 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioTrack> track; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 110b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project data.writeInt32((int32_t) streamType); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(sampleRate); 11252244fff29042926e21fa897ef5ab11148e35299John Reck data.writeInt32(format); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(channelMask); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 1151a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien data.writeInt64(frameCount); 1164c9355c35a0f62805739823a62ad41ca1cbc6502Mike Reed track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(lFlags); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // haveSharedBuffer 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sharedBuffer != 0) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(true); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStrongBinder(sharedBuffer->asBinder()); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(false); 124fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown } 125aa0ce3396c096c97e3394c53e3912cb08b66fe20Jamie Gennis data.writeInt32((int32_t) output); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) tid); 1276811f4e92cbb64e72a0d13eb9b99b5894bd59c76Svetoslav int lSessionId = AUDIO_SESSION_ALLOCATE; 1282961769ea94f69c191a2dd785b2504666c7292d0Svetoslav if (sessionId != NULL) { 1290a0a1248cfc03940174cbd9af677bafd7280a3bcJeff Brown lSessionId = *sessionId; 130f666ad7046c0b1b255835f75aeb7d1391067df93John Reck } 131e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck data.writeInt32(lSessionId); 1323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy data.writeInt32(clientUid); 133e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 13404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck if (lStatus != NO_ERROR) { 135cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck ALOGE("createTrack error: %s", strerror(-lStatus)); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian frameCount = reply.readInt64(); 13864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown if (pFrameCount != NULL) { 1398f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy *pFrameCount = frameCount; 140315c329544d7c593d1072b071cbb92d9afe74021John Reck } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lFlags = reply.readInt32(); 142e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown if (flags != NULL) { 143e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown *flags = lFlags; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lSessionId = reply.readInt32(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sessionId != NULL) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *sessionId = lSessionId; 148fa9e7c05c7be6891a6cf85a11dc635a6e6853078Christopher Tate } 149d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey lStatus = reply.readInt32(); 150c07fca3831baf4d812dd724f506b4ed23dcc39e0Stephen Smalley track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lStatus == NO_ERROR) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (track == 0) { 153481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown ALOGE("createTrack should have returned an IAudioTrack"); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStatus = UNKNOWN_ERROR; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (track != 0) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGE("createTrack returned an IAudioTrack but with status %d", lStatus); 1592b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor track.clear(); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16188b5b0be887fc5dc3b0b879b4179dde200d2e4d6Anish Athalye } 162dae8e94cce0881f3e10ef5e34b881f512bb52a75Doug Felt } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NULL) { 164a7596147b43940cad3f76c53ed154ef088b9269bJim Miller *status = lStatus; 16598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall } 166ecaa7b41ca49154ceaa9a7504eb0a86b89a96026Christopher Tate return track; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1691cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato virtual sp<IAudioRecord> openRecord( 170d2110dbce071a236b6176de344ca797b737542ebJoe Onorato audio_io_handle_t input, 17106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato uint32_t sampleRate, 1724ababd922eac5931e0222862ff082dc29e012816Joe Onorato audio_format_t format, 1734a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate audio_channel_mask_t channelMask, 1749c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase size_t *pFrameCount, 17569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn track_flags_t *flags, 176cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown pid_t tid, 17746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int *sessionId, 1789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown size_t *notificationFrames, 17932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown sp<IMemory>& cblk, 180c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown sp<IMemory>& buffers, 181a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright status_t *status) 1829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown { 18346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Parcel data, reply; 18446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<IAudioRecord> record; 1852352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 1862ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown data.writeInt32((int32_t) input); 18702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root data.writeInt32(sampleRate); 18808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn data.writeInt32(format); 1896e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase data.writeInt32(channelMask); 19066269ea6f68f2f25888ce1080c94ac782742fafcKenny Root size_t frameCount = pFrameCount != NULL ? *pFrameCount : 0; 1919a2c2a6da90abbcc9a064c20e93ed885651f4ae1Jeff Sharkey data.writeInt64(frameCount); 192973b4663b0b5ee62006522bf4742af076096e548Narayan Kamath track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; 1939fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck data.writeInt32(lFlags); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) tid); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lSessionId = AUDIO_SESSION_ALLOCATE; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sessionId != NULL) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lSessionId = *sessionId; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(lSessionId); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cblk.clear(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffers.clear(); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lStatus != NO_ERROR) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGE("openRecord error: %s", strerror(-lStatus)); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20616f5f5cc9d4c480fac3dc7f176f3f1edfbd256f4Jeff Brown frameCount = reply.readInt64(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pFrameCount != NULL) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pFrameCount = frameCount; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lFlags = reply.readInt32(); 21116f5f5cc9d4c480fac3dc7f176f3f1edfbd256f4Jeff Brown if (flags != NULL) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *flags = lFlags; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lSessionId = reply.readInt32(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sessionId != NULL) { 2164280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown *sessionId = lSessionId; 2174280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown } 2184280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown size_t lNotificationFrames = (size_t) reply.readInt64(); 2194280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown if (notificationFrames != NULL) { 2204280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown *notificationFrames = lNotificationFrames; 2214280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStatus = reply.readInt32(); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cblk = interface_cast<IMemory>(reply.readStrongBinder()); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cblk != 0 && cblk->pointer() == NULL) { 22616f5f5cc9d4c480fac3dc7f176f3f1edfbd256f4Jeff Brown cblk.clear(); 22716f5f5cc9d4c480fac3dc7f176f3f1edfbd256f4Jeff Brown } 22816f5f5cc9d4c480fac3dc7f176f3f1edfbd256f4Jeff Brown buffers = interface_cast<IMemory>(reply.readStrongBinder()); 22916f5f5cc9d4c480fac3dc7f176f3f1edfbd256f4Jeff Brown if (buffers != 0 && buffers->pointer() == NULL) { 2304280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown buffers.clear(); 2314280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lStatus == NO_ERROR) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (record == 0) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGE("openRecord should have returned an IAudioRecord"); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStatus = UNKNOWN_ERROR; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (cblk == 0) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGE("openRecord should have returned a cblk"); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lStatus = NO_MEMORY; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // buffers is permitted to be 0 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2429ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber if (record != 0 || cblk != 0 || buffers != 0) { 2439ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber ALOGE("openRecord returned an IAudioRecord, cblk, " 244a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath "or buffers but with status %d", lStatus); 245a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath } 246a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath } 247a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath if (lStatus != NO_ERROR) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project record.clear(); 249c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project cblk.clear(); 250fc8db53eee11568b286e8d9c17e211bd6781fab6Mike Reed buffers.clear(); 251fc8db53eee11568b286e8d9c17e211bd6781fab6Mike Reed } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NULL) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *status = lStatus; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return record; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t sampleRate(audio_io_handle_t output) const 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) output); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SAMPLE_RATE, data, &reply); 2659ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber return reply.readInt32(); 2669ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber } 2679ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber 2689ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber virtual audio_format_t format(audio_io_handle_t output) const 2699ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber { 2709ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber Parcel data, reply; 2719ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2729ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber data.writeInt32((int32_t) output); 2739ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber remote()->transact(FORMAT, data, &reply); 274a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath return (audio_format_t) reply.readInt32(); 275a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath } 276a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath 277a23fcd7be8e40078a913b1a99222cdd89229e67bNarayan Kamath virtual size_t frameCount(audio_io_handle_t output) const 27822ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath { 27922ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath Parcel data, reply; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) output); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(FRAME_COUNT, data, &reply); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt64(); 28422ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath } 28508e60f2a165d23b53f41993374aa074165bb5863Dianne Hackborn 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t latency(audio_io_handle_t output) const 287d195e5ab401432ddac659791640a2927fc668699Elliott Hughes { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) output); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(LATENCY, data, &reply); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 29322ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value) 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeFloat(value); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MASTER_VOLUME, data, &reply); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30422ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath virtual status_t setMasterMute(bool muted) 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 30622ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath Parcel data, reply; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 30822ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath data.writeInt32(muted); 30922ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath remote()->transact(SET_MASTER_MUTE, data, &reply); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(MASTER_VOLUME, data, &reply); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readFloat(); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const 3224280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(MASTER_MUTE, data, &reply); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output) 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) stream); 3350bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick data.writeFloat(value); 3360bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick data.writeInt32((int32_t) output); 3370bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick remote()->transact(SET_STREAM_VOLUME, data, &reply); 3380bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick return reply.readInt32(); 3390bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick } 3400bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick 3410bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 3420bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick { 3430bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick Parcel data, reply; 3440bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3450bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick data.writeInt32((int32_t) stream); 3460bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick data.writeInt32(muted); 3470bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick remote()->transact(SET_STREAM_MUTE, data, &reply); 3480bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick return reply.readInt32(); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) stream); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) output); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(STREAM_VOLUME, data, &reply); 358d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return reply.readFloat(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(audio_stream_type_t stream) const 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) stream); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(STREAM_MUTE, data, &reply); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMode(audio_mode_t mode) 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(mode); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MODE, data, &reply); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMicMute(bool state) 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(state); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_MIC_MUTE, data, &reply); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool getMicMute() const 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 391171ea89fb99385146e159ef75849a87c49ffee76Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(GET_MIC_MUTE, data, &reply); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 39937151b5032c381391440019a76022ff8dd8196d0Narayan Kamath data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 40037151b5032c381391440019a76022ff8dd8196d0Narayan Kamath data.writeInt32((int32_t) ioHandle); 4015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block data.writeString8(keyValuePairs); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_PARAMETERS, data, &reply); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 404f70188aa4716625781d9952c6b883180528d4644Andy McFadden } 405e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden 406e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 407e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden { 408e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden Parcel data, reply; 409e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 4103beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom data.writeInt32((int32_t) ioHandle); 4113beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom data.writeString8(keys); 412e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden remote()->transact(GET_PARAMETERS, data, &reply); 413e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden return reply.readString8(); 4143beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom } 415e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden 416e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden virtual void registerClient(const sp<IAudioFlingerClient>& client) 417e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden { 4183beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom Parcel data, reply; 4193beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 420e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden data.writeStrongBinder(client->asBinder()); 421e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden remote()->transact(REGISTER_CLIENT, data, &reply); 422e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden } 423e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden 424e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 425e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden audio_channel_mask_t channelMask) const 426e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden { 427e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden Parcel data, reply; 428e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 429e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden data.writeInt32(sampleRate); 430e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden data.writeInt32(format); 431e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden data.writeInt32(channelMask); 432e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 4333beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom return reply.readInt64(); 4343beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom } 4353beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom 4363beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom virtual audio_io_handle_t openOutput(audio_module_handle_t module, 4373beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom audio_devices_t *pDevices, 438e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden uint32_t *pSamplingRate, 439e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden audio_format_t *pFormat, 440e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden audio_channel_mask_t *pChannelMask, 441e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden uint32_t *pLatencyMs, 442e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden audio_output_flags_t flags, 443e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden const audio_offload_info_t *offloadInfo) 4446d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 4456d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 4466d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom audio_devices_t devices = pDevices != NULL ? *pDevices : AUDIO_DEVICE_NONE; 4476d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0; 4486d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT; 4496d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom audio_channel_mask_t channelMask = pChannelMask != NULL ? 4506d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pChannelMask : (audio_channel_mask_t)0; 4516d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom uint32_t latency = pLatencyMs != NULL ? *pLatencyMs : 0; 4526d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 4536d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(module); 4546d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(devices); 4556d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(samplingRate); 4566d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(format); 4576d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(channelMask); 4586d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(latency); 4596d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32((int32_t) flags); 4606d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom // hasOffloadInfo 4616d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (offloadInfo == NULL) { 4626d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(0); 4636d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } else { 4646d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(1); 4656d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.write(offloadInfo, sizeof(audio_offload_info_t)); 4666d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 4676d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom remote()->transact(OPEN_OUTPUT, data, &reply); 4686d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom audio_io_handle_t output = (audio_io_handle_t) reply.readInt32(); 4696d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom ALOGV("openOutput() returned output, %d", output); 4706d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom devices = (audio_devices_t)reply.readInt32(); 4716d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (pDevices != NULL) { 4726d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pDevices = devices; 4736d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 4746d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom samplingRate = reply.readInt32(); 4756d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (pSamplingRate != NULL) { 4766d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pSamplingRate = samplingRate; 4776d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 4786d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom format = (audio_format_t) reply.readInt32(); 4796d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (pFormat != NULL) { 4806d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pFormat = format; 4816d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 4826d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom channelMask = (audio_channel_mask_t)reply.readInt32(); 4836d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (pChannelMask != NULL) { 4846d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pChannelMask = channelMask; 4856d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 4866d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom latency = reply.readInt32(); 4876d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (pLatencyMs != NULL) { 4886d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pLatencyMs = latency; 4896d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 4906d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return output; 4916d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 4926d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 4936d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 4946d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom audio_io_handle_t output2) 4956d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 4966d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 4976d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 4986d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32((int32_t) output1); 4996d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32((int32_t) output2); 5006d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 5016d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return (audio_io_handle_t) reply.readInt32(); 5026d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 5036d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 5046d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual status_t closeOutput(audio_io_handle_t output) 5056d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 5066d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 5076d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5086d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32((int32_t) output); 5096d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom remote()->transact(CLOSE_OUTPUT, data, &reply); 5106d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return reply.readInt32(); 5116d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 5126d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 5136d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual status_t suspendOutput(audio_io_handle_t output) 5146d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 5156d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 5166d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5176d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32((int32_t) output); 5186d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom remote()->transact(SUSPEND_OUTPUT, data, &reply); 5196d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return reply.readInt32(); 520f70188aa4716625781d9952c6b883180528d4644Andy McFadden } 521f70188aa4716625781d9952c6b883180528d4644Andy McFadden 522f70188aa4716625781d9952c6b883180528d4644Andy McFadden virtual status_t restoreOutput(audio_io_handle_t output) 523f70188aa4716625781d9952c6b883180528d4644Andy McFadden { 524f70188aa4716625781d9952c6b883180528d4644Andy McFadden Parcel data, reply; 52507a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 52607a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison data.writeInt32((int32_t) output); 52707a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison remote()->transact(RESTORE_OUTPUT, data, &reply); 52807a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison return reply.readInt32(); 52907a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison } 53007a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison 53107a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison virtual audio_io_handle_t openInput(audio_module_handle_t module, 53207a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison audio_devices_t *pDevices, 533f70188aa4716625781d9952c6b883180528d4644Andy McFadden uint32_t *pSamplingRate, 534f70188aa4716625781d9952c6b883180528d4644Andy McFadden audio_format_t *pFormat, 535f70188aa4716625781d9952c6b883180528d4644Andy McFadden audio_channel_mask_t *pChannelMask, 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_input_flags_t flags) 537f70188aa4716625781d9952c6b883180528d4644Andy McFadden { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_devices_t devices = pDevices != NULL ? *pDevices : AUDIO_DEVICE_NONE; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t samplingRate = pSamplingRate != NULL ? *pSamplingRate : 0; 5416d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom audio_format_t format = pFormat != NULL ? *pFormat : AUDIO_FORMAT_DEFAULT; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_channel_mask_t channelMask = pChannelMask != NULL ? 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pChannelMask : (audio_channel_mask_t)0; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54538cfa8ca8bc67f4342431cea7e35643ddf9254ccCarl Shapiro data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 546bdcef70e15e86e592d725355c96c7fab0b85ac83Dianne Hackborn data.writeInt32(module); 5478cdf27c36a5b697396144925b3f61e4802dd3558Carl Shapiro data.writeInt32(devices); 5485325010486a13553a8597aab92f90abc141a25e8Ian Rogers data.writeInt32(samplingRate); 5495325010486a13553a8597aab92f90abc141a25e8Ian Rogers data.writeInt32(format); 5507e4fdec6f0ac6385c5f8aeaf0f2e12e162138ac3Mathieu Chartier data.writeInt32(channelMask); 551c01936a686ff75c872629b219898021e8ae49afaMathieu Chartier data.writeInt32(flags); 5525325010486a13553a8597aab92f90abc141a25e8Ian Rogers remote()->transact(OPEN_INPUT, data, &reply); 553b63de6de026b8ebe0b7d7b7f188afc30fff42411buzbee audio_io_handle_t input = (audio_io_handle_t) reply.readInt32(); 5543beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom devices = (audio_devices_t)reply.readInt32(); 5556d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (pDevices != NULL) { 5566d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pDevices = devices; 5576d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 5586d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom samplingRate = reply.readInt32(); 5593beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom if (pSamplingRate != NULL) { 5603beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom *pSamplingRate = samplingRate; 561e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden } 56252b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng format = (audio_format_t) reply.readInt32(); 56352b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng if (pFormat != NULL) { 56452b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng *pFormat = format; 56552b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng } 56652b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng channelMask = (audio_channel_mask_t)reply.readInt32(); 56752b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng if (pChannelMask != NULL) { 5686d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *pChannelMask = channelMask; 5696d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 5706d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return input; 5716d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 5726d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 5736d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual status_t closeInput(int input) 5746d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 5756d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 5766d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 57707a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison data.writeInt32(input); 57807a1e2323b1e6765f220a045bd05783dd99b2914Dave Allison remote()->transact(CLOSE_INPUT, data, &reply); 5796d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return reply.readInt32(); 5806d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 5816d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t invalidateStream(audio_stream_type_t stream) 5836d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) stream); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(INVALIDATE_STREAM, data, &reply); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setVoiceVolume(float volume) 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 5946d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 5956d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeFloat(volume); 5966d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom remote()->transact(SET_VOICE_VOLUME, data, &reply); 5976d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return reply.readInt32(); 5986d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 5996d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 6006d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 6016d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom audio_io_handle_t output) const 6026d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 6036d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 6046d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6056d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32((int32_t) output); 6066d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom remote()->transact(GET_RENDER_POSITION, data, &reply); 6076d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom status_t status = reply.readInt32(); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == NO_ERROR) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t tmp = reply.readInt32(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (halFrames != NULL) { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *halFrames = tmp; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp = reply.readInt32(); 61452b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng if (dspFrames != NULL) { 61552b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng *dspFrames = tmp; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6186d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return status; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 620e2b23e11a5475e5c35eb07ba883cb05eca18796fAndy McFadden 621e2b23e11a5475e5c35eb07ba883cb05eca18796fAndy McFadden virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 6226d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 6236d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 6246d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 625e2b23e11a5475e5c35eb07ba883cb05eca18796fAndy McFadden data.writeInt32((int32_t) ioHandle); 626e2b23e11a5475e5c35eb07ba883cb05eca18796fAndy McFadden status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NO_ERROR) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6296d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 6306d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return (uint32_t) reply.readInt32(); 6316d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual int newAudioSessionId() 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6356d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 6366d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6376d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 6386d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom int id = AUDIO_SESSION_ALLOCATE; 6396d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (status == NO_ERROR) { 6406d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom id = reply.readInt32(); 6416d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 6426d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return id; 6436d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 6446d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 6456d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual void acquireAudioSessionId(int audioSession, int pid) 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 6486d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6496d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(audioSession); 6506d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(pid); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void releaseAudioSessionId(int audioSession, int pid) 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(audioSession); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(pid); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6620bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick 6630bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick virtual status_t queryNumberEffects(uint32_t *numEffects) const 6640bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick { 6650bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick Parcel data, reply; 6660bd5243b751c9cad317758158f79b3347e7948afBrad Fitzpatrick data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NO_ERROR) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return status; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status = reply.readInt32(); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NO_ERROR) { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return status; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759e4c884e7a7acd6b75399b180dc339295cda5a43Carl Shapiro if (numEffects != NULL) { 6769e4c884e7a7acd6b75399b180dc339295cda5a43Carl Shapiro *numEffects = (uint32_t)reply.readInt32(); 6779e4c884e7a7acd6b75399b180dc339295cda5a43Carl Shapiro } 6789e4c884e7a7acd6b75399b180dc339295cda5a43Carl Shapiro return NO_ERROR; 6796d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 6806d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 6823f177d7c9a5c8ac727b0c6c3a5131e1e00ea52e8Elliott Hughes { 6833f177d7c9a5c8ac727b0c6c3a5131e1e00ea52e8Elliott Hughes if (pDescriptor == NULL) { 6843f177d7c9a5c8ac727b0c6c3a5131e1e00ea52e8Elliott Hughes return BAD_VALUE; 6853f177d7c9a5c8ac727b0c6c3a5131e1e00ea52e8Elliott Hughes } 686b63de6de026b8ebe0b7d7b7f188afc30fff42411buzbee Parcel data, reply; 6876d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 6886d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInt32(index); 6896d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 6905325010486a13553a8597aab92f90abc141a25e8Ian Rogers if (status != NO_ERROR) { 6916d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return status; 6926d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 6936d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom status = reply.readInt32(); 6946d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (status != NO_ERROR) { 6956d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return status; 6966d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 6975325010486a13553a8597aab92f90abc141a25e8Ian Rogers reply.read(pDescriptor, sizeof(effect_descriptor_t)); 698e6c2241f7a1e6bca3fd8d5d0c49abbbd348366b7Mathieu Chartier return NO_ERROR; 699e6c2241f7a1e6bca3fd8d5d0c49abbbd348366b7Mathieu Chartier } 700e6c2241f7a1e6bca3fd8d5d0c49abbbd348366b7Mathieu Chartier 701e6c2241f7a1e6bca3fd8d5d0c49abbbd348366b7Mathieu Chartier virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 702e6c2241f7a1e6bca3fd8d5d0c49abbbd348366b7Mathieu Chartier effect_descriptor_t *pDescriptor) const 703e6c2241f7a1e6bca3fd8d5d0c49abbbd348366b7Mathieu Chartier { 7046d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (pUuid == NULL || pDescriptor == NULL) { 7056d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return BAD_VALUE; 706c01936a686ff75c872629b219898021e8ae49afaMathieu Chartier } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.write(pUuid, sizeof(effect_uuid_t)); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NO_ERROR) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return status; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status = reply.readInt32(); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NO_ERROR) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return status; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.read(pDescriptor, sizeof(effect_descriptor_t)); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IEffect> createEffect( 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project effect_descriptor_t *pDesc, 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IEffectClient>& client, 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t priority, 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output, 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sessionId, 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status, 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int *id, 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int *enabled) 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IEffect> effect; 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pDesc == NULL) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return effect; 73708065b9f09ead8895d97b2971622af8c179e1768Brian Carlstrom if (status != NULL) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *status = BAD_VALUE; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.write(pDesc, sizeof(effect_descriptor_t)); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStrongBinder(client->asBinder()); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(priority); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) output); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(sessionId); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lStatus != NO_ERROR) { 7517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project ALOGE("createEffect error: %s", strerror(-lStatus)); 7527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } else { 7537b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project lStatus = reply.readInt32(); 7547b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project int tmp = reply.readInt32(); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != NULL) { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *id = tmp; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmp = reply.readInt32(); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enabled != NULL) { 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *enabled = tmp; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project effect = interface_cast<IEffect>(reply.readStrongBinder()); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.read(pDesc, sizeof(effect_descriptor_t)); 7646d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 7656d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (status != NULL) { 7666d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom *status = lStatus; 767d8f3ec6e8308400e9446b254fcca457f6e53ea13Carl Shapiro } 76852b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng 7696d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return effect; 77052b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng } 77152b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng 7726d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, 77352b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng audio_io_handle_t dstOutput) 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(session); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) srcOutput); 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int32_t) dstOutput); 78052b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng remote()->transact(MOVE_EFFECTS, data, &reply); 78152b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng return reply.readInt32(); 78252b0e73443ff8da195fbf0df851a028e07a691b2Ben Cheng } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 784e2b23e11a5475e5c35eb07ba883cb05eca18796fAndy McFadden virtual audio_module_handle_t loadHwModule(const char *name) 78598ba7bd5d1942edd7c2881cc6fd0e777ae8baa2eBrian Carlstrom { 7863c1ff826e0abdffdd76129bf974abb96444dade8Brian Carlstrom Parcel data, reply; 78798ba7bd5d1942edd7c2881cc6fd0e777ae8baa2eBrian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7883beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom data.writeCString(name); 78998ba7bd5d1942edd7c2881cc6fd0e777ae8baa2eBrian Carlstrom remote()->transact(LOAD_HW_MODULE, data, &reply); 7903beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom return (audio_module_handle_t) reply.readInt32(); 7916d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 7926d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 7936d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual uint32_t getPrimaryOutputSamplingRate() 7946d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 7953beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom Parcel data, reply; 7963beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 7976d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 7986d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return reply.readInt32(); 7996d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 8006d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom 8016d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual size_t getPrimaryOutputFrameCount() 8026d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 8036d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 8046d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8053beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 8063beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom return reply.readInt64(); 807e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden } 808e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden 8093beff1e023193b485c67a3003a7f363f105d96d4Brian Carlstrom virtual status_t setLowRamDevice(bool isLowRamDevice) 810e4d81f25bd4dc1a5c909b56ab56a56406290da30Andy McFadden { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32((int) isLowRamDevice); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(SET_LOW_RAM_DEVICE, data, &reply); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t listAudioPorts(unsigned int *num_ports, 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct audio_port *ports) 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BAD_VALUE; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8230efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison Parcel data, reply; 8240efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8250efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison data.writeInt32(*num_ports); 82698ba7bd5d1942edd7c2881cc6fd0e777ae8baa2eBrian Carlstrom status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 827de99f08f658c13ae8e0cd46f7bebc78311585bf2Calin Juravle if (status != NO_ERROR || 8289828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle (status = (status_t)reply.readInt32()) != NO_ERROR) { 8299828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle return status; 8309828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle } 8319828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle *num_ports = (unsigned int)reply.readInt32(); 8329828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle reply.read(ports, *num_ports * sizeof(struct audio_port)); 8330efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison return status; 8343f967910d99254f166dea7e1439b6d5441f046d8Calin Juravle } 8353f967910d99254f166dea7e1439b6d5441f046d8Calin Juravle virtual status_t getAudioPort(struct audio_port *port) 836994cd28e723ecb6bf8ecab9809d9700e93a4b441Calin Juravle { 8379828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle if (port == NULL) { 8389828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle return BAD_VALUE; 8399828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle } 8409828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle Parcel data, reply; 8410efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8429828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle data.write(port, sizeof(struct audio_port)); 8436d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 8440efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison if (status != NO_ERROR || 8459828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle (status = (status_t)reply.readInt32()) != NO_ERROR) { 8466d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return status; 8476d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 8486d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom reply.read(port, sizeof(struct audio_port)); 8490efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison return status; 8509828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle } 8516d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual status_t createAudioPatch(const struct audio_patch *patch, 8529828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle audio_patch_handle_t *handle) 8539828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle { 8549828d067fb877d8c78b5b5f2f7c0a08649e50f59Calin Juravle if (patch == NULL || handle == NULL) { 8556d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return BAD_VALUE; 8566d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 8576d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom Parcel data, reply; 8586d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8596d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.write(patch, sizeof(struct audio_patch)); 8606d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.write(handle, sizeof(audio_patch_handle_t)); 8616d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 8626d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom if (status != NO_ERROR || 8636d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom (status = (status_t)reply.readInt32()) != NO_ERROR) { 8646d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return status; 8656d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 8666d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom reply.read(handle, sizeof(audio_patch_handle_t)); 8676d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return status; 8686d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 8696d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 8706d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom { 87154fc18b925d0dbb0a5c9a1b21956e23b4eaaf31dWei Jin Parcel data, reply; 87254fc18b925d0dbb0a5c9a1b21956e23b4eaaf31dWei Jin data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8736d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom data.write(&handle, sizeof(audio_patch_handle_t)); 87454fc18b925d0dbb0a5c9a1b21956e23b4eaaf31dWei Jin status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 87554fc18b925d0dbb0a5c9a1b21956e23b4eaaf31dWei Jin if (status != NO_ERROR) { 8766d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom status = (status_t)reply.readInt32(); 8776d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom } 8786d77eb99bfc5471f9765e3fa7ea42022197aa9f5Brian Carlstrom return status; 8790efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison } 8800efbd9a463c848118c7685f4bfc8765a82caa761Dave Allison virtual status_t listAudioPatches(unsigned int *num_patches, 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct audio_patch *patches) 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BAD_VALUE; 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(*num_patches); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status != NO_ERROR || 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (status = (status_t)reply.readInt32()) != NO_ERROR) { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return status; 893f70188aa4716625781d9952c6b883180528d4644Andy McFadden } 8943762c311729fe9f3af085c14c5c1fb471d994c03Steve Block *num_patches = (unsigned int)reply.readInt32(); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.read(patches, *num_patches * sizeof(struct audio_patch)); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return status; 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 898f70188aa4716625781d9952c6b883180528d4644Andy McFadden virtual status_t setAudioPortConfig(const struct audio_port_config *config) 899f70188aa4716625781d9952c6b883180528d4644Andy McFadden { 900f70188aa4716625781d9952c6b883180528d4644Andy McFadden if (config == NULL) { 901f70188aa4716625781d9952c6b883180528d4644Andy McFadden return BAD_VALUE; 902f70188aa4716625781d9952c6b883180528d4644Andy McFadden } 903f70188aa4716625781d9952c6b883180528d4644Andy McFadden Parcel data, reply; 904d195e5ab401432ddac659791640a2927fc668699Elliott Hughes data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 905d195e5ab401432ddac659791640a2927fc668699Elliott Hughes data.write(config, sizeof(struct audio_port_config)); 906d195e5ab401432ddac659791640a2927fc668699Elliott Hughes status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 907d195e5ab401432ddac659791640a2927fc668699Elliott Hughes if (status != NO_ERROR) { 908d195e5ab401432ddac659791640a2927fc668699Elliott Hughes status = (status_t)reply.readInt32(); 909d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 910d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return status; 911d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 912d195e5ab401432ddac659791640a2927fc668699Elliott Hughes}; 913d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 914d195e5ab401432ddac659791640a2927fc668699Elliott HughesIMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 915f70188aa4716625781d9952c6b883180528d4644Andy McFadden 916f70188aa4716625781d9952c6b883180528d4644Andy McFadden// ---------------------------------------------------------------------- 917f70188aa4716625781d9952c6b883180528d4644Andy McFadden 918f70188aa4716625781d9952c6b883180528d4644Andy McFaddenstatus_t BnAudioFlinger::onTransact( 919ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 920ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown{ 921ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown switch (code) { 922f70188aa4716625781d9952c6b883180528d4644Andy McFadden case CREATE_TRACK: { 92322ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath CHECK_INTERFACE(IAudioFlinger, data, reply); 924f70188aa4716625781d9952c6b883180528d4644Andy McFadden int streamType = data.readInt32(); 9255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block uint32_t sampleRate = data.readInt32(); 92608e60f2a165d23b53f41993374aa074165bb5863Dianne Hackborn audio_format_t format = (audio_format_t) data.readInt32(); 927f70188aa4716625781d9952c6b883180528d4644Andy McFadden audio_channel_mask_t channelMask = data.readInt32(); 92822ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath size_t frameCount = data.readInt64(); 92922ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath track_flags_t flags = (track_flags_t) data.readInt32(); 930d195e5ab401432ddac659791640a2927fc668699Elliott Hughes bool haveSharedBuffer = data.readInt32() != 0; 931d195e5ab401432ddac659791640a2927fc668699Elliott Hughes sp<IMemory> buffer; 932f70188aa4716625781d9952c6b883180528d4644Andy McFadden if (haveSharedBuffer) { 933f70188aa4716625781d9952c6b883180528d4644Andy McFadden buffer = interface_cast<IMemory>(data.readStrongBinder()); 93422ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath } 93522ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 93622ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath pid_t tid = (pid_t) data.readInt32(); 93722ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath int sessionId = data.readInt32(); 93822ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath int clientUid = data.readInt32(); 93922ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath status_t status; 940f70188aa4716625781d9952c6b883180528d4644Andy McFadden sp<IAudioTrack> track; 941f70188aa4716625781d9952c6b883180528d4644Andy McFadden if ((haveSharedBuffer && (buffer == 0)) || 942f70188aa4716625781d9952c6b883180528d4644Andy McFadden ((buffer != 0) && (buffer->pointer() == NULL))) { 943f70188aa4716625781d9952c6b883180528d4644Andy McFadden ALOGW("CREATE_TRACK: cannot retrieve shared memory"); 944f70188aa4716625781d9952c6b883180528d4644Andy McFadden status = DEAD_OBJECT; 945f70188aa4716625781d9952c6b883180528d4644Andy McFadden } else { 946f70188aa4716625781d9952c6b883180528d4644Andy McFadden track = createTrack( 947d195e5ab401432ddac659791640a2927fc668699Elliott Hughes (audio_stream_type_t) streamType, sampleRate, format, 948f70188aa4716625781d9952c6b883180528d4644Andy McFadden channelMask, &frameCount, &flags, buffer, output, tid, 949f70188aa4716625781d9952c6b883180528d4644Andy McFadden &sessionId, clientUid, &status); 950f70188aa4716625781d9952c6b883180528d4644Andy McFadden LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 951f70188aa4716625781d9952c6b883180528d4644Andy McFadden } 952f70188aa4716625781d9952c6b883180528d4644Andy McFadden reply->writeInt64(frameCount); 9535baa3a62a97544669fba6d65a11c07f252e654ddSteve Block reply->writeInt32(flags); 954f70188aa4716625781d9952c6b883180528d4644Andy McFadden reply->writeInt32(sessionId); 955f70188aa4716625781d9952c6b883180528d4644Andy McFadden reply->writeInt32(status); 9569f8203a159d46124a0907a0d9500e599533beed3Brian Carlstrom reply->writeStrongBinder(track->asBinder()); 9579f8203a159d46124a0907a0d9500e599533beed3Brian Carlstrom return NO_ERROR; 958d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } break; 959d195e5ab401432ddac659791640a2927fc668699Elliott Hughes case OPEN_RECORD: { 960d195e5ab401432ddac659791640a2927fc668699Elliott Hughes CHECK_INTERFACE(IAudioFlinger, data, reply); 961d195e5ab401432ddac659791640a2927fc668699Elliott Hughes audio_io_handle_t input = (audio_io_handle_t) data.readInt32(); 962d195e5ab401432ddac659791640a2927fc668699Elliott Hughes uint32_t sampleRate = data.readInt32(); 963f70188aa4716625781d9952c6b883180528d4644Andy McFadden audio_format_t format = (audio_format_t) data.readInt32(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_channel_mask_t channelMask = data.readInt32(); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t frameCount = data.readInt64(); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track_flags_t flags = (track_flags_t) data.readInt32(); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t tid = (pid_t) data.readInt32(); 9683762c311729fe9f3af085c14c5c1fb471d994c03Steve Block int sessionId = data.readInt32(); 969d195e5ab401432ddac659791640a2927fc668699Elliott Hughes size_t notificationFrames = 0; 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> cblk; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> buffers; 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioRecord> record = openRecord(input, 974ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown sampleRate, format, channelMask, &frameCount, &flags, tid, &sessionId, 975ebed7d6e35f7f960e6e6add2b8ab7c7a31a511c3Jeff Brown ¬ificationFrames, 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cblk, buffers, &status); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt64(frameCount); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(flags); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(sessionId); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt64(notificationFrames); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(status); 98322ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath reply->writeStrongBinder(record->asBinder()); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(cblk->asBinder()); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(buffers->asBinder()); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 98822ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath case SAMPLE_RATE: { 98922ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath CHECK_INTERFACE(IAudioFlinger, data, reply); 99022ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 99122ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath return NO_ERROR; 99222ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath } break; 99322ec1eefa4dc8e12f7da8e8750d4770144941526Narayan Kamath case FORMAT: { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FRAME_COUNT: { 999d195e5ab401432ddac659791640a2927fc668699Elliott Hughes CHECK_INTERFACE(IAudioFlinger, data, reply); 1000d195e5ab401432ddac659791640a2927fc668699Elliott Hughes reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block } break; 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LATENCY: { 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 1005d195e5ab401432ddac659791640a2927fc668699Elliott Hughes reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10083762c311729fe9f3af085c14c5c1fb471d994c03Steve Block case SET_MASTER_VOLUME: { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setMasterVolume(data.readFloat()) ); 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_MASTER_MUTE: { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setMasterMute(data.readInt32()) ); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MASTER_VOLUME: { 1019d195e5ab401432ddac659791640a2927fc668699Elliott Hughes CHECK_INTERFACE(IAudioFlinger, data, reply); 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeFloat( masterVolume() ); 10215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block return NO_ERROR; 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10238564c8da817a845353d213acd8636b76f567b234Steve Block case MASTER_MUTE: { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10258564c8da817a845353d213acd8636b76f567b234Steve Block reply->writeInt32( masterMute() ); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10284280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown case SET_STREAM_VOLUME: { 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10304280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown int stream = data.readInt32(); 10314280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown float volume = data.readFloat(); 10324280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 10334280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 10344280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown return NO_ERROR; 10354280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown } break; 10364280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown case SET_STREAM_MUTE: { 10374280c4a93ea17f2e9d3f651e49d8c13dc3fb92aaJeff Brown CHECK_INTERFACE(IAudioFlinger, data, reply); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int stream = data.readInt32(); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 1040d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return NO_ERROR; 1041d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } break; 1042d195e5ab401432ddac659791640a2927fc668699Elliott Hughes case STREAM_VOLUME: { 1043d195e5ab401432ddac659791640a2927fc668699Elliott Hughes CHECK_INTERFACE(IAudioFlinger, data, reply); 1044d195e5ab401432ddac659791640a2927fc668699Elliott Hughes int stream = data.readInt32(); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int output = data.readInt32(); 10469ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 10479ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber return NO_ERROR; 10489ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber } break; 10499ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber case STREAM_MUTE: { 10509ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber CHECK_INTERFACE(IAudioFlinger, data, reply); 10519ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber int stream = data.readInt32(); 10529ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 10539ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber return NO_ERROR; 10549ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber } break; 10559ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber case SET_MODE: { 10569ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber CHECK_INTERFACE(IAudioFlinger, data, reply); 10579ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber audio_mode_t mode = (audio_mode_t) data.readInt32(); 10589ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber reply->writeInt32( setMode(mode) ); 10599ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber return NO_ERROR; 10609ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber } break; 10619ae000ca8c05ad6f700ad7bf119bbc92fb964b57Andreas Huber case SET_MIC_MUTE: { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int state = data.readInt32(); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setMicMute(state) ); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_MIC_MUTE: { 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( getMicMute() ); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_PARAMETERS: { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 keyValuePairs(data.readString8()); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_PARAMETERS: { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 10826215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block String8 keys(data.readString8()); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeString8(getParameters(ioHandle, keys)); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REGISTER_CLIENT: { 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.readStrongBinder()); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project registerClient(client); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_INPUTBUFFERSIZE: { 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = data.readInt32(); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_format_t format = (audio_format_t) data.readInt32(); 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_channel_mask_t channelMask = data.readInt32(); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 11003762c311729fe9f3af085c14c5c1fb471d994c03Steve Block return NO_ERROR; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OPEN_OUTPUT: { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_devices_t devices = (audio_devices_t)data.readInt32(); 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t samplingRate = data.readInt32(); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_format_t format = (audio_format_t) data.readInt32(); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t latency = data.readInt32(); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool hasOffloadInfo = data.readInt32() != 0; 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_offload_info_t offloadInfo; 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasOffloadInfo) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.read(&offloadInfo, sizeof(audio_offload_info_t)); 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output = openOutput(module, 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &devices, 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &samplingRate, 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &format, 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &channelMask, 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &latency, 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasOffloadInfo ? &offloadInfo : NULL); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGV("OPEN_OUTPUT output, %d", output); 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32((int32_t) output); 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(devices); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(samplingRate); 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(format); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(channelMask); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(latency); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OPEN_DUPLICATE_OUTPUT: { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1139d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } break; 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CLOSE_OUTPUT: { 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SUSPEND_OUTPUT: { 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 114932f2e6267481bd4b81b71061c539748143342fefMike Lockwood } break; 115032f2e6267481bd4b81b71061c539748143342fefMike Lockwood case RESTORE_OUTPUT: { 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OPEN_INPUT: { 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_devices_t devices = (audio_devices_t)data.readInt32(); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t samplingRate = data.readInt32(); 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_format_t format = (audio_format_t) data.readInt32(); 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_channel_mask_t channelMask = (audio_channel_mask_t)data.readInt32(); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t input = openInput(module, 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &devices, 1166f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood &samplingRate, 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &format, 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &channelMask, 1169f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood flags); 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32((int32_t) input); 1171f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood reply->writeInt32(devices); 1172f602d362ba4bb3adbf1eb4e38a794fb14274293aMike Lockwood reply->writeInt32(samplingRate); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(format); 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(channelMask); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CLOSE_INPUT: { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVALIDATE_STREAM: { 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(invalidateStream(stream)); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_VOICE_VOLUME: { 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float volume = data.readFloat(); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( setVoiceVolume(volume) ); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_RENDER_POSITION: { 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t halFrames; 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t dspFrames; 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = getRenderPosition(&halFrames, &dspFrames, output); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(status); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == NO_ERROR) { 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(halFrames); 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(dspFrames); 12045baa3a62a97544669fba6d65a11c07f252e654ddSteve Block } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_INPUT_FRAMES_LOST: { 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NEW_AUDIO_SESSION_ID: { 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(newAudioSessionId()); 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ACQUIRE_AUDIO_SESSION_ID: { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int audioSession = data.readInt32(); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = data.readInt32(); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireAudioSessionId(audioSession, pid); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case RELEASE_AUDIO_SESSION_ID: { 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int audioSession = data.readInt32(); 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = data.readInt32(); 1229b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project releaseAudioSessionId(audioSession, pid); 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 123188b5b0be887fc5dc3b0b879b4179dde200d2e4d6Anish Athalye } break; 1232dae8e94cce0881f3e10ef5e34b881f512bb52a75Doug Felt case QUERY_NUM_EFFECTS: { 12339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown CHECK_INTERFACE(IAudioFlinger, data, reply); 12349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown uint32_t numEffects; 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = queryNumberEffects(&numEffects); 1236a8079bfb9a738a7f24f103cd640e5317c4fd2510Andreas Huber reply->writeInt32(status); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == NO_ERROR) { 1238d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey reply->writeInt32((int32_t)numEffects); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 12415438979e498750b6a28ada7974d4e9fe17fd8394Chris Craik } 1242f666ad7046c0b1b255835f75aeb7d1391067df93John Reck case QUERY_EFFECT: { 1243e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck CHECK_INTERFACE(IAudioFlinger, data, reply); 12443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy effect_descriptor_t desc; 1245e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy status_t status = queryEffect(data.readInt32(), &desc); 124604fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck reply->writeInt32(status); 1247cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck if (status == NO_ERROR) { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->write(&desc, sizeof(effect_descriptor_t)); 12493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 125064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown return NO_ERROR; 12518f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy } 1252315c329544d7c593d1072b071cbb92d9afe74021John Reck case GET_EFFECT_DESCRIPTOR: { 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project effect_uuid_t uuid; 12556b1e838fc16d397359f82c3a4f5700f1ed7dd910Thomas Tafertshofer data.read(&uuid, sizeof(effect_uuid_t)); 1256237c2b871f66e06498ad03aaa92964f4434982c5Jesse Hall effect_descriptor_t desc; 12571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich status_t status = getEffectDescriptor(&uuid, &desc); 12581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich reply->writeInt32(status); 12591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (status == NO_ERROR) { 12601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich reply->write(&desc, sizeof(effect_descriptor_t)); 1261560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich } 1262d877efe3b12afdd84f06c180369f9d7399858f6eJesse Hall return NO_ERROR; 12637ab63acdd0a257272512d0bcf5e06036fa0b9fdfJesse Hall } 12647ab63acdd0a257272512d0bcf5e06036fa0b9fdfJesse Hall case CREATE_EFFECT: { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project effect_descriptor_t desc; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.read(&desc, sizeof(effect_descriptor_t)); 12686b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t priority = data.readInt32(); 1270d0d7eaf129b48ea04c06902a11c2a4f74056d76cLeon Scroggins III audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sessionId = data.readInt32(); 127252244fff29042926e21fa897ef5ab11148e35299John Reck status_t status; 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id; 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int enabled; 12751a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &status, &id, &enabled); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(status); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(id); 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(enabled); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(effect->asBinder()); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->write(&desc, sizeof(effect_descriptor_t)); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MOVE_EFFECTS: { 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int session = data.readInt32(); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1291aa0ce3396c096c97e3394c53e3912cb08b66fe20Jamie Gennis return NO_ERROR; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LOAD_HW_MODULE: { 1294bca2d613e0d6d2630fedd302c0d779b7610adbcfWei-Ta Chen CHECK_INTERFACE(IAudioFlinger, data, reply); 12956811f4e92cbb64e72a0d13eb9b99b5894bd59c76Svetoslav reply->writeInt32(loadHwModule(data.readCString())); 12962961769ea94f69c191a2dd785b2504666c7292d0Svetoslav return NO_ERROR; 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1299e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown CHECK_INTERFACE(IAudioFlinger, data, reply); 1300e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown reply->writeInt32(getPrimaryOutputSamplingRate()); 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1304fa9e7c05c7be6891a6cf85a11dc635a6e6853078Christopher Tate CHECK_INTERFACE(IAudioFlinger, data, reply); 1305c07fca3831baf4d812dd724f506b4ed23dcc39e0Stephen Smalley reply->writeInt64(getPrimaryOutputFrameCount()); 1306481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown return NO_ERROR; 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_LOW_RAM_DEVICE: { 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 13102b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor bool isLowRamDevice = data.readInt32() != 0; 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(setLowRamDevice(isLowRamDevice)); 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1313973b4663b0b5ee62006522bf4742af076096e548Narayan Kamath } break; 13149fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck case LIST_AUDIO_PORTS: { 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 13162f1a2e423e0fbb64467d6fcfa4e82c6384f31210Eino-Ville Talvala unsigned int num_ports = data.readInt32(); 1317feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk struct audio_port *ports = 1318e1f57d6f44909a66c7ab0af33dbc5289287e823aEino-Ville Talvala (struct audio_port *)calloc(num_ports, 1319b6079005ed0631c3972ff427f56e12523ec214a7Ruben Brunk sizeof(struct audio_port)); 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = listAudioPorts(&num_ports, ports); 1321b01e8bf57b7492b77e3445db51471edcbadda75eMike Lockwood reply->writeInt32(status); 132260b62bc5c11c0bfcdf84ca8f5b2053e5747f86bcEric Laurent if (status == NO_ERROR) { 1323e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood reply->writeInt32(num_ports); 1324acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood reply->write(&ports, num_ports * sizeof(struct audio_port)); 1325e7d511e148bc901ef41ac44d7b3593e5d803f72fMike Lockwood } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project free(ports); 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_AUDIO_PORT: { 1330cbad976b2a36a0895ca94510d5208a86f66cf596Jeff Brown CHECK_INTERFACE(IAudioFlinger, data, reply); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct audio_port port; 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.read(&port, sizeof(struct audio_port)); 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = getAudioPort(&port); 1334a7596147b43940cad3f76c53ed154ef088b9269bJim Miller reply->writeInt32(status); 133598a4f7e7e12effb78b3d1035e5a670ccbbf5bca1JP Abgrall if (status == NO_ERROR) { 1336ecaa7b41ca49154ceaa9a7504eb0a86b89a96026Christopher Tate reply->write(&port, sizeof(struct audio_port)); 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13381cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return NO_ERROR; 1339d2110dbce071a236b6176de344ca797b737542ebJoe Onorato } break; 134006290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato case CREATE_AUDIO_PATCH: { 13414ababd922eac5931e0222862ff082dc29e012816Joe Onorato CHECK_INTERFACE(IAudioFlinger, data, reply); 13424a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate struct audio_patch patch; 13439c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase data.read(&patch, sizeof(struct audio_patch)); 134469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn audio_patch_handle_t handle; 134546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown data.read(&handle, sizeof(audio_patch_handle_t)); 134632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown status_t status = createAudioPatch(&patch, &handle); 1347c28867a1d67121ce5963de135e3ae2b1dbd9a33dJeff Brown reply->writeInt32(status); 1348a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright if (status == NO_ERROR) { 134946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown reply->write(&handle, sizeof(audio_patch_handle_t)); 135046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 13512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown return NO_ERROR; 13522ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown } break; 135302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root case RELEASE_AUDIO_PATCH: { 135402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root CHECK_INTERFACE(IAudioFlinger, data, reply); 135508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn audio_patch_handle_t handle; 13566e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase data.read(&handle, sizeof(audio_patch_handle_t)); 13576e0ecb4eed5cd2e1f15766d7028467129974a12dChet Haase status_t status = releaseAudioPatch(handle); 135866269ea6f68f2f25888ce1080c94ac782742fafcKenny Root reply->writeInt32(status); 13599a2c2a6da90abbcc9a064c20e93ed885651f4ae1Jeff Sharkey return NO_ERROR; 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LIST_AUDIO_PATCHES: { 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned int num_patches = data.readInt32(); 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct audio_patch *patches = 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (struct audio_patch *)calloc(num_patches, 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeof(struct audio_patch)); 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = listAudioPatches(&num_patches, patches); 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(status); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == NO_ERROR) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(num_patches); 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->write(&patches, num_patches * sizeof(struct audio_patch)); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project free(patches); 137471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block return NO_ERROR; 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_AUDIO_PORT_CONFIG: { 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IAudioFlinger, data, reply); 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct audio_port_config config; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.read(&config, sizeof(struct audio_port_config)); 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = setAudioPortConfig(&config); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(status); 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project