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