1f808efafSAxel Dörfler/*
2f808efafSAxel Dörfler * Copyright 2009, Haiku Inc. All Rights Reserved.
3f808efafSAxel Dörfler * Distributed under the terms of the MIT License.
4f808efafSAxel Dörfler */
5f808efafSAxel Dörfler#ifndef _TIME_SOURCE_H
652a38012Sejakowatz#define _TIME_SOURCE_H
752a38012Sejakowatz
8f808efafSAxel Dörfler
952a38012Sejakowatz#include <MediaDefs.h>
1052a38012Sejakowatz#include <MediaNode.h>
1152a38012Sejakowatz
1252a38012Sejakowatz
1352a38012Sejakowatzclass _BSlaveNodeStorageP;
140e21b167Sbeveloper
15f808efafSAxel Dörflernamespace BPrivate {
16f808efafSAxel Dörfler	namespace media {
17f808efafSAxel Dörfler		class BMediaRosterEx;
18f808efafSAxel Dörfler		class TimeSourceObject;
19f808efafSAxel Dörfler		class SystemTimeSourceObject;
20f808efafSAxel Dörfler		class SlaveNodes;
21f808efafSAxel Dörfler		struct TimeSourceTransmit;
22f808efafSAxel Dörfler	}
23f808efafSAxel Dörfler}
2452a38012Sejakowatz
2552a38012Sejakowatz
26f808efafSAxel Dörflerclass BTimeSource : public virtual BMediaNode {
2752a38012Sejakowatzprotected:
28f808efafSAxel Dörfler	virtual						~BTimeSource();
2952a38012Sejakowatz
3052a38012Sejakowatzpublic:
31f808efafSAxel Dörfler	virtual	status_t			SnoozeUntil(bigtime_t performanceTime,
32f808efafSAxel Dörfler									bigtime_t withLatency = 0,
33f808efafSAxel Dörfler									bool retrySignals = false);
3452a38012Sejakowatz
35f808efafSAxel Dörfler			bigtime_t			Now();
36f808efafSAxel Dörfler			bigtime_t			PerformanceTimeFor(bigtime_t realTime);
37f808efafSAxel Dörfler			bigtime_t			RealTimeFor(bigtime_t performanceTime,
38f808efafSAxel Dörfler									bigtime_t withLatency);
39f808efafSAxel Dörfler			bool				IsRunning();
4052a38012Sejakowatz
41f808efafSAxel Dörfler			status_t			GetTime(bigtime_t* _performanceTime,
42f808efafSAxel Dörfler									bigtime_t* _realTime, float* _drift);
43f808efafSAxel Dörfler			status_t			GetStartLatency(bigtime_t* _latency);
4452a38012Sejakowatz
45f808efafSAxel Dörfler	static	bigtime_t			RealTime();
4652a38012Sejakowatz
47f808efafSAxel Dörflerprotected:
48f808efafSAxel Dörfler								BTimeSource();
4952a38012Sejakowatz
50f808efafSAxel Dörfler	virtual	status_t			HandleMessage(int32 message, const void* data,
51f808efafSAxel Dörfler									size_t size);
5252a38012Sejakowatz
53f808efafSAxel Dörfler			void				PublishTime(bigtime_t performanceTime,
54f808efafSAxel Dörfler									bigtime_t realTime, float drift);
5552a38012Sejakowatz
56f808efafSAxel Dörfler			void				BroadcastTimeWarp(bigtime_t atRealTime,
57f808efafSAxel Dörfler									bigtime_t newPerformanceTime);
5852a38012Sejakowatz
59f808efafSAxel Dörfler			void				SendRunMode(run_mode mode);
60f808efafSAxel Dörfler	virtual	void				SetRunMode(run_mode mode);
61f808efafSAxel Dörfler
62f808efafSAxel Dörfler	enum time_source_op {
63f808efafSAxel Dörfler		B_TIMESOURCE_START = 1,
64f808efafSAxel Dörfler		B_TIMESOURCE_STOP,
65f808efafSAxel Dörfler		B_TIMESOURCE_STOP_IMMEDIATELY,
66f808efafSAxel Dörfler		B_TIMESOURCE_SEEK
67f808efafSAxel Dörfler	};
6852a38012Sejakowatz
69f808efafSAxel Dörfler	struct time_source_op_info {
70f808efafSAxel Dörfler		time_source_op	op;
71f808efafSAxel Dörfler		int32			_reserved1;
72f808efafSAxel Dörfler		bigtime_t		real_time;
73f808efafSAxel Dörfler		bigtime_t		performance_time;
74f808efafSAxel Dörfler		int32			_reserved2[6];
75f808efafSAxel Dörfler	};
76f808efafSAxel Dörfler
77f808efafSAxel Dörfler	virtual	status_t			TimeSourceOp(const time_source_op_info& op,
78f808efafSAxel Dörfler									void* _reserved) = 0;
79f808efafSAxel Dörfler
80f808efafSAxel Dörflerprivate:
8152a38012Sejakowatz	friend class BMediaNode;
8252a38012Sejakowatz	friend class BMediaRoster;
8354187cc6Sbeveloper	friend class BPrivate::media::BMediaRosterEx;
84835140c8Sbeveloper	friend class BPrivate::media::SystemTimeSourceObject;
85f808efafSAxel Dörfler	friend class BPrivate::media::TimeSourceObject;
8652a38012Sejakowatz
87f808efafSAxel Dörfler								BTimeSource(const BTimeSource& other);
88f808efafSAxel Dörfler			BTimeSource&		operator=(const BTimeSource& other);
89f808efafSAxel Dörfler									// not implemented
90f808efafSAxel Dörfler
91f808efafSAxel Dörfler	explicit					BTimeSource(media_node_id id);
92f808efafSAxel Dörfler
93f808efafSAxel Dörfler			status_t			_Reserved_TimeSource_0(void*);
94f808efafSAxel Dörfler				// used for TimeSourceOp()
95f808efafSAxel Dörfler	virtual	status_t			_Reserved_TimeSource_1(void*);
96f808efafSAxel Dörfler	virtual	status_t			_Reserved_TimeSource_2(void*);
97f808efafSAxel Dörfler	virtual	status_t			_Reserved_TimeSource_3(void*);
98f808efafSAxel Dörfler	virtual	status_t			_Reserved_TimeSource_4(void*);
99f808efafSAxel Dörfler	virtual	status_t			_Reserved_TimeSource_5(void*);
100f808efafSAxel Dörfler
101f808efafSAxel Dörfler	virtual	status_t			RemoveMe(BMediaNode* node);
102f808efafSAxel Dörfler	virtual	status_t			AddMe(BMediaNode* node);
10352a38012Sejakowatz
104f808efafSAxel Dörfler			void				FinishCreate();
105f808efafSAxel Dörfler
106f808efafSAxel Dörfler			void				DirectStart(bigtime_t at);
107f808efafSAxel Dörfler			void				DirectStop(bigtime_t at, bool immediate);
108f808efafSAxel Dörfler			void				DirectSeek(bigtime_t to, bigtime_t at);
109f808efafSAxel Dörfler			void				DirectSetRunMode(run_mode mode);
110f808efafSAxel Dörfler			void				DirectAddMe(const media_node& node);
111f808efafSAxel Dörfler			void				DirectRemoveMe(const media_node& node);
112f808efafSAxel Dörfler
113f808efafSAxel Dörflerprivate:
114f808efafSAxel Dörfler			bool				fStarted;
115f808efafSAxel Dörfler			area_id				fArea;
11673ad2473SPawel Dziepak			BPrivate::media::TimeSourceTransmit* fBuf;
117f808efafSAxel Dörfler			BPrivate::media::SlaveNodes* fSlaveNodes;
118f808efafSAxel Dörfler
119f808efafSAxel Dörfler			area_id				_reserved_area;
120f808efafSAxel Dörfler			bool				fIsRealtime;
121f808efafSAxel Dörfler			bool				_reserved_bool_[3];
122f808efafSAxel Dörfler			uint32				_reserved_time_source_[10];
123f808efafSAxel Dörfler};
12452a38012Sejakowatz
12552a38012Sejakowatz
126f808efafSAxel Dörfler#endif	// _TIME_SOURCE_H
127