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 <MediaDebug.h> 22 23 #include "TimeSourceObjectManager.h" 24 25 26 TimeSourceObject::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 = %" 32 B_PRId32 "\n", node.node); 33 34 if (fControlPort > 0) 35 delete_port(fControlPort); 36 37 // We use the control port of the real time source object. 38 // this way, all messages are send to the real time source, 39 // and this shadow object won't receive any. 40 fControlPort = node.port; 41 42 ASSERT(fNodeID == node.node); 43 ASSERT(fKinds == node.kind); 44 45 if (node.node == NODE_SYSTEM_TIMESOURCE_ID) { 46 strcpy(fName, "System clock"); 47 fIsRealtime = true; 48 } else { 49 live_node_info liveNodeInfo; 50 if (BMediaRoster::Roster()->GetLiveNodeInfo(node, &liveNodeInfo) 51 == B_OK) 52 strlcpy(fName, liveNodeInfo.name, B_MEDIA_NAME_LENGTH); 53 else { 54 snprintf(fName, B_MEDIA_NAME_LENGTH, "timesource %" B_PRId32, 55 node.node); 56 } 57 } 58 59 AddNodeKind(NODE_KIND_SHADOW_TIMESOURCE); 60 AddNodeKind(NODE_KIND_NO_REFCOUNTING); 61 62 TRACE("TimeSourceObject::TimeSourceObject leave, node id %" B_PRId32 "\n", 63 fNodeID); 64 } 65 66 67 status_t 68 TimeSourceObject::TimeSourceOp(const time_source_op_info& op, void* _reserved) 69 { 70 // we don't get anything here 71 return B_OK; 72 } 73 74 75 BMediaAddOn* 76 TimeSourceObject::AddOn(int32* _id) const 77 { 78 if (_id != NULL) 79 *_id = 0; 80 81 return NULL; 82 } 83 84 85 status_t 86 TimeSourceObject::DeleteHook(BMediaNode* node) 87 { 88 // if (fIsRealtime) { 89 // ERROR("TimeSourceObject::DeleteHook: system time source clone delete hook called\n"); 90 // return B_ERROR; 91 // } 92 PRINT(1, "TimeSourceObject::DeleteHook enter\n"); 93 gTimeSourceObjectManager->ObjectDeleted(this); 94 status_t status = BTimeSource::DeleteHook(node); 95 PRINT(1, "TimeSourceObject::DeleteHook leave\n"); 96 return status; 97 } 98 99