locks.c revision 3c170255cc71942f310b676d968cf73328aa5d70
1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* 2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License. 6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at 7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * 10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and 14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License. 15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */ 16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h" 18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_lock_exclusive(IObject *this) 20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 21a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_mutex_lock(&this->mMutex); 23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 25a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 26a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_unlock_exclusive(IObject *this) 27a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_mutex_unlock(&this->mMutex); 30a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 32a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 33e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenvoid object_unlock_exclusive_attributes(IObject *this, unsigned attributes) 34e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten{ 35e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten int ok; 36e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLuint32 objectID = IObjectToObjectID(this); 37e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten CAudioPlayer *ap; 38e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // Android likes to see certain updates synchronously 393c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 40e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes & ATTR_GAIN) { 41e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten switch (objectID) { 42e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten case SL_OBJECTID_AUDIOPLAYER: 43e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes &= ~ATTR_GAIN; // no need to process asynchronously also 44e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap = (CAudioPlayer *) this; 45e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef ANDROID 46e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten sles_to_android_audioPlayerVolumeUpdate(ap); 47e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#else 48e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten audioPlayerGainUpdate(ap); 49e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 50e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 51e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten case SL_OBJECTID_OUTPUTMIX: 52e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME update gains on all players attached to this outputmix 533c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi fprintf(stderr, "[ FIXME: gain update on an SL_OBJECTID_OUTPUTMIX to be implemented ]\n"); 543c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 553c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi case SL_OBJECTID_MIDIPLAYER: 563c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi // FIXME MIDI 573c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi fprintf(stderr, "[ FIXME: gain update on an SL_OBJECTID_MIDIPLAYER to be implemented ]\n"); 58e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 59e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten default: 60e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 61e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 62e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 633c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 643c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi if (attributes & ATTR_POSITION) { 653c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi switch (objectID) { 663c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi case SL_OBJECTID_AUDIOPLAYER: 673c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi attributes &= ~ATTR_POSITION; // no need to process asynchronously also 683c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi ap = (CAudioPlayer *) this; 693c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#ifdef ANDROID 703c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi sles_to_android_audioPlayerSeek(ap, ap->mSeek.mPos); 713c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#else 723c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi audioPlayerTransportUpdate(ap); 733c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi#endif 743c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 753c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi case SL_OBJECTID_MIDIPLAYER: 763c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi // FIXME MIDI 773c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi fprintf(stderr, "[ FIXME: position update on an SL_OBJECTID_MIDIPLAYER to be implemented ]\n"); 783c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 793c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi default: 803c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 813c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi } 823c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi } 833c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 84e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes & ATTR_TRANSPORT) { 85e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (SL_OBJECTID_AUDIOPLAYER == objectID) { 86e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes &= ~ATTR_TRANSPORT; // no need to process asynchronously also 87e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap = (CAudioPlayer *) this; 88e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef ANDROID 89e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME should only call when state changes 90e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten sles_to_android_audioPlayerSetPlayState(ap); 91e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME ditto, but for either eventflags or marker position 92e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten sles_to_android_audioPlayerUseEventMask(ap); 93e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#else 94e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten audioPlayerTransportUpdate(ap); 95e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 96e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 97e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 98e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes) { 99e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned oldAttributesMask = this->mAttributesMask; 100e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten this->mAttributesMask = oldAttributesMask | attributes; 101e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldAttributesMask) 102e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes = ATTR_NONE; 103e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 104e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ok = pthread_mutex_unlock(&this->mMutex); 105e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten assert(0 == ok); 106e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes) { // first update to this interface since previous sync 107e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IEngine *thisEngine = this->mEngine; 108e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_lock_exclusive(thisEngine); 109e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten thisEngine->mChangedMask |= 1 << (this->mInstanceID - 1); 110e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_unlock_exclusive(thisEngine); 111e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 112e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} 113e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 114a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_cond_wait(IObject *this) 115a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 116a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 117a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_cond_wait(&this->mCond, &this->mMutex); 118a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 119a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 120a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 121a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_cond_signal(IObject *this) 122a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 123a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 124a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_cond_signal(&this->mCond); 125a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 126a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 127a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten 128a438eb1cf1ae602afab00336528dd230bd929206Glenn Kastenvoid object_cond_broadcast(IObject *this) 129a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten{ 130a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten int ok; 131a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten ok = pthread_cond_broadcast(&this->mCond); 132a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten assert(0 == ok); 133a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten} 134