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