1/* 2 * Copyright 2002 Marcus Overhagen. All Rights Reserved. 3 * This file may be used under the terms of the MIT License. 4 */ 5 6 7/*! The object returned by BMediaRoster's 8 MakeTimeSourceFor(const media_node& forNode); 9*/ 10 11 12#include "TimeSourceObject.h" 13 14#include <stdio.h> 15#include <string.h> 16 17#include <MediaRoster.h> 18#include <OS.h> 19 20#include <MediaMisc.h> 21#include <debug.h> 22 23#include "TimeSourceObjectManager.h" 24 25 26TimeSourceObject::TimeSourceObject(const media_node& node) 27 : 28 BMediaNode("some timesource object", node.node, node.kind), 29 BTimeSource(node.node) 30{ 31 TRACE("TimeSourceObject::TimeSourceObject enter, id = %ld\n", node.node); 32 if (fControlPort > 0) 33 delete_port(fControlPort); 34 35 // We use the control port of the real time source object. 36 // this way, all messages are send to the real time source, 37 // and this shadow object won't receive any. 38 fControlPort = node.port; 39 40 ASSERT(fNodeID == node.node); 41 ASSERT(fKinds == node.kind); 42 43 if (node.node == NODE_SYSTEM_TIMESOURCE_ID) { 44 strcpy(fName, "System clock"); 45 fIsRealtime = true; 46 } else { 47 live_node_info liveNodeInfo; 48 if (BMediaRoster::Roster()->GetLiveNodeInfo(node, &liveNodeInfo) 49 == B_OK) 50 strlcpy(fName, liveNodeInfo.name, B_MEDIA_NAME_LENGTH); 51 else { 52 snprintf(fName, B_MEDIA_NAME_LENGTH, "timesource %" B_PRId32, 53 node.node); 54 } 55 } 56 57 AddNodeKind(NODE_KIND_SHADOW_TIMESOURCE); 58 AddNodeKind(NODE_KIND_NO_REFCOUNTING); 59 60 TRACE("TimeSourceObject::TimeSourceObject leave, node id %" B_PRId32 "\n", 61 fNodeID); 62} 63 64 65status_t 66TimeSourceObject::TimeSourceOp(const time_source_op_info& op, void* _reserved) 67{ 68 // we don't get anything here 69 return B_OK; 70} 71 72 73BMediaAddOn* 74TimeSourceObject::AddOn(int32* _id) const 75{ 76 if (_id != NULL) 77 *_id = 0; 78 79 return NULL; 80} 81 82 83status_t 84TimeSourceObject::DeleteHook(BMediaNode* node) 85{ 86// if (fIsRealtime) { 87// ERROR("TimeSourceObject::DeleteHook: system time source clone delete hook called\n"); 88// return B_ERROR; 89// } 90 PRINT(1, "TimeSourceObject::DeleteHook enter\n"); 91 gTimeSourceObjectManager->ObjectDeleted(this); 92 status_t status = BTimeSource::DeleteHook(node); 93 PRINT(1, "TimeSourceObject::DeleteHook leave\n"); 94 return status; 95} 96 97