sync.c revision 0b595cc18d82e41dfab0c686e9e63c30a86e8c80
1d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten/*
2d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten *
4d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * you may not use this file except in compliance with the License.
6d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * You may obtain a copy of the License at
7d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten *
8d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten *
10d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * See the License for the specific language governing permissions and
14d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten * limitations under the License.
15d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten */
16d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten
17d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten/* sync */
18d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten
19d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten#include "sles_allinclusive.h"
20d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten
210b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten
220b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten/** Sync thread.
230b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten *   The sync thread runs periodically to synchronize audio state between
240b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten *   the application and platform-specific device driver; for best results
250b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten *   it should run about every graphics frame (e.g. 20 Hz to 50 Hz).
260b595cc18d82e41dfab0c686e9e63c30a86e8c80Glenn Kasten */
27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten
28d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenvoid *sync_start(void *arg)
29d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten{
30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    CEngine *this = (CEngine *) arg;
31d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    for (;;) {
32e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
33e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        usleep(20000*5);
34e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
35e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        object_lock_exclusive(&this->mObject);
36e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        if (this->mEngine.mShutdown) {
37e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            this->mEngine.mShutdownAck = SL_BOOLEAN_TRUE;
38e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            pthread_cond_signal(&this->mEngine.mShutdownCond);
39e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            object_unlock_exclusive(&this->mObject);
40d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            break;
41e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        }
42a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten        if (this->m3DCommit.mWaiting) {
43a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten            this->m3DCommit.mWaiting = 0;
44a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten            ++this->m3DCommit.mGeneration;
45a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten            // There might be more than one thread blocked in Commit, so wake them all
46a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten            object_cond_broadcast(&this->mObject);
47a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten            // here is where we would process the enqueued 3D commands
48a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten        }
49e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        unsigned instanceMask = this->mEngine.mInstanceMask;
50e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        unsigned changedMask = this->mEngine.mChangedMask;
51e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        this->mEngine.mChangedMask = 0;
52e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        object_unlock_exclusive(&this->mObject);
53e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
54e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        // now we know which objects exist, and which of those have changes
55e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
56e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        unsigned combinedMask = changedMask | instanceMask;
57e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten        while (combinedMask) {
58e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            unsigned i = ctz(combinedMask);
59d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten            assert(MAX_INSTANCE > i);
60e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            combinedMask &= ~(1 << i);
61d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            IObject *instance = (IObject *) this->mEngine.mInstances[i];
62d07ed7df4ec9338f97f12627690d58ed9b34f25bGlenn Kasten            // Could be NULL during construct or destroy
63d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            if (NULL == instance)
64d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten                continue;
65e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
66e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            // FIXME race condition here - object could be destroyed by now, better do destroy here
67e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
68e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            object_lock_exclusive(instance);
69e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            //unsigned attributesMask = instance->mAttributesMask;
70e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten            instance->mAttributesMask = 0;
71e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
72d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            switch (IObjectToObjectID(instance)) {
73d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            case SL_OBJECTID_AUDIOPLAYER:
74e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                {
75e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                //CAudioPlayer *audioPlayer = (CAudioPlayer *) instance;
76e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                // do something here
77e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                object_unlock_exclusive(instance);
78e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                }
79d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten                break;
80e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten
81d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            default:
82e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten                object_unlock_exclusive(instance);
83d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten                break;
84d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten            }
85d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten        }
86d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    }
87d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    return NULL;
88d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten}
89