locks.c revision e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037
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 39e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes & ATTR_GAIN) { 40e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten switch (objectID) { 41e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten case SL_OBJECTID_AUDIOPLAYER: 42e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes &= ~ATTR_GAIN; // no need to process asynchronously also 43e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap = (CAudioPlayer *) this; 44e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef ANDROID 45e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten sles_to_android_audioPlayerVolumeUpdate(ap); 46e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#else 47e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten audioPlayerGainUpdate(ap); 48e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 49e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 50e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten case SL_OBJECTID_OUTPUTMIX: 51e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME update gains on all players attached to this outputmix 52e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten fprintf(stderr, "FIXME: gain update on an SL_OBJECTID_OUTPUTMIX to be implemented\n"); 53e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 54e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME MIDI 55e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten default: 56e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten break; 57e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 58e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 59e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes & ATTR_TRANSPORT) { 60e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (SL_OBJECTID_AUDIOPLAYER == objectID) { 61e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes &= ~ATTR_TRANSPORT; // no need to process asynchronously also 62e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ap = (CAudioPlayer *) this; 63e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#ifdef ANDROID 64e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME should only call when state changes 65e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten sles_to_android_audioPlayerSetPlayState(ap); 66e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten // FIXME ditto, but for either eventflags or marker position 67e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten sles_to_android_audioPlayerUseEventMask(ap); 68e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#else 69e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten audioPlayerTransportUpdate(ap); 70e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten#endif 71e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 72e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 73e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes) { 74e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten unsigned oldAttributesMask = this->mAttributesMask; 75e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten this->mAttributesMask = oldAttributesMask | attributes; 76e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldAttributesMask) 77e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten attributes = ATTR_NONE; 78e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 79e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten ok = pthread_mutex_unlock(&this->mMutex); 80e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten assert(0 == ok); 81e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (attributes) { // first update to this interface since previous sync 82e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten IEngine *thisEngine = this->mEngine; 83e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_lock_exclusive(thisEngine); 84e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten thisEngine->mChangedMask |= 1 << (this->mInstanceID - 1); 85e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_unlock_exclusive(thisEngine); 86e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } 87e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten} 88e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten 89a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_cond_wait(IObject *this) 90a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 91a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 92a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_cond_wait(&this->mCond, &this->mMutex); 93a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 94a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 95a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten 96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid object_cond_signal(IObject *this) 97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{ 98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten int ok; 99a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten ok = pthread_cond_signal(&this->mCond); 100a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten assert(0 == ok); 101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten} 102