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,
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    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,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass BpAudioTrack : public BpInterface<IAudioTrack>
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    BpAudioTrack(const sp<IBinder>& impl)
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        : BpInterface<IAudioTrack>(impl)
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
51e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
521099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten    virtual sp<IMemory> getCblk() const
531099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten    {
541099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        Parcel data, reply;
551099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        sp<IMemory> cblk;
561099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
571099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        status_t status = remote()->transact(GET_CBLK, data, &reply);
581099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        if (status == NO_ERROR) {
591099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten            cblk = interface_cast<IMemory>(reply.readStrongBinder());
601099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        }
611099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten        return cblk;
621099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten    }
631099586bd48a8a90bb1cc4e7c279703bc7259214Glenn Kasten
643acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten    virtual status_t start()
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
6834f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        status_t status = remote()->transact(START, data, &reply);
6934f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        if (status == NO_ERROR) {
7034f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent            status = reply.readInt32();
7134f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        } else {
725ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("start() error: %s", strerror(-status));
7334f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        }
7434f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent        return status;
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
76e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void stop()
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(STOP, data, &reply);
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
83e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void flush()
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(FLUSH, data, &reply);
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void mute(bool e)
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInt32(e);
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(MUTE, data, &reply);
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
98e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void pause()
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    {
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Parcel data, reply;
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        remote()->transact(PAUSE, data, &reply);
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
105e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten
106be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    virtual status_t attachAuxEffect(int effectId)
107be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    {
108be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        Parcel data, reply;
109be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
110be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        data.writeInt32(effectId);
111be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        status_t status = remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
112be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        if (status == NO_ERROR) {
113be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            status = reply.readInt32();
114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } else {
1155ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("attachAuxEffect() error: %s", strerror(-status));
116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return status;
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
1194ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1204ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual status_t allocateTimedBuffer(size_t size, sp<IMemory>* buffer) {
1214ff14bae91075eb274eb1c2975982358946e7e63John Grossman        Parcel data, reply;
1224ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
1234ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt32(size);
1244ff14bae91075eb274eb1c2975982358946e7e63John Grossman        status_t status = remote()->transact(ALLOCATE_TIMED_BUFFER,
1254ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                             data, &reply);
1264ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (status == NO_ERROR) {
1274ff14bae91075eb274eb1c2975982358946e7e63John Grossman            status = reply.readInt32();
1284ff14bae91075eb274eb1c2975982358946e7e63John Grossman            if (status == NO_ERROR) {
1294ff14bae91075eb274eb1c2975982358946e7e63John Grossman                *buffer = interface_cast<IMemory>(reply.readStrongBinder());
1304ff14bae91075eb274eb1c2975982358946e7e63John Grossman            }
1314ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
1324ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return status;
1334ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
1344ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1354ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual status_t queueTimedBuffer(const sp<IMemory>& buffer,
1364ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                      int64_t pts) {
1374ff14bae91075eb274eb1c2975982358946e7e63John Grossman        Parcel data, reply;
1384ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
1394ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeStrongBinder(buffer->asBinder());
1404ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt64(pts);
1414ff14bae91075eb274eb1c2975982358946e7e63John Grossman        status_t status = remote()->transact(QUEUE_TIMED_BUFFER,
1424ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                             data, &reply);
1434ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (status == NO_ERROR) {
1444ff14bae91075eb274eb1c2975982358946e7e63John Grossman            status = reply.readInt32();
1454ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
1464ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return status;
1474ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
1484ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1494ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual status_t setMediaTimeTransform(const LinearTransform& xform,
1504ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                           int target) {
1514ff14bae91075eb274eb1c2975982358946e7e63John Grossman        Parcel data, reply;
1524ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
1534ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt64(xform.a_zero);
1544ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt64(xform.b_zero);
1554ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt32(xform.a_to_b_numer);
1564ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt32(xform.a_to_b_denom);
1574ff14bae91075eb274eb1c2975982358946e7e63John Grossman        data.writeInt32(target);
1584ff14bae91075eb274eb1c2975982358946e7e63John Grossman        status_t status = remote()->transact(SET_MEDIA_TIME_TRANSFORM,
1594ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                             data, &reply);
1604ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (status == NO_ERROR) {
1614ff14bae91075eb274eb1c2975982358946e7e63John Grossman            status = reply.readInt32();
1624ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
1634ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return status;
1644ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectIMPLEMENT_META_INTERFACE(AudioTrack, "android.media.IAudioTrack");
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------
17089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t BnAudioTrack::onTransact(
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
174e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten    switch (code) {
175e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten        case GET_CBLK: {
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            reply->writeStrongBinder(getCblk()->asBinder());
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case START: {
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
1823acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten            reply->writeInt32(start());
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case STOP: {
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            stop();
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case FLUSH: {
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            flush();
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MUTE: {
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mute( data.readInt32() );
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } break;
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case PAUSE: {
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            CHECK_INTERFACE(IAudioTrack, data, reply);
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            pause();
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return NO_ERROR;
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
205be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        case ATTACH_AUX_EFFECT: {
206be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            CHECK_INTERFACE(IAudioTrack, data, reply);
207be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            reply->writeInt32(attachAuxEffect(data.readInt32()));
208be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return NO_ERROR;
209be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        } break;
2104ff14bae91075eb274eb1c2975982358946e7e63John Grossman        case ALLOCATE_TIMED_BUFFER: {
2114ff14bae91075eb274eb1c2975982358946e7e63John Grossman            CHECK_INTERFACE(IAudioTrack, data, reply);
2124ff14bae91075eb274eb1c2975982358946e7e63John Grossman            sp<IMemory> buffer;
2134ff14bae91075eb274eb1c2975982358946e7e63John Grossman            status_t status = allocateTimedBuffer(data.readInt32(), &buffer);
2144ff14bae91075eb274eb1c2975982358946e7e63John Grossman            reply->writeInt32(status);
2154ff14bae91075eb274eb1c2975982358946e7e63John Grossman            if (status == NO_ERROR) {
2164ff14bae91075eb274eb1c2975982358946e7e63John Grossman                reply->writeStrongBinder(buffer->asBinder());
2174ff14bae91075eb274eb1c2975982358946e7e63John Grossman            }
2184ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return NO_ERROR;
2194ff14bae91075eb274eb1c2975982358946e7e63John Grossman        } break;
2204ff14bae91075eb274eb1c2975982358946e7e63John Grossman        case QUEUE_TIMED_BUFFER: {
2214ff14bae91075eb274eb1c2975982358946e7e63John Grossman            CHECK_INTERFACE(IAudioTrack, data, reply);
2224ff14bae91075eb274eb1c2975982358946e7e63John Grossman            sp<IMemory> buffer = interface_cast<IMemory>(
2234ff14bae91075eb274eb1c2975982358946e7e63John Grossman                data.readStrongBinder());
2244ff14bae91075eb274eb1c2975982358946e7e63John Grossman            uint64_t pts = data.readInt64();
2254ff14bae91075eb274eb1c2975982358946e7e63John Grossman            reply->writeInt32(queueTimedBuffer(buffer, pts));
2264ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return NO_ERROR;
2274ff14bae91075eb274eb1c2975982358946e7e63John Grossman        } break;
2284ff14bae91075eb274eb1c2975982358946e7e63John Grossman        case SET_MEDIA_TIME_TRANSFORM: {
2294ff14bae91075eb274eb1c2975982358946e7e63John Grossman            CHECK_INTERFACE(IAudioTrack, data, reply);
2304ff14bae91075eb274eb1c2975982358946e7e63John Grossman            LinearTransform xform;
2314ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.a_zero = data.readInt64();
2324ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.b_zero = data.readInt64();
2334ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.a_to_b_numer = data.readInt32();
2344ff14bae91075eb274eb1c2975982358946e7e63John Grossman            xform.a_to_b_denom = data.readInt32();
2354ff14bae91075eb274eb1c2975982358946e7e63John Grossman            int target = data.readInt32();
2364ff14bae91075eb274eb1c2975982358946e7e63John Grossman            reply->writeInt32(setMediaTimeTransform(xform, target));
2374ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return NO_ERROR;
2384ff14bae91075eb274eb1c2975982358946e7e63John Grossman        } break;
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
245