199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** Copyright 2007, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
5e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten** Licensed under the Apache License, Version 2.0 (the "License");
6e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten** you may not use this file except in compliance with the License.
7e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
9e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten**     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project**
11e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten** Unless required by applicable law or agreed to in writing, software
12e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten** distributed under the License is distributed on an "AS IS" BASIS,
13e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project*/
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1834f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent#define LOG_TAG "IAudioTrack"
1934f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent//#define LOG_NDEBUG 0
2034f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent#include <utils/Log.h>
2134f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdint.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/types.h>
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/Parcel.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IAudioTrack.h>
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum {
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    GET_CBLK = IBinder::FIRST_CALL_TRANSACTION,
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    START,
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    STOP,
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    FLUSH,
36e4756fe3a387615acb63c6a05788c8db9b5786cbGlenn Kasten    RESERVED, // was MUTE
37be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    PAUSE,
384ff14bae91075eb274eb1c2975982358946e7e63John Grossman    ATTACH_AUX_EFFECT,
394ff14bae91075eb274eb1c2975982358946e7e63John Grossman    ALLOCATE_TIMED_BUFFER,
404ff14bae91075eb274eb1c2975982358946e7e63John Grossman    QUEUE_TIMED_BUFFER,
414ff14bae91075eb274eb1c2975982358946e7e63John Grossman    SET_MEDIA_TIME_TRANSFORM,
4253cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten    SET_PARAMETERS,
4353cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten    GET_TIMESTAMP,
4459fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent    SIGNAL,
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioTrack : public BpInterface<IAudioTrack>
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioTrack(const sp<IBinder>& impl)
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioTrack>(impl)
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
54e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
551099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten    virtual sp<IMemory> getCblk() const
561099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten    {
571099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        Parcel data, reply;
581099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        sp<IMemory> cblk;
591099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
601099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        status_t status = remote()->transact(GET_CBLK, data, &reply);
611099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        if (status == NO_ERROR) {
621099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten            cblk = interface_cast<IMemory>(reply.readStrongBinder());
63a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten            if (cblk != 0 && cblk->pointer() == NULL) {
64a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten                cblk.clear();
65a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten            }
661099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        }
671099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        return cblk;
681099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten    }
691099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten
703acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten    virtual status_t start()
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
7434f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        status_t status = remote()->transact(START, data, &reply);
7534f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        if (status == NO_ERROR) {
7634f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent            status = reply.readInt32();
7734f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        } else {
785ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("start() error: %s", strerror(-status));
7934f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        }
8034f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        return status;
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
82e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void stop()
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STOP, data, &reply);
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
89e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void flush()
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FLUSH, data, &reply);
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void pause()
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PAUSE, data, &reply);
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
103e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
104be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t attachAuxEffect(int effectId)
105be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
106be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
108be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(effectId);
109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status = reply.readInt32();
112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
1135ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("attachAuxEffect() error: %s", strerror(-status));
114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return status;
116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
1174ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1184ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual status_t allocateTimedBuffer(size_t size, sp<IMemory>* buffer) {
1194ff14bae91075eb274eb1c2975982358946e7e63John Grossman        Parcel data, reply;
1204ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
121e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(size);
1224ff14bae91075eb274eb1c2975982358946e7e63John Grossman        status_t status = remote()->transact(ALLOCATE_TIMED_BUFFER,
1234ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                             data, &reply);
1244ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (status == NO_ERROR) {
1254ff14bae91075eb274eb1c2975982358946e7e63John Grossman            status = reply.readInt32();
1264ff14bae91075eb274eb1c2975982358946e7e63John Grossman            if (status == NO_ERROR) {
1274ff14bae91075eb274eb1c2975982358946e7e63John Grossman                *buffer = interface_cast<IMemory>(reply.readStrongBinder());
128a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten                if (*buffer != 0 && (*buffer)->pointer() == NULL) {
129a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten                    (*buffer).clear();
130a1d401d9f4a6ba477f0e07204e0b9481befcc928Glenn Kasten                }
1314ff14bae91075eb274eb1c2975982358946e7e63John Grossman            }
1324ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
1334ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return status;
1344ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
1354ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1364ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual status_t queueTimedBuffer(const sp<IMemory>& buffer,
1374ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                      int64_t pts) {
1384ff14bae91075eb274eb1c2975982358946e7e63John Grossman        Parcel data, reply;
1394ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
1404ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeStrongBinder(buffer->asBinder());
1414ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt64(pts);
1424ff14bae91075eb274eb1c2975982358946e7e63John Grossman        status_t status = remote()->transact(QUEUE_TIMED_BUFFER,
1434ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                             data, &reply);
1444ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (status == NO_ERROR) {
1454ff14bae91075eb274eb1c2975982358946e7e63John Grossman            status = reply.readInt32();
1464ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
1474ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return status;
1484ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
1494ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1504ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual status_t setMediaTimeTransform(const LinearTransform& xform,
1514ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                           int target) {
1524ff14bae91075eb274eb1c2975982358946e7e63John Grossman        Parcel data, reply;
1534ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
1544ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt64(xform.a_zero);
1554ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt64(xform.b_zero);
1564ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt32(xform.a_to_b_numer);
1574ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt32(xform.a_to_b_denom);
1584ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt32(target);
1594ff14bae91075eb274eb1c2975982358946e7e63John Grossman        status_t status = remote()->transact(SET_MEDIA_TIME_TRANSFORM,
1604ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                             data, &reply);
1614ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (status == NO_ERROR) {
1624ff14bae91075eb274eb1c2975982358946e7e63John Grossman            status = reply.readInt32();
1634ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
1644ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return status;
1654ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
166ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
167ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    virtual status_t setParameters(const String8& keyValuePairs) {
168ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        Parcel data, reply;
169ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
170ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        data.writeString8(keyValuePairs);
171ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        status_t status = remote()->transact(SET_PARAMETERS, data, &reply);
172ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        if (status == NO_ERROR) {
173ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            status = reply.readInt32();
174ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        }
175ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        return status;
176ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald    }
17753cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten
17853cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten    virtual status_t getTimestamp(AudioTimestamp& timestamp) {
17953cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        Parcel data, reply;
18053cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
18153cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        status_t status = remote()->transact(GET_TIMESTAMP, data, &reply);
18253cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        if (status == NO_ERROR) {
18353cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            status = reply.readInt32();
18453cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            if (status == NO_ERROR) {
18553cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten                timestamp.mPosition = reply.readInt32();
18653cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten                timestamp.mTime.tv_sec = reply.readInt32();
18753cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten                timestamp.mTime.tv_nsec = reply.readInt32();
18853cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            }
18953cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        }
19053cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        return status;
19153cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten    }
19259fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent
19359fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent    virtual void signal() {
19459fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        Parcel data, reply;
19559fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
19659fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        remote()->transact(SIGNAL, data, &reply);
19759fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent    }
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioTrack, "android.media.IAudioTrack");
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioTrack::onTransact(
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
207e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
208e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case GET_CBLK: {
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(getCblk()->asBinder());
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case START: {
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
2153acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            reply->writeInt32(start());
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STOP: {
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            stop();
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FLUSH: {
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            flush();
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PAUSE: {
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pause();
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
233be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case ATTACH_AUX_EFFECT: {
234be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioTrack, data, reply);
235be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(attachAuxEffect(data.readInt32()));
236be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
237be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
2384ff14bae91075eb274eb1c2975982358946e7e63John Grossman        case ALLOCATE_TIMED_BUFFER: {
2394ff14bae91075eb274eb1c2975982358946e7e63John Grossman            CHECK_INTERFACE(IAudioTrack, data, reply);
2404ff14bae91075eb274eb1c2975982358946e7e63John Grossman            sp<IMemory> buffer;
241e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            status_t status = allocateTimedBuffer(data.readInt64(), &buffer);
2424ff14bae91075eb274eb1c2975982358946e7e63John Grossman            reply->writeInt32(status);
2434ff14bae91075eb274eb1c2975982358946e7e63John Grossman            if (status == NO_ERROR) {
2444ff14bae91075eb274eb1c2975982358946e7e63John Grossman                reply->writeStrongBinder(buffer->asBinder());
2454ff14bae91075eb274eb1c2975982358946e7e63John Grossman            }
2464ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return NO_ERROR;
2474ff14bae91075eb274eb1c2975982358946e7e63John Grossman        } break;
2484ff14bae91075eb274eb1c2975982358946e7e63John Grossman        case QUEUE_TIMED_BUFFER: {
2494ff14bae91075eb274eb1c2975982358946e7e63John Grossman            CHECK_INTERFACE(IAudioTrack, data, reply);
2504ff14bae91075eb274eb1c2975982358946e7e63John Grossman            sp<IMemory> buffer = interface_cast<IMemory>(
2514ff14bae91075eb274eb1c2975982358946e7e63John Grossman                data.readStrongBinder());
2524ff14bae91075eb274eb1c2975982358946e7e63John Grossman            uint64_t pts = data.readInt64();
2534ff14bae91075eb274eb1c2975982358946e7e63John Grossman            reply->writeInt32(queueTimedBuffer(buffer, pts));
2544ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return NO_ERROR;
2554ff14bae91075eb274eb1c2975982358946e7e63John Grossman        } break;
2564ff14bae91075eb274eb1c2975982358946e7e63John Grossman        case SET_MEDIA_TIME_TRANSFORM: {
2574ff14bae91075eb274eb1c2975982358946e7e63John Grossman            CHECK_INTERFACE(IAudioTrack, data, reply);
2584ff14bae91075eb274eb1c2975982358946e7e63John Grossman            LinearTransform xform;
2594ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.a_zero = data.readInt64();
2604ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.b_zero = data.readInt64();
2614ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.a_to_b_numer = data.readInt32();
2624ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.a_to_b_denom = data.readInt32();
2634ff14bae91075eb274eb1c2975982358946e7e63John Grossman            int target = data.readInt32();
2644ff14bae91075eb274eb1c2975982358946e7e63John Grossman            reply->writeInt32(setMediaTimeTransform(xform, target));
2654ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return NO_ERROR;
2664ff14bae91075eb274eb1c2975982358946e7e63John Grossman        } break;
267ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        case SET_PARAMETERS: {
268ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            CHECK_INTERFACE(IAudioTrack, data, reply);
269ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            String8 keyValuePairs(data.readString8());
270ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            reply->writeInt32(setParameters(keyValuePairs));
271ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            return NO_ERROR;
272ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        } break;
27353cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        case GET_TIMESTAMP: {
27453cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            CHECK_INTERFACE(IAudioTrack, data, reply);
27553cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            AudioTimestamp timestamp;
27653cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            status_t status = getTimestamp(timestamp);
27753cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            reply->writeInt32(status);
27853cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            if (status == NO_ERROR) {
27953cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten                reply->writeInt32(timestamp.mPosition);
28053cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten                reply->writeInt32(timestamp.mTime.tv_sec);
28153cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten                reply->writeInt32(timestamp.mTime.tv_nsec);
28253cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            }
28353cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten            return NO_ERROR;
28453cec22821072719ee02c856e9ac2dda2496c570Glenn Kasten        } break;
28559fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        case SIGNAL: {
28659fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent            CHECK_INTERFACE(IAudioTrack, data, reply);
28759fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent            signal();
28859fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent            return NO_ERROR;
28959fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent        } break;
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
296