IAudioTrack.cpp revision 5ff1dd576bb93c45b44088a51544a18fc43ebf58
13b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/* //device/extlibs/pv/android/IAudioTrack.cpp
23b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy**
33b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** Copyright 2007, The Android Open Source Project
43b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy**
53b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** Licensed under the Apache License, Version 2.0 (the "License");
63b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** you may not use this file except in compliance with the License.
73b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** You may obtain a copy of the License at
83b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy**
93b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy**     http://www.apache.org/licenses/LICENSE-2.0
103b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy**
113b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** Unless required by applicable law or agreed to in writing, software
123b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** distributed under the License is distributed on an "AS IS" BASIS,
133b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** See the License for the specific language governing permissions and
153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy** limitations under the License.
163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy*/
173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#define LOG_TAG "IAudioTrack"
193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy//#define LOG_NDEBUG 0
203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <utils/Log.h>
213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
223b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <stdint.h>
233b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <sys/types.h>
243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <binder/Parcel.h>
263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <media/IAudioTrack.h>
283b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
293b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guynamespace android {
30877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy
313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyenum {
323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    GET_CBLK = IBinder::FIRST_CALL_TRANSACTION,
333b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    START,
343b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    STOP,
353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    FLUSH,
363b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    MUTE,
378aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    PAUSE,
388aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy    ATTACH_AUX_EFFECT
393b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy};
403b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyclass BpAudioTrack : public BpInterface<IAudioTrack>
423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy{
433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guypublic:
443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    BpAudioTrack(const sp<IBinder>& impl)
453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        : BpInterface<IAudioTrack>(impl)
463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    {
473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    }
483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t start()
503b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    {
513b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        Parcel data, reply;
523b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
533b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        status_t status = remote()->transact(START, data, &reply);
543b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        if (status == NO_ERROR) {
553b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            status = reply.readInt32();
563b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        } else {
573b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            ALOGW("start() error: %s", strerror(-status));
583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        }
593b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        return status;
603b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    }
613b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
623b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual void stop()
633b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    {
643b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        Parcel data, reply;
653b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
663b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        remote()->transact(STOP, data, &reply);
673b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    }
683b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
69a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    virtual void flush()
70a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    {
71a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy        Parcel data, reply;
72a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
73a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy        remote()->transact(FLUSH, data, &reply);
74a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    }
75a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy
763b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual void mute(bool e)
773b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    {
783b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        Parcel data, reply;
793b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
803b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        data.writeInt32(e);
813b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        remote()->transact(MUTE, data, &reply);
823b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    }
833b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
843b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual void pause()
853b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    {
863b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        Parcel data, reply;
877f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
887f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy        remote()->transact(PAUSE, data, &reply);
897f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy    }
907f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy
917f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy    virtual sp<IMemory> getCblk() const
927f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy    {
937f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy        Parcel data, reply;
947f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy        sp<IMemory> cblk;
953b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
963b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        status_t status = remote()->transact(GET_CBLK, data, &reply);
97a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy        if (status == NO_ERROR) {
98a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy            cblk = interface_cast<IMemory>(reply.readStrongBinder());
997f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy        }
1007f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy        return cblk;
101a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    }
102a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy
103a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    virtual status_t attachAuxEffect(int effectId)
104a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy    {
1053b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        Parcel data, reply;
1063b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
1073b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        data.writeInt32(effectId);
1083b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        status_t status = remote()->transact(ATTACH_AUX_EFFECT, data, &reply);
1097f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy        if (status == NO_ERROR) {
1107f6d6b0370df4b5a9e0f45bffc31ea6caeeb509dRomain Guy            status = reply.readInt32();
1113b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        } else {
1123b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            ALOGW("attachAuxEffect() error: %s", strerror(-status));
1133b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        }
1143b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        return status;
1153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    }
1163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy};
1173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain GuyIMPLEMENT_META_INTERFACE(AudioTrack, "android.media.IAudioTrack");
1193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// ----------------------------------------------------------------------
1213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1223b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guystatus_t BnAudioTrack::onTransact(
1233b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
12417ab38f8a87bc90eab11373f878f220ce3031de6Ashok Bhat{
1253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    switch(code) {
1263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy       case GET_CBLK: {
1273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            CHECK_INTERFACE(IAudioTrack, data, reply);
1283b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            reply->writeStrongBinder(getCblk()->asBinder());
1293b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return NO_ERROR;
1303b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        } break;
1313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        case START: {
1323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            CHECK_INTERFACE(IAudioTrack, data, reply);
1333b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            reply->writeInt32(start());
1343b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return NO_ERROR;
1353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        } break;
1363b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        case STOP: {
1373b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            CHECK_INTERFACE(IAudioTrack, data, reply);
1383b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            stop();
1393b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return NO_ERROR;
140a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy        } break;
1413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        case FLUSH: {
1423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            CHECK_INTERFACE(IAudioTrack, data, reply);
1433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            flush();
1443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return NO_ERROR;
1453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        } break;
1463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        case MUTE: {
1473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            CHECK_INTERFACE(IAudioTrack, data, reply);
148a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy            mute( data.readInt32() );
1493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return NO_ERROR;
1503b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        } break;
1513b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        case PAUSE: {
1523b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            CHECK_INTERFACE(IAudioTrack, data, reply);
1533b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            pause();
1543b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return NO_ERROR;
1553b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        }
156a404e16e4933857464046d763ed7629cd0c86cbfRomain Guy        case ATTACH_AUX_EFFECT: {
1573b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            CHECK_INTERFACE(IAudioTrack, data, reply);
1583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            reply->writeInt32(attachAuxEffect(data.readInt32()));
1593b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return NO_ERROR;
1603b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        } break;
1613b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        default:
1623b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            return BBinder::onTransact(code, data, reply, flags);
163d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    }
1643b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}
1653b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1663b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}; // namespace android
1673b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1683b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy