haiku/src/kits/media/TimeSourceObjectManager.cpp

109 lines
2.4 KiB
C++

/*
* Copyright 2002 Marcus Overhagen. All Rights Reserved.
* This file may be used under the terms of the MIT License.
*/
/*! This works like a cache for time source objects, to make sure
each team only has one object representation for each time source.
*/
#include "TimeSourceObjectManager.h"
#include <stdio.h>
#include <Autolock.h>
#include <MediaRoster.h>
#include <MediaDebug.h>
#include <MediaMisc.h>
#include "TimeSourceObject.h"
namespace BPrivate {
namespace media {
TimeSourceObjectManager* gTimeSourceObjectManager;
// initialized by BMediaRoster.
TimeSourceObjectManager::TimeSourceObjectManager()
:
BLocker("time source object manager")
{
}
TimeSourceObjectManager::~TimeSourceObjectManager()
{
CALLED();
// force unloading all currently loaded time sources
NodeMap::iterator iterator = fMap.begin();
for (; iterator != fMap.end(); iterator++) {
BTimeSource* timeSource = iterator->second;
PRINT(1, "Forcing release of TimeSource id %ld...\n", timeSource->ID());
int32 debugCount = 0;
while (timeSource->Release() != NULL)
debugCount++;
PRINT(1, "Forcing release of TimeSource done, released %d times\n",
debugCount);
}
}
/*! BMediaRoster::MakeTimeSourceFor does use this function to request
a time source object. If it is already in memory, it will be
Acquired(), if not, a new TimeSourceObject will be created.
*/
BTimeSource*
TimeSourceObjectManager::GetTimeSource(const media_node& node)
{
CALLED();
BAutolock _(this);
PRINT(1, "TimeSourceObjectManager::GetTimeSource, node id %ld\n",
node.node);
NodeMap::iterator found = fMap.find(node.node);
if (found != fMap.end())
return dynamic_cast<BTimeSource*>(found->second->Acquire());
// time sources are not accounted in node reference counting
BTimeSource* timeSource = new(std::nothrow) TimeSourceObject(node);
if (timeSource == NULL)
return NULL;
fMap.insert(std::make_pair(node.node, timeSource));
return timeSource;
}
/*! This function is called during deletion of the time source object.
*/
void
TimeSourceObjectManager::ObjectDeleted(BTimeSource* timeSource)
{
CALLED();
BAutolock _(this);
PRINT(1, "TimeSourceObjectManager::ObjectDeleted, node id %ld\n",
timeSource->ID());
fMap.erase(timeSource->ID());
status_t status = BMediaRoster::Roster()->ReleaseNode(timeSource->Node());
if (status != B_OK) {
ERROR("TimeSourceObjectManager::ObjectDeleted, ReleaseNode failed\n");
}
}
} // namespace media
} // namespace BPrivate