xref: /haiku/src/kits/media/TimeSource.cpp (revision 7120e97489acbf17d86d3f33e3b2e68974fd4b23)
1 /***********************************************************************
2  * AUTHOR: Marcus Overhagen
3  *   FILE: TimeSource.cpp
4  *  DESCR:
5  ***********************************************************************/
6 #include <TimeSource.h>
7 #include "debug.h"
8 #include "DataExchange.h"
9 #include "ServerInterface.h"
10 
11 // XXX This BTimeSource only works for realtime, nothing else is implemented
12 
13 // XXX The bebook says that the latency is always calculated in realtime
14 // XXX This is not currently done in this code
15 
16 /*************************************************************
17  * protected BTimeSource
18  *************************************************************/
19 
20 BTimeSource::~BTimeSource()
21 {
22 	CALLED();
23 }
24 
25 /*************************************************************
26  * public BTimeSource
27  *************************************************************/
28 
29 status_t
30 BTimeSource::SnoozeUntil(bigtime_t performance_time,
31 						 bigtime_t with_latency,
32 						 bool retry_signals)
33 {
34 	CALLED();
35 
36 	return B_ERROR;
37 }
38 
39 
40 bigtime_t
41 BTimeSource::Now()
42 {
43 	CALLED();
44 	return PerformanceTimeFor(RealTime());
45 }
46 
47 
48 bigtime_t
49 BTimeSource::PerformanceTimeFor(bigtime_t real_time)
50 {
51 	CALLED();
52 	bigtime_t performanceTime;
53 	float drift;
54 
55 	while (GetTime(&performanceTime, &real_time, &drift) != B_OK)
56 		snooze(1000);
57 
58 	return (bigtime_t)(performanceTime + (RealTime() - real_time) * drift);
59 }
60 
61 
62 bigtime_t
63 BTimeSource::RealTimeFor(bigtime_t performance_time,
64 						 bigtime_t with_latency)
65 {
66 	CALLED();
67 
68 	return performance_time - with_latency;
69 }
70 
71 
72 bool
73 BTimeSource::IsRunning()
74 {
75 	CALLED();
76 	return !fStopped;
77 }
78 
79 
80 status_t
81 BTimeSource::GetTime(bigtime_t *performance_time,
82 					 bigtime_t *real_time,
83 					 float *drift)
84 {
85 	CALLED();
86 	*performance_time = *real_time;
87 	*drift = 1.0f;
88 
89 	return B_OK;
90 }
91 
92 
93 bigtime_t
94 BTimeSource::RealTime()
95 {
96 	CALLED();
97 	return system_time();
98 }
99 
100 
101 status_t
102 BTimeSource::GetStartLatency(bigtime_t *out_latency)
103 {
104 	CALLED();
105 	*out_latency = 0;
106 	return B_OK;
107 }
108 
109 /*************************************************************
110  * protected BTimeSource
111  *************************************************************/
112 
113 
114 BTimeSource::BTimeSource() :
115 	BMediaNode("called by BTimeSource"),
116 	fStopped(false)
117 {
118 	CALLED();
119 
120 	AddNodeKind(B_TIME_SOURCE);
121 }
122 
123 
124 status_t
125 BTimeSource::HandleMessage(int32 message,
126 						   const void *data,
127 						   size_t size)
128 {
129 	INFO("BTimeSource::HandleMessage %#lx, node %ld\n", message, fNodeID);
130 
131 	switch (message) {
132 		case TIMESOURCE_OP:
133 		{
134 			const time_source_op_info *data = static_cast<const time_source_op_info *>(data);
135 			status_t result;
136 			result = TimeSourceOp(*data, NULL);
137 			return B_OK;
138 		}
139 	};
140 	return B_ERROR;
141 }
142 
143 
144 void
145 BTimeSource::PublishTime(bigtime_t performance_time,
146 						 bigtime_t real_time,
147 						 float drift)
148 {
149 //	UNIMPLEMENTED(); //XXX
150 }
151 
152 
153 void
154 BTimeSource::BroadcastTimeWarp(bigtime_t at_real_time,
155 							   bigtime_t new_performance_time)
156 {
157 	UNIMPLEMENTED();
158 }
159 
160 
161 void
162 BTimeSource::SendRunMode(run_mode mode)
163 {
164 	UNIMPLEMENTED();
165 }
166 
167 
168 void
169 BTimeSource::SetRunMode(run_mode mode)
170 {
171 	CALLED();
172 	BMediaNode::SetRunMode(mode);
173 }
174 /*************************************************************
175  * private BTimeSource
176  *************************************************************/
177 
178 /*
179 //unimplemented
180 BTimeSource::BTimeSource(const BTimeSource &clone)
181 BTimeSource &BTimeSource::operator=(const BTimeSource &clone)
182 */
183 
184 status_t BTimeSource::_Reserved_TimeSource_0(void *) { return B_ERROR; }
185 status_t BTimeSource::_Reserved_TimeSource_1(void *) { return B_ERROR; }
186 status_t BTimeSource::_Reserved_TimeSource_2(void *) { return B_ERROR; }
187 status_t BTimeSource::_Reserved_TimeSource_3(void *) { return B_ERROR; }
188 status_t BTimeSource::_Reserved_TimeSource_4(void *) { return B_ERROR; }
189 status_t BTimeSource::_Reserved_TimeSource_5(void *) { return B_ERROR; }
190 
191 /* explicit */
192 BTimeSource::BTimeSource(media_node_id id) :
193 	BMediaNode("called by BTimeSource", id, 0),
194 	fStopped(false)
195 {
196 	CALLED();
197 
198 	AddNodeKind(B_TIME_SOURCE);
199 }
200 
201 
202 void
203 BTimeSource::FinishCreate()
204 {
205 	UNIMPLEMENTED();
206 }
207 
208 
209 status_t
210 BTimeSource::RemoveMe(BMediaNode *node)
211 {
212 	UNIMPLEMENTED();
213 
214 	return B_ERROR;
215 }
216 
217 
218 status_t
219 BTimeSource::AddMe(BMediaNode *node)
220 {
221 	UNIMPLEMENTED();
222 
223 	return B_ERROR;
224 }
225 
226 
227 void
228 BTimeSource::DirectStart(bigtime_t at)
229 {
230 	UNIMPLEMENTED();
231 }
232 
233 
234 void
235 BTimeSource::DirectStop(bigtime_t at,
236 						bool immediate)
237 {
238 	UNIMPLEMENTED();
239 }
240 
241 
242 void
243 BTimeSource::DirectSeek(bigtime_t to,
244 						bigtime_t at)
245 {
246 	UNIMPLEMENTED();
247 }
248 
249 
250 void
251 BTimeSource::DirectSetRunMode(run_mode mode)
252 {
253 	UNIMPLEMENTED();
254 }
255 
256 
257