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_PropertyWrapper
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 |   BLT_DecoderServer_MessageHandler
00037 +---------------------------------------------------------------------*/
00038 class BLT_DecoderServer_MessageHandler
00039 {
00040 public:
00041     // methods
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 |   BLT_DecoderServer_Message
00061 +---------------------------------------------------------------------*/
00062 class BLT_DecoderServer_Message : public NPT_Message
00063 {
00064 public:
00065     // types
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     // functions
00081     static NPT_Message::Type MessageType;
00082     NPT_Message::Type GetType() {
00083         return MessageType;
00084     }
00085 
00086     // methods
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     // members
00101     CommandId m_Id;
00102 };
00103 
00104 /*----------------------------------------------------------------------
00105 |   BLT_DecoderServer_SetInputCommandMessage
00106 +---------------------------------------------------------------------*/
00107 class BLT_DecoderServer_SetInputCommandMessage :
00108     public BLT_DecoderServer_Message
00109 {
00110 public:
00111     // methods
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     // members
00123     BLT_StringObject m_Name;
00124     BLT_StringObject m_Type;
00125 };
00126 
00127 /*----------------------------------------------------------------------
00128 |   BLT_DecoderServer_SetOutputCommandMessage
00129 +---------------------------------------------------------------------*/
00130 class BLT_DecoderServer_SetOutputCommandMessage :
00131     public BLT_DecoderServer_Message
00132 {
00133 public:
00134     // methods
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     // members
00146     BLT_StringObject m_Name;
00147     BLT_StringObject m_Type;
00148 };
00149 
00150 /*----------------------------------------------------------------------
00151 |   BLT_DecoderServer_PlayCommandMessage
00152 +---------------------------------------------------------------------*/
00153 class BLT_DecoderServer_PlayCommandMessage : public BLT_DecoderServer_Message
00154 {
00155 public:
00156     // methods
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 |   BLT_DecoderServer_StopCommandMessage
00167 +---------------------------------------------------------------------*/
00168 class BLT_DecoderServer_StopCommandMessage : public BLT_DecoderServer_Message
00169 {
00170 public:
00171     // methods
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 |   BLT_DecoderServer_PauseCommandMessage
00182 +---------------------------------------------------------------------*/
00183 class BLT_DecoderServer_PauseCommandMessage : public BLT_DecoderServer_Message
00184 {
00185 public:
00186     // methods
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 |   BLT_DecoderServer_PingCommandMessage
00197 +---------------------------------------------------------------------*/
00198 class BLT_DecoderServer_PingCommandMessage : public BLT_DecoderServer_Message
00199 {
00200 public:
00201     // methods
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     // members
00211     const void* m_Cookie;
00212 };
00213 
00214 /*----------------------------------------------------------------------
00215 |   BLT_DecoderServer_SeekToTimeCommandMessage
00216 +---------------------------------------------------------------------*/
00217 class BLT_DecoderServer_SeekToTimeCommandMessage : public BLT_DecoderServer_Message
00218 {
00219 public:
00220     // methods
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     // members
00231     BLT_Cardinal m_Time;
00232 };
00233 
00234 /*----------------------------------------------------------------------
00235 |   BLT_DecoderServer_SeekToPositionCommandMessage
00236 +---------------------------------------------------------------------*/
00237 class BLT_DecoderServer_SeekToPositionCommandMessage : public BLT_DecoderServer_Message
00238 {
00239 public:
00240     // methods
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     // members
00252     BLT_Size m_Offset;
00253     BLT_Size m_Range;
00254 };
00255 
00256 /*----------------------------------------------------------------------
00257 |   BLT_DecoderServer_RegisterModuleCommandMessage
00258 +---------------------------------------------------------------------*/
00259 class BLT_DecoderServer_RegisterModuleCommandMessage : public BLT_DecoderServer_Message
00260 {
00261 public:
00262     // methods
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     // members
00273     BLT_Module m_Module;
00274 };
00275 
00276 /*----------------------------------------------------------------------
00277 |   BLT_DecoderServer_AddNodeCommandMessage
00278 +---------------------------------------------------------------------*/
00279 class BLT_DecoderServer_AddNodeCommandMessage : public BLT_DecoderServer_Message
00280 {
00281 public:
00282     // methods
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     // members
00293     BLT_StringObject m_NodeName;
00294 };
00295 
00296 /*----------------------------------------------------------------------
00297 |   BLT_DecoderServer_SetPropertyCommandMessage
00298 +---------------------------------------------------------------------*/
00299 class BLT_DecoderServer_SetPropertyCommandMessage : public BLT_DecoderServer_Message
00300 {
00301 public:
00302     // methods
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     // members
00317     BLT_PropertyScope                 m_Scope;
00318     NPT_String                        m_Target;
00319     BLT_DecoderServer_PropertyWrapper m_PropertyWrapper;
00320 };
00321 
00322 /*----------------------------------------------------------------------
00323 |   BLT_DecoderServer_EventListenerWrapper
00324 +---------------------------------------------------------------------*/
00325 class BLT_DecoderServer;
00326 typedef struct {
00327     // ATX-style interfaces
00328     ATX_IMPLEMENTS(BLT_EventListener);
00329 
00330     // back pointer
00331     BLT_DecoderServer* outer;
00332 } BLT_DecoderServer_EventListenerWrapper;
00333 
00334 /*----------------------------------------------------------------------
00335 |   BLT_DecoderServer_PropertyListenerWrapper
00336 +---------------------------------------------------------------------*/
00337 typedef struct {
00338     // ATX-style interfaces
00339     ATX_IMPLEMENTS(ATX_PropertyListener);
00340 
00341     // back pointer and scoping
00342     BLT_PropertyScope  scope;
00343     const char*        source;
00344     BLT_DecoderServer* outer;
00345 } BLT_DecoderServer_PropertyListenerWrapper;
00346 
00347 /*----------------------------------------------------------------------
00348 |   BLT_DecoderServer
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     // types
00357     typedef enum {
00358         STATE_STOPPED,
00359         STATE_PLAYING,
00360         STATE_PAUSED,
00361         STATE_EOS
00362     } State;
00363 
00364     // methods
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     // NPT_Runnable methods
00382     void Run();
00383 
00384     // BLT_DecoderServer_MessageHandler methods
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     // BLT_EventListener methods
00400     virtual void OnEvent(const ATX_Object* source,
00401                          BLT_EventType     type,
00402                          const BLT_Event*  event);
00403 
00404     // ATX_PropertyListener methods
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     // methods
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     // members
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 /* _BLT_DECODER_SERVER_H_ */