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