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