BltDecoderServer.h

00001 /*****************************************************************
00002 |
00003 |   BlueTune - Async Layer
00004 |
00005 |   (c) 2002-2006 Gilles Boccon-Gibod
00006 |   Author: Gilles Boccon-Gibod (bok@bok.net)
00007 |
00008  ****************************************************************/
00009 
00010 #ifndef _BLT_DECODER_SERVER_H_
00011 #define _BLT_DECODER_SERVER_H_
00012 
00013 /*----------------------------------------------------------------------
00014 |   includes
00015 +---------------------------------------------------------------------*/
00016 #include "Neptune.h"
00017 #include "BltDecoder.h"
00018 
00019 /*----------------------------------------------------------------------
00020 |   constants
00021 +---------------------------------------------------------------------*/
00022 const BLT_Size BLT_DECODER_SERVER_DEFAULT_POSITION_UPDATE_RANGE = 400;
00023 
00024 /*----------------------------------------------------------------------
00025 |   BLT_DecoderServer_MessageHandler
00026 +---------------------------------------------------------------------*/
00027 class BLT_DecoderServer_MessageHandler
00028 {
00029 public:
00030     // methods
00031     virtual ~BLT_DecoderServer_MessageHandler() {}
00032 
00033     virtual void OnSetInputCommand(BLT_CString /*name*/, BLT_CString /*type*/) {}
00034     virtual void OnSetOutputCommand(BLT_CString /*name*/, BLT_CString /*type*/) {}
00035     virtual void OnPlayCommand()  {}
00036     virtual void OnStopCommand()  {}
00037     virtual void OnPauseCommand() {}
00038     virtual void OnPingCommand(const void* /*cookie*/) {}
00039     virtual void OnSeekToTimeCommand(BLT_Cardinal /*time*/) {}
00040     virtual void OnSeekToPositionCommand(BLT_Size /*offset*/, BLT_Size /*range*/) {}
00041     virtual void OnRegisterModuleCommand(const BLT_Module* /*module*/) {}
00042     virtual void OnAddNodeCommand(BLT_CString /*name*/) {}
00043     virtual void OnSetPropertyCommand(BLT_CString              /* name  */, 
00044                                       ATX_PropertyType         /* type  */,
00045                                       const ATX_PropertyValue* /* value */) {}
00046 };
00047 
00048 /*----------------------------------------------------------------------
00049 |   BLT_DecoderServer_Message
00050 +---------------------------------------------------------------------*/
00051 class BLT_DecoderServer_Message : public NPT_Message
00052 {
00053 public:
00054     // types
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     // functions
00070     static NPT_Message::Type MessageType;
00071     NPT_Message::Type GetType() {
00072         return MessageType;
00073     }
00074 
00075     // methods
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     // members
00090     CommandId m_Id;
00091 };
00092 
00093 /*----------------------------------------------------------------------
00094 |   BLT_DecoderServer_SetInputCommandMessage
00095 +---------------------------------------------------------------------*/
00096 class BLT_DecoderServer_SetInputCommandMessage :
00097     public BLT_DecoderServer_Message
00098 {
00099 public:
00100     // methods
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     // members
00112     BLT_StringObject m_Name;
00113     BLT_StringObject m_Type;
00114 };
00115 
00116 /*----------------------------------------------------------------------
00117 |   BLT_DecoderServer_SetOutputCommandMessage
00118 +---------------------------------------------------------------------*/
00119 class BLT_DecoderServer_SetOutputCommandMessage :
00120     public BLT_DecoderServer_Message
00121 {
00122 public:
00123     // methods
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     // members
00135     BLT_StringObject m_Name;
00136     BLT_StringObject m_Type;
00137 };
00138 
00139 /*----------------------------------------------------------------------
00140 |   BLT_DecoderServer_PlayCommandMessage
00141 +---------------------------------------------------------------------*/
00142 class BLT_DecoderServer_PlayCommandMessage : public BLT_DecoderServer_Message
00143 {
00144 public:
00145     // methods
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 |   BLT_DecoderServer_StopCommandMessage
00156 +---------------------------------------------------------------------*/
00157 class BLT_DecoderServer_StopCommandMessage : public BLT_DecoderServer_Message
00158 {
00159 public:
00160     // methods
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 |   BLT_DecoderServer_PauseCommandMessage
00171 +---------------------------------------------------------------------*/
00172 class BLT_DecoderServer_PauseCommandMessage : public BLT_DecoderServer_Message
00173 {
00174 public:
00175     // methods
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 |   BLT_DecoderServer_PingCommandMessage
00186 +---------------------------------------------------------------------*/
00187 class BLT_DecoderServer_PingCommandMessage : public BLT_DecoderServer_Message
00188 {
00189 public:
00190     // methods
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     // members
00200     const void* m_Cookie;
00201 };
00202 
00203 /*----------------------------------------------------------------------
00204 |   BLT_DecoderServer_SeekToTimeCommandMessage
00205 +---------------------------------------------------------------------*/
00206 class BLT_DecoderServer_SeekToTimeCommandMessage : public BLT_DecoderServer_Message
00207 {
00208 public:
00209     // methods
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     // members
00220     BLT_Cardinal m_Time;
00221 };
00222 
00223 /*----------------------------------------------------------------------
00224 |   BLT_DecoderServer_SeekToPositionCommandMessage
00225 +---------------------------------------------------------------------*/
00226 class BLT_DecoderServer_SeekToPositionCommandMessage : public BLT_DecoderServer_Message
00227 {
00228 public:
00229     // methods
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     // members
00241     BLT_Size m_Offset;
00242     BLT_Size m_Range;
00243 };
00244 
00245 /*----------------------------------------------------------------------
00246 |   BLT_DecoderServer_RegisterModuleCommandMessage
00247 +---------------------------------------------------------------------*/
00248 class BLT_DecoderServer_RegisterModuleCommandMessage : public BLT_DecoderServer_Message
00249 {
00250 public:
00251     // methods
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     // members
00262     BLT_Module m_Module;
00263 };
00264 
00265 /*----------------------------------------------------------------------
00266 |   BLT_DecoderServer_AddNodeCommandMessage
00267 +---------------------------------------------------------------------*/
00268 class BLT_DecoderServer_AddNodeCommandMessage : public BLT_DecoderServer_Message
00269 {
00270 public:
00271     // methods
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     // members
00282     BLT_StringObject m_NodeName;
00283 };
00284 
00285 /*----------------------------------------------------------------------
00286 |   BLT_DecoderServer_SetPropertyMessage
00287 +---------------------------------------------------------------------*/
00288 class BLT_DecoderServer_SetPropertyMessage : public BLT_DecoderServer_Message
00289 {
00290 public:
00291     // methods
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     // members
00303     BLT_StringObject  m_Name;
00304     ATX_PropertyType  m_Type;
00305     ATX_PropertyValue m_Value;
00306 };
00307 
00308 /*----------------------------------------------------------------------
00309 |   BLT_DecoderServer_EventListenerWrapper
00310 +---------------------------------------------------------------------*/
00311 class BLT_DecoderServer;
00312 typedef struct {
00313     // ATX-style interfaces
00314     ATX_IMPLEMENTS(BLT_EventListener);
00315 
00316     // back pointer
00317     BLT_DecoderServer* outer;
00318 } BLT_DecoderServer_EventListenerWrapper;
00319  
00320 /*----------------------------------------------------------------------
00321 |   BLT_DecoderServer
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     // types
00330     typedef enum {
00331         STATE_STOPPED,
00332         STATE_PLAYING,
00333         STATE_PAUSED,
00334         STATE_EOS
00335     } State;
00336 
00337     // methods
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     // NPT_Runnable methods
00355     void Run();
00356 
00357     // BLT_DecoderServer_MessageHandler methods
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     // BLT_EventListener methods
00373     virtual BLT_Result OnEvent(const ATX_Object* source,
00374                                BLT_EventType     type,
00375                                const BLT_Event*  event);
00376 
00377  private:
00378     // methods
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     // members
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 /* _BLT_DECODER_SERVER_H_ */