1/* ================ 2 3 FILE: MediaModule.h 4 REVS: $Revision: 1.1 $ 5 NAME: marc 6 7 Copyright (c) 1997 by Be Incorporated. All Rights Reserved. 8 9================ */ 10 11#ifndef _MEDIA_MODULE_H 12#define _MEDIA_MODULE_H 13 14#include <List.h> 15#include <Locker.h> 16 17typedef double mk_time; 18typedef double mk_rate; 19typedef void (*mk_deferred_call)(void*); 20 21#define B_UNDEFINED_MK_TIME ((mk_time) -1) 22 23enum transport_status { 24 B_TRANSPORT_RUNNING, 25 B_TRANSPORT_STOPPED, 26 B_TRANSPORT_PAUSED 27}; 28 29enum channel_selector { 30 B_VIDEO_MAIN_CHANNEL, 31 B_VIDEO_MONITOR_CHANNEL, 32 B_AUDIO_FRONT_CHANNEL, 33 B_AUDIO_CENTER_CHANNEL, 34 B_AUDIO_REAR_CHANNEL, 35 B_AUDIO_SUB_CHANNEL, 36 B_AUDIO_MONITOR_CHANNEL, 37 B_MIDI_CHANNEL, 38 B_MISC_CHANNEL 39}; 40 41 42class BMediaRenderer; 43class BTransport; 44class BTimeBase; 45class BMessage; 46class BMediaChannel; 47 48 49class BMediaEvent { 50public: 51 virtual ~BMediaEvent() {}; 52 virtual mk_time Start() = 0; 53 virtual mk_time Duration(); 54 virtual bigtime_t CaptureTime(); 55}; 56 57 58class BEventStream { 59public: 60 BEventStream(); 61 virtual ~BEventStream(); 62 63 virtual mk_time Start(); 64 virtual void SetStart(mk_time); 65 virtual mk_time Duration(); 66 virtual void SetDuration(mk_time); 67 virtual BMediaEvent* GetEvent(BMediaChannel* channel) = 0; 68 virtual BMediaEvent* PeekEvent(BMediaChannel* channel, 69 mk_time asap = 0) = 0; 70 virtual status_t SeekToTime(BMediaChannel* channel, 71 mk_time time); 72 73private: 74 mk_time fStart; 75 mk_time fDuration; 76}; 77 78 79class BMediaRenderer { 80public: 81 BMediaRenderer(const char* name = NULL, int32 priority = B_NORMAL_PRIORITY); 82 virtual ~BMediaRenderer(); 83 84 virtual char* Name(); 85 virtual mk_time Latency(); 86 virtual BTransport* Transport(); 87 virtual void SetTransport(BTransport*); 88 virtual mk_time Start(); 89 virtual mk_time Duration(); 90 virtual BTimeBase* TimeBase(); 91 92 virtual void Open(); 93 virtual void Close(); 94 virtual void WakeUp(); 95 virtual void TransportChanged(mk_time time, mk_rate rate, 96 transport_status status); 97 virtual void StreamChanged(); 98 99 virtual void OpenReceived(); 100 virtual void CloseReceived(); 101 virtual void WakeUpReceived(); 102 virtual void TransportChangedReceived(mk_time time, mk_rate rate, 103 transport_status status); 104 virtual void StreamChangedReceived(); 105 106private: 107 static int32 _LoopThread(void* arg); 108 void LoopThread(); 109 110 thread_id fLoopThread; 111 sem_id fLoopSem; 112 int32 fFlags; 113 mk_time fTCTime; 114 mk_rate fTCRate; 115 transport_status fTCStatus; 116 BLocker fLoopLock; 117 118 char* fName; 119 BTransport* fTransport; 120}; 121 122 123class BTransport { 124public: 125 BTransport(); 126 virtual ~BTransport(); 127 128 virtual BTimeBase* TimeBase(); 129 virtual void SetTimeBase(BTimeBase*); 130 virtual BList* Renderers(); 131 virtual void AddRenderer(BMediaRenderer*); 132 virtual bool RemoveRenderer(BMediaRenderer*); 133 virtual transport_status Status(); 134 virtual void SetStatus(transport_status); 135 virtual mk_time PerformanceTime(); 136 virtual mk_rate PerformanceRate(); 137 virtual mk_time TimeOffset(); 138 virtual void SetTimeOffset(mk_time); 139 virtual mk_time MaximumLatency(); 140 virtual mk_time PerformanceStart(); 141 virtual mk_time PerformanceEnd(); 142 virtual void Open(); 143 virtual void Close(); 144 virtual void TransportChanged(); 145 virtual void TimeSkipped(); 146 virtual void RequestWakeUp(mk_time, BMediaRenderer*); 147 virtual void SeekToTime(mk_time); 148 virtual BMediaChannel* GetChannel(int32 selector); 149 150private: 151 BTimeBase* fTimeBase; 152 BList fRenderers; 153 BList fChannels; 154 BLocker fChannelListLock; 155 transport_status fStatus; 156 mk_time fTimeOffset; 157}; 158 159 160class BTimeBase { 161public: 162 BTimeBase(mk_rate rate = 1.0); 163 virtual ~BTimeBase(); 164 165 virtual BList* Transports(); 166 virtual void AddTransport(BTransport*); 167 virtual bool RemoveTransport(BTransport*); 168 virtual void TimeSkipped(); 169 virtual status_t CallAt(mk_time time, mk_deferred_call function, void* arg); 170 virtual mk_time Time(); 171 virtual mk_rate Rate(); 172 virtual mk_time TimeAt(bigtime_t system_time); 173 virtual bigtime_t SystemTimeAt(mk_time time); 174 virtual void Sync(mk_time time, bigtime_t system_time); 175 virtual bool IsAbsolute(); 176 177private: 178 static int32 _SnoozeThread(void* arg); 179 void SnoozeThread(); 180 181 BList fTransports; 182 BList fDeferredCalls; 183 BLocker fLock; 184 mk_rate fRate; 185 mk_time fSyncT; 186 bigtime_t fSyncS; 187 mk_time fSnoozeUntil; 188 thread_id fSnoozeThread; 189}; 190 191 192class BMediaChannel { 193public: 194 BMediaChannel(mk_rate rate, 195 BMediaRenderer* renderer = NULL, 196 BEventStream* source = NULL); 197 virtual ~BMediaChannel(); 198 199 virtual BMediaRenderer* Renderer(); 200 virtual void SetRenderer(BMediaRenderer*); 201 virtual BEventStream* Source(); 202 virtual void SetSource(BEventStream*); 203 virtual mk_rate Rate(); 204 virtual void SetRate(mk_rate); 205 bool LockChannel(); 206 status_t LockWithTimeout(bigtime_t); 207 void UnlockChannel(); 208 virtual void StreamChanged(); 209 210private: 211 mk_rate fRate; 212 BMediaRenderer* fRenderer; 213 BEventStream* fSource; 214 BLocker fChannelLock; 215}; 216 217 218#endif 219