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_PropertyValueWrapper
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 |   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 NPT_String&        name,
00057                                       const ATX_PropertyValue* value) = 0;
00058 };
00059 
00060 /*----------------------------------------------------------------------
00061 |   BLT_DecoderServer_Message
00062 +---------------------------------------------------------------------*/
00063 class BLT_DecoderServer_Message : public NPT_Message
00064 {
00065 public:
00066     // types
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     // functions
00082     static NPT_Message::Type MessageType;
00083     NPT_Message::Type GetType() {
00084         return MessageType;
00085     }
00086 
00087     // methods
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     // members
00102     CommandId m_Id;
00103 };
00104 
00105 /*----------------------------------------------------------------------
00106 |   BLT_DecoderServer_SetInputCommandMessage
00107 +---------------------------------------------------------------------*/
00108 class BLT_DecoderServer_SetInputCommandMessage :
00109     public BLT_DecoderServer_Message
00110 {
00111 public:
00112     // methods
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     // members
00124     BLT_StringObject m_Name;
00125     BLT_StringObject m_Type;
00126 };
00127 
00128 /*----------------------------------------------------------------------
00129 |   BLT_DecoderServer_SetOutputCommandMessage
00130 +---------------------------------------------------------------------*/
00131 class BLT_DecoderServer_SetOutputCommandMessage :
00132     public BLT_DecoderServer_Message
00133 {
00134 public:
00135     // methods
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     // members
00147     BLT_StringObject m_Name;
00148     BLT_StringObject m_Type;
00149 };
00150 
00151 /*----------------------------------------------------------------------
00152 |   BLT_DecoderServer_PlayCommandMessage
00153 +---------------------------------------------------------------------*/
00154 class BLT_DecoderServer_PlayCommandMessage : public BLT_DecoderServer_Message
00155 {
00156 public:
00157     // methods
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 |   BLT_DecoderServer_StopCommandMessage
00168 +---------------------------------------------------------------------*/
00169 class BLT_DecoderServer_StopCommandMessage : public BLT_DecoderServer_Message
00170 {
00171 public:
00172     // methods
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 |   BLT_DecoderServer_PauseCommandMessage
00183 +---------------------------------------------------------------------*/
00184 class BLT_DecoderServer_PauseCommandMessage : public BLT_DecoderServer_Message
00185 {
00186 public:
00187     // methods
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 |   BLT_DecoderServer_PingCommandMessage
00198 +---------------------------------------------------------------------*/
00199 class BLT_DecoderServer_PingCommandMessage : public BLT_DecoderServer_Message
00200 {
00201 public:
00202     // methods
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     // members
00212     const void* m_Cookie;
00213 };
00214 
00215 /*----------------------------------------------------------------------
00216 |   BLT_DecoderServer_SeekToTimeCommandMessage
00217 +---------------------------------------------------------------------*/
00218 class BLT_DecoderServer_SeekToTimeCommandMessage : public BLT_DecoderServer_Message
00219 {
00220 public:
00221     // methods
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     // members
00232     BLT_Cardinal m_Time;
00233 };
00234 
00235 /*----------------------------------------------------------------------
00236 |   BLT_DecoderServer_SeekToPositionCommandMessage
00237 +---------------------------------------------------------------------*/
00238 class BLT_DecoderServer_SeekToPositionCommandMessage : public BLT_DecoderServer_Message
00239 {
00240 public:
00241     // methods
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     // members
00253     BLT_Size m_Offset;
00254     BLT_Size m_Range;
00255 };
00256 
00257 /*----------------------------------------------------------------------
00258 |   BLT_DecoderServer_RegisterModuleCommandMessage
00259 +---------------------------------------------------------------------*/
00260 class BLT_DecoderServer_RegisterModuleCommandMessage : public BLT_DecoderServer_Message
00261 {
00262 public:
00263     // methods
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     // members
00274     BLT_Module m_Module;
00275 };
00276 
00277 /*----------------------------------------------------------------------
00278 |   BLT_DecoderServer_AddNodeCommandMessage
00279 +---------------------------------------------------------------------*/
00280 class BLT_DecoderServer_AddNodeCommandMessage : public BLT_DecoderServer_Message
00281 {
00282 public:
00283     // methods
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     // members
00294     BLT_StringObject m_NodeName;
00295 };
00296 
00297 /*----------------------------------------------------------------------
00298 |   BLT_DecoderServer_SetPropertyCommandMessage
00299 +---------------------------------------------------------------------*/
00300 class BLT_DecoderServer_SetPropertyCommandMessage : public BLT_DecoderServer_Message
00301 {
00302 public:
00303     // methods
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     // members
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 |   BLT_DecoderServer_EventListenerWrapper
00328 +---------------------------------------------------------------------*/
00329 class BLT_DecoderServer;
00330 typedef struct {
00331     // ATX-style interfaces
00332     ATX_IMPLEMENTS(BLT_EventListener);
00333 
00334     // back pointer
00335     BLT_DecoderServer* outer;
00336 } BLT_DecoderServer_EventListenerWrapper;
00337 
00338 /*----------------------------------------------------------------------
00339 |   BLT_DecoderServer_PropertyListenerWrapper
00340 +---------------------------------------------------------------------*/
00341 typedef struct {
00342     // ATX-style interfaces
00343     ATX_IMPLEMENTS(ATX_PropertyListener);
00344 
00345     // back pointer and scoping
00346     BLT_PropertyScope  scope;
00347     const char*        source;
00348     BLT_DecoderServer* outer;
00349 } BLT_DecoderServer_PropertyListenerWrapper;
00350 
00351 /*----------------------------------------------------------------------
00352 |   BLT_DecoderServer
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     // types
00361     typedef enum {
00362         STATE_STOPPED,
00363         STATE_PLAYING,
00364         STATE_PAUSED,
00365         STATE_EOS
00366     } State;
00367 
00368     // methods
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     // NPT_Runnable methods
00387     void Run();
00388 
00389     // BLT_DecoderServer_MessageHandler methods
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     // BLT_EventListener methods
00406     virtual void OnEvent(const ATX_Object* source,
00407                          BLT_EventType     type,
00408                          const BLT_Event*  event);
00409 
00410     // ATX_PropertyListener methods
00411     virtual void OnPropertyChanged(BLT_PropertyScope        scope,
00412                                    const char*              source,
00413                                    const char*              name,
00414                                    const ATX_PropertyValue* value);
00415 
00416  private:
00417     // methods
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     // members
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 /* _BLT_DECODER_SERVER_H_ */