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