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                    &notificationFrames,
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