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
TimeSourceObject(const media_node & node)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
TimeSourceOp(const time_source_op_info & op,void * _reserved)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*
AddOn(int32 * _id) const76 TimeSourceObject::AddOn(int32* _id) const
77 {
78 if (_id != NULL)
79 *_id = 0;
80
81 return NULL;
82 }
83
84
85 status_t
DeleteHook(BMediaNode * node)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