void GlobalMutex::Unlock() { // assert( g_cLock.LockingThread() == getpid() ); // assert( g_cLock.LockingThread() == GetCurLooper()->Thread() ); // assert( g_cLock.LockingThread() == find_thread(NULL) ); assert( g_cLock.IsLocked() ); g_cLock.Unlock(); }
/** We share one global list for all BMediaFormats in the team - since the * format data can change at any time, we have to update the list to ensure * that we are working on the latest data set. The list is always sorted by * description. The formats lock has to be held when you call this function. */ static status_t update_media_formats() { if (!sLock.IsLocked()) return B_NOT_ALLOWED; // We want the add-ons to register themselves with the format manager, so // the list is up to date. AddOnManager::GetInstance()->RegisterAddOns(); BMessage reply; FormatManager::GetInstance()->GetFormats(sLastFormatsUpdate, reply); // do we need an update at all? bool needUpdate; if (reply.FindBool("need_update", &needUpdate) < B_OK) return B_ERROR; if (!needUpdate) return B_OK; // update timestamp and check if the message is okay type_code code; int32 count; if (reply.FindInt64("timestamp", &sLastFormatsUpdate) < B_OK || reply.GetInfo("formats", &code, &count) < B_OK) return B_ERROR; // overwrite already existing formats int32 index = 0; for (; index < sFormats.CountItems() && index < count; index++) { meta_format* item = sFormats.ItemAt(index); const meta_format* newItem; ssize_t size; if (reply.FindData("formats", MEDIA_META_FORMAT_TYPE, index, (const void**)&newItem, &size) == B_OK) *item = *newItem; } // allocate additional formats for (; index < count; index++) { const meta_format* newItem; ssize_t size; if (reply.FindData("formats", MEDIA_META_FORMAT_TYPE, index, (const void**)&newItem, &size) == B_OK) sFormats.AddItem(new meta_format(*newItem)); } // remove no longer used formats while (count < sFormats.CountItems()) delete sFormats.RemoveItemAt(count); return B_OK; }
status_t BMediaFormats::RewindFormats() { if (!sLock.IsLocked() || sLock.LockingThread() != find_thread(NULL)) { // TODO: Shouldn't we simply drop into the debugger in this case? return B_NOT_ALLOWED; } fIteratorIndex = 0; return B_OK; }
status_t BMediaFormats::GetNextFormat(media_format* _format, media_format_description* _description) { if (!sLock.IsLocked() || sLock.LockingThread() != find_thread(NULL)) { // TODO: Shouldn't we simply drop into the debugger in this case? return B_NOT_ALLOWED; } if (fIteratorIndex == 0) { // This is the first call, so let's make sure we have current data to // operate on. status_t status = update_media_formats(); if (status < B_OK) return status; } meta_format* format = sFormats.ItemAt(fIteratorIndex++); if (format == NULL) return B_BAD_INDEX; return B_OK; }