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