99 lines
2.1 KiB
C++
99 lines
2.1 KiB
C++
/*
|
|
* Copyright 2002 Marcus Overhagen. All Rights Reserved.
|
|
* This file may be used under the terms of the MIT License.
|
|
*/
|
|
|
|
|
|
/*! The object returned by BMediaRoster's
|
|
MakeTimeSourceFor(const media_node& forNode);
|
|
*/
|
|
|
|
|
|
#include "TimeSourceObject.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <MediaRoster.h>
|
|
#include <OS.h>
|
|
|
|
#include <MediaMisc.h>
|
|
#include <MediaDebug.h>
|
|
|
|
#include "TimeSourceObjectManager.h"
|
|
|
|
|
|
TimeSourceObject::TimeSourceObject(const media_node& node)
|
|
:
|
|
BMediaNode("some timesource object", node.node, node.kind),
|
|
BTimeSource(node.node)
|
|
{
|
|
TRACE("TimeSourceObject::TimeSourceObject enter, id = %"
|
|
B_PRId32 "\n", node.node);
|
|
|
|
if (fControlPort > 0)
|
|
delete_port(fControlPort);
|
|
|
|
// We use the control port of the real time source object.
|
|
// this way, all messages are send to the real time source,
|
|
// and this shadow object won't receive any.
|
|
fControlPort = node.port;
|
|
|
|
ASSERT(fNodeID == node.node);
|
|
ASSERT(fKinds == node.kind);
|
|
|
|
if (node.node == NODE_SYSTEM_TIMESOURCE_ID) {
|
|
strcpy(fName, "System clock");
|
|
fIsRealtime = true;
|
|
} else {
|
|
live_node_info liveNodeInfo;
|
|
if (BMediaRoster::Roster()->GetLiveNodeInfo(node, &liveNodeInfo)
|
|
== B_OK)
|
|
strlcpy(fName, liveNodeInfo.name, B_MEDIA_NAME_LENGTH);
|
|
else {
|
|
snprintf(fName, B_MEDIA_NAME_LENGTH, "timesource %" B_PRId32,
|
|
node.node);
|
|
}
|
|
}
|
|
|
|
AddNodeKind(NODE_KIND_SHADOW_TIMESOURCE);
|
|
AddNodeKind(NODE_KIND_NO_REFCOUNTING);
|
|
|
|
TRACE("TimeSourceObject::TimeSourceObject leave, node id %" B_PRId32 "\n",
|
|
fNodeID);
|
|
}
|
|
|
|
|
|
status_t
|
|
TimeSourceObject::TimeSourceOp(const time_source_op_info& op, void* _reserved)
|
|
{
|
|
// we don't get anything here
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
BMediaAddOn*
|
|
TimeSourceObject::AddOn(int32* _id) const
|
|
{
|
|
if (_id != NULL)
|
|
*_id = 0;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
status_t
|
|
TimeSourceObject::DeleteHook(BMediaNode* node)
|
|
{
|
|
// if (fIsRealtime) {
|
|
// ERROR("TimeSourceObject::DeleteHook: system time source clone delete hook called\n");
|
|
// return B_ERROR;
|
|
// }
|
|
PRINT(1, "TimeSourceObject::DeleteHook enter\n");
|
|
gTimeSourceObjectManager->ObjectDeleted(this);
|
|
status_t status = BTimeSource::DeleteHook(node);
|
|
PRINT(1, "TimeSourceObject::DeleteHook leave\n");
|
|
return status;
|
|
}
|
|
|