00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _BLT_DECODER_SERVER_H_
00011 #define _BLT_DECODER_SERVER_H_
00012
00013
00014
00015
00016 #include "Neptune.h"
00017 #include "BltDecoder.h"
00018
00019
00020
00021
00022 const BLT_Size BLT_DECODER_SERVER_DEFAULT_POSITION_UPDATE_RANGE = 400;
00023
00024
00025
00026
00027 class BLT_DecoderServer_PropertyWrapper {
00028 public:
00029 BLT_DecoderServer_PropertyWrapper(const ATX_Property& property);
00030 ~BLT_DecoderServer_PropertyWrapper();
00031
00032 ATX_Property m_Property;
00033 };
00034
00035
00036
00037
00038 class BLT_DecoderServer_MessageHandler
00039 {
00040 public:
00041
00042 virtual ~BLT_DecoderServer_MessageHandler() {}
00043
00044 virtual void OnSetInputCommand(BLT_CString name, BLT_CString type) = 0;
00045 virtual void OnSetOutputCommand(BLT_CString name, BLT_CString type) = 0;
00046 virtual void OnPlayCommand() = 0;
00047 virtual void OnStopCommand() = 0;
00048 virtual void OnPauseCommand() = 0;
00049 virtual void OnPingCommand(const void* cookie) = 0;
00050 virtual void OnSeekToTimeCommand(BLT_Cardinal time) = 0;
00051 virtual void OnSeekToPositionCommand(BLT_Size offset, BLT_Size range) = 0;
00052 virtual void OnRegisterModuleCommand(BLT_Module* module) = 0;
00053 virtual void OnAddNodeCommand(BLT_CString name) = 0;
00054 virtual void OnSetPropertyCommand(BLT_PropertyScope scope,
00055 const NPT_String& target,
00056 const ATX_Property& property) = 0;
00057 };
00058
00059
00060
00061
00062 class BLT_DecoderServer_Message : public NPT_Message
00063 {
00064 public:
00065
00066 typedef enum {
00067 COMMAND_ID_SET_INPUT,
00068 COMMAND_ID_SET_OUTPUT,
00069 COMMAND_ID_PLAY,
00070 COMMAND_ID_STOP,
00071 COMMAND_ID_PAUSE,
00072 COMMAND_ID_PING,
00073 COMMAND_ID_SEEK_TO_TIME,
00074 COMMAND_ID_SEEK_TO_POSITION,
00075 COMMAND_ID_REGISTER_MODULE,
00076 COMMAND_ID_ADD_NODE,
00077 COMMAND_ID_SET_PROPERTY
00078 } CommandId;
00079
00080
00081 static NPT_Message::Type MessageType;
00082 NPT_Message::Type GetType() {
00083 return MessageType;
00084 }
00085
00086
00087 BLT_DecoderServer_Message(CommandId id) : m_Id(id) {}
00088 virtual NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) = 0;
00089 virtual NPT_Result Dispatch(NPT_MessageHandler* handler) {
00090 BLT_DecoderServer_MessageHandler* specific =
00091 dynamic_cast<BLT_DecoderServer_MessageHandler*>(handler);
00092 if (specific) {
00093 return Deliver(specific);
00094 } else {
00095 return DefaultDeliver(handler);
00096 }
00097 }
00098
00099 private:
00100
00101 CommandId m_Id;
00102 };
00103
00104
00105
00106
00107 class BLT_DecoderServer_SetInputCommandMessage :
00108 public BLT_DecoderServer_Message
00109 {
00110 public:
00111
00112 BLT_DecoderServer_SetInputCommandMessage(BLT_CString name,
00113 BLT_CString type) :
00114 BLT_DecoderServer_Message(COMMAND_ID_SET_INPUT),
00115 m_Name(BLT_SAFE_STRING(name)), m_Type(BLT_SAFE_STRING(type)) {}
00116 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00117 handler->OnSetInputCommand(m_Name.GetChars(), m_Type.GetChars());
00118 return NPT_SUCCESS;
00119 }
00120
00121 private:
00122
00123 BLT_StringObject m_Name;
00124 BLT_StringObject m_Type;
00125 };
00126
00127
00128
00129
00130 class BLT_DecoderServer_SetOutputCommandMessage :
00131 public BLT_DecoderServer_Message
00132 {
00133 public:
00134
00135 BLT_DecoderServer_SetOutputCommandMessage(BLT_CString name,
00136 BLT_CString type) :
00137 BLT_DecoderServer_Message(COMMAND_ID_SET_OUTPUT),
00138 m_Name(BLT_SAFE_STRING(name)), m_Type(BLT_SAFE_STRING(type)) {}
00139 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00140 handler->OnSetOutputCommand(m_Name.GetChars(), m_Type.GetChars());
00141 return NPT_SUCCESS;
00142 }
00143
00144 private:
00145
00146 BLT_StringObject m_Name;
00147 BLT_StringObject m_Type;
00148 };
00149
00150
00151
00152
00153 class BLT_DecoderServer_PlayCommandMessage : public BLT_DecoderServer_Message
00154 {
00155 public:
00156
00157 BLT_DecoderServer_PlayCommandMessage() :
00158 BLT_DecoderServer_Message(COMMAND_ID_PLAY) {}
00159 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00160 handler->OnPlayCommand();
00161 return NPT_SUCCESS;
00162 }
00163 };
00164
00165
00166
00167
00168 class BLT_DecoderServer_StopCommandMessage : public BLT_DecoderServer_Message
00169 {
00170 public:
00171
00172 BLT_DecoderServer_StopCommandMessage() :
00173 BLT_DecoderServer_Message(COMMAND_ID_STOP) {}
00174 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00175 handler->OnStopCommand();
00176 return NPT_SUCCESS;
00177 }
00178 };
00179
00180
00181
00182
00183 class BLT_DecoderServer_PauseCommandMessage : public BLT_DecoderServer_Message
00184 {
00185 public:
00186
00187 BLT_DecoderServer_PauseCommandMessage() :
00188 BLT_DecoderServer_Message(COMMAND_ID_PAUSE) {}
00189 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00190 handler->OnPauseCommand();
00191 return NPT_SUCCESS;
00192 }
00193 };
00194
00195
00196
00197
00198 class BLT_DecoderServer_PingCommandMessage : public BLT_DecoderServer_Message
00199 {
00200 public:
00201
00202 BLT_DecoderServer_PingCommandMessage(const void* cookie) :
00203 BLT_DecoderServer_Message(COMMAND_ID_PING), m_Cookie(cookie) {}
00204 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00205 handler->OnPingCommand(m_Cookie);
00206 return NPT_SUCCESS;
00207 }
00208
00209 private:
00210
00211 const void* m_Cookie;
00212 };
00213
00214
00215
00216
00217 class BLT_DecoderServer_SeekToTimeCommandMessage : public BLT_DecoderServer_Message
00218 {
00219 public:
00220
00221 BLT_DecoderServer_SeekToTimeCommandMessage(BLT_Cardinal time) :
00222 BLT_DecoderServer_Message(COMMAND_ID_SEEK_TO_TIME),
00223 m_Time(time) {}
00224 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00225 handler->OnSeekToTimeCommand(m_Time);
00226 return NPT_SUCCESS;
00227 }
00228
00229 private:
00230
00231 BLT_Cardinal m_Time;
00232 };
00233
00234
00235
00236
00237 class BLT_DecoderServer_SeekToPositionCommandMessage : public BLT_DecoderServer_Message
00238 {
00239 public:
00240
00241 BLT_DecoderServer_SeekToPositionCommandMessage(BLT_Size offset,
00242 BLT_Size range) :
00243 BLT_DecoderServer_Message(COMMAND_ID_SEEK_TO_POSITION),
00244 m_Offset(offset), m_Range(range) {}
00245 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00246 handler->OnSeekToPositionCommand(m_Offset, m_Range);
00247 return NPT_SUCCESS;
00248 }
00249
00250 private:
00251
00252 BLT_Size m_Offset;
00253 BLT_Size m_Range;
00254 };
00255
00256
00257
00258
00259 class BLT_DecoderServer_RegisterModuleCommandMessage : public BLT_DecoderServer_Message
00260 {
00261 public:
00262
00263 BLT_DecoderServer_RegisterModuleCommandMessage(BLT_Module* module) :
00264 BLT_DecoderServer_Message(COMMAND_ID_REGISTER_MODULE),
00265 m_Module(*module) {}
00266 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00267 handler->OnRegisterModuleCommand(&m_Module);
00268 return NPT_SUCCESS;
00269 }
00270
00271 private:
00272
00273 BLT_Module m_Module;
00274 };
00275
00276
00277
00278
00279 class BLT_DecoderServer_AddNodeCommandMessage : public BLT_DecoderServer_Message
00280 {
00281 public:
00282
00283 BLT_DecoderServer_AddNodeCommandMessage(BLT_CString name) :
00284 BLT_DecoderServer_Message(COMMAND_ID_ADD_NODE),
00285 m_NodeName(name) {}
00286 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00287 handler->OnAddNodeCommand(m_NodeName);
00288 return NPT_SUCCESS;
00289 }
00290
00291 private:
00292
00293 BLT_StringObject m_NodeName;
00294 };
00295
00296
00297
00298
00299 class BLT_DecoderServer_SetPropertyCommandMessage : public BLT_DecoderServer_Message
00300 {
00301 public:
00302
00303 BLT_DecoderServer_SetPropertyCommandMessage(BLT_PropertyScope scope,
00304 const char* target,
00305 const ATX_Property& property) :
00306 BLT_DecoderServer_Message(COMMAND_ID_SET_PROPERTY),
00307 m_Scope(scope),
00308 m_Target(target),
00309 m_PropertyWrapper(property) {}
00310 NPT_Result Deliver(BLT_DecoderServer_MessageHandler* handler) {
00311 handler->OnSetPropertyCommand(m_Scope, m_Target, m_PropertyWrapper.m_Property);
00312 return NPT_SUCCESS;
00313 }
00314
00315 private:
00316
00317 BLT_PropertyScope m_Scope;
00318 NPT_String m_Target;
00319 BLT_DecoderServer_PropertyWrapper m_PropertyWrapper;
00320 };
00321
00322
00323
00324
00325 class BLT_DecoderServer;
00326 typedef struct {
00327
00328 ATX_IMPLEMENTS(BLT_EventListener);
00329
00330
00331 BLT_DecoderServer* outer;
00332 } BLT_DecoderServer_EventListenerWrapper;
00333
00334
00335
00336
00337 typedef struct {
00338
00339 ATX_IMPLEMENTS(ATX_PropertyListener);
00340
00341
00342 BLT_PropertyScope scope;
00343 const char* source;
00344 BLT_DecoderServer* outer;
00345 } BLT_DecoderServer_PropertyListenerWrapper;
00346
00347
00348
00349
00350 class BLT_DecoderServer : public NPT_Thread,
00351 public NPT_MessageReceiver,
00352 public NPT_MessageHandler,
00353 public BLT_DecoderServer_MessageHandler
00354 {
00355 public:
00356
00357 typedef enum {
00358 STATE_STOPPED,
00359 STATE_PLAYING,
00360 STATE_PAUSED,
00361 STATE_EOS
00362 } State;
00363
00364
00365 BLT_DecoderServer(NPT_MessageReceiver* client);
00366 virtual ~BLT_DecoderServer();
00367 virtual BLT_Result SetInput(BLT_CString name, BLT_CString type = NULL);
00368 virtual BLT_Result SetOutput(BLT_CString name, BLT_CString type = NULL);
00369 virtual BLT_Result Play();
00370 virtual BLT_Result Stop();
00371 virtual BLT_Result Pause();
00372 virtual BLT_Result Ping(const void* cookie);
00373 virtual BLT_Result SeekToTime(BLT_Cardinal time);
00374 virtual BLT_Result SeekToPosition(BLT_Size offset, BLT_Size range);
00375 virtual BLT_Result RegisterModule(BLT_Module* module);
00376 virtual BLT_Result AddNode(BLT_CString name);
00377 virtual BLT_Result SetProperty(BLT_PropertyScope scope,
00378 const char* target,
00379 const ATX_Property& property);
00380
00381
00382 void Run();
00383
00384
00385 void OnSetInputCommand(BLT_CString name, BLT_CString type);
00386 void OnSetOutputCommand(BLT_CString name, BLT_CString type);
00387 void OnPlayCommand();
00388 void OnStopCommand();
00389 void OnPauseCommand();
00390 void OnPingCommand(const void* cookie);
00391 void OnSeekToTimeCommand(BLT_Cardinal time);
00392 void OnSeekToPositionCommand(BLT_Size offset, BLT_Size range);
00393 void OnRegisterModuleCommand(BLT_Module* module);
00394 void OnAddNodeCommand(BLT_CString name);
00395 void OnSetPropertyCommand(BLT_PropertyScope scope,
00396 const NPT_String& target,
00397 const ATX_Property& property);
00398
00399
00400 virtual void OnEvent(const ATX_Object* source,
00401 BLT_EventType type,
00402 const BLT_Event* event);
00403
00404
00405 virtual void OnPropertyChanged(BLT_PropertyScope scope,
00406 const char* source,
00407 const char* name,
00408 ATX_PropertyType type,
00409 const ATX_PropertyValue* value);
00410
00411 private:
00412
00413 BLT_Result SendReply(BLT_DecoderServer_Message::CommandId id,
00414 BLT_Result result);
00415 BLT_Result SetState(State state);
00416 BLT_Result UpdateStatus();
00417 BLT_Result NotifyPosition();
00418 BLT_Result NotifyTimeCode();
00419
00420
00421 BLT_Decoder* m_Decoder;
00422 NPT_MessageReceiver* m_Client;
00423 NPT_MessageQueue* m_MessageQueue;
00424 BLT_Cardinal m_TimeStampUpdateQuantum;
00425 BLT_Size m_PositionUpdateRange;
00426 BLT_DecoderStatus m_DecoderStatus;
00427 State m_State;
00428
00429 BLT_DecoderServer_EventListenerWrapper m_EventListener;
00430 BLT_DecoderServer_PropertyListenerWrapper m_CorePropertyListener;
00431 BLT_DecoderServer_PropertyListenerWrapper m_StreamPropertyListener;
00432 };
00433
00434 #endif