BltMediaNode.h

Go to the documentation of this file.
00001 /*****************************************************************
00002 |
00003 |   BlueTune - Media Node Interface
00004 |
00005 |   (c) 2002-2006 Gilles Boccon-Gibod
00006 |   Author: Gilles Boccon-Gibod (bok@bok.net)
00007 |
00008  ****************************************************************/
00013 #ifndef _BLT_MEDIA_NODE_H_
00014 #define _BLT_MEDIA_NODE_H_
00015 
00057 /*----------------------------------------------------------------------
00058 |   includes
00059 +---------------------------------------------------------------------*/
00060 #include "Atomix.h"
00061 #include "BltDefs.h"
00062 #include "BltTypes.h"
00063 #include "BltErrors.h"
00064 #include "BltModule.h"
00065 #include "BltMedia.h"
00066 #include "BltCore.h"
00067 #include "BltMediaPort.h"
00068 #include "BltStream.h"
00069 
00070 /*----------------------------------------------------------------------
00071 |   constants
00072 +---------------------------------------------------------------------*/
00073 #define BLT_ERROR_NO_SUCH_MEDIA_NODE (BLT_ERROR_BASE_MEDIA_NODE - 0)
00074 
00075 /*----------------------------------------------------------------------
00076 |   types
00077 +---------------------------------------------------------------------*/
00078 typedef enum {
00079     BLT_MEDIA_NODE_STATE_RESET,
00080     BLT_MEDIA_NODE_STATE_IDLE,
00081     BLT_MEDIA_NODE_STATE_RUNNING,
00082     BLT_MEDIA_NODE_STATE_PAUSED
00083 } BLT_MediaNodeState;
00084 
00085 typedef struct {
00086     BLT_Module* module;
00087     BLT_CString name;
00088     BLT_Flags   flags;
00089 } BLT_MediaNodeInfo;
00090 
00091 typedef struct {
00092     BLT_MediaPortInterfaceSpec input;
00093     BLT_MediaPortInterfaceSpec output;
00094 } BLT_MediaNodeSpec;
00095 
00096 struct BLT_MediaNodeConstructor {
00097     BLT_CString       name;
00098     BLT_MediaNodeSpec spec;
00099 };
00100 
00101 typedef struct {
00102     /* interfaces */
00103     ATX_IMPLEMENTS(BLT_MediaNode);
00104     ATX_IMPLEMENTS(ATX_Referenceable);
00105 
00106     /* members */
00107     BLT_Cardinal      reference_count;
00108     BLT_Core*         core;
00109     BLT_Stream*       context;
00110     BLT_MediaNodeInfo info;
00111 } BLT_BaseMediaNode;
00112 
00113 /*----------------------------------------------------------------------
00114 |   BLT_MediaNode Interface
00115 +---------------------------------------------------------------------*/
00116 ATX_BEGIN_INTERFACE_DEFINITION(BLT_MediaNode)
00117     BLT_Result (*GetInfo)(BLT_MediaNode* self, BLT_MediaNodeInfo* info);
00118     BLT_Result (*GetPortByName)(BLT_MediaNode*  self, 
00119                                 BLT_CString     name,
00120                                 BLT_MediaPort** port);
00121     BLT_Result (*Activate)(BLT_MediaNode* self, BLT_Stream* stream);
00122     BLT_Result (*Deactivate)(BLT_MediaNode* self);
00123     BLT_Result (*Start)(BLT_MediaNode* self);
00124     BLT_Result (*Stop)(BLT_MediaNode* self);
00125     BLT_Result (*Pause)(BLT_MediaNode* self);
00126     BLT_Result (*Resume)(BLT_MediaNode* self);
00127     BLT_Result (*Seek)(BLT_MediaNode* self, 
00128                        BLT_SeekMode*  mode,
00129                        BLT_SeekPoint* point);
00130 ATX_END_INTERFACE_DEFINITION
00131 
00132 /*----------------------------------------------------------------------
00133 |   convenience macros
00134 +---------------------------------------------------------------------*/
00135 #define BLT_MediaNode_GetInfo(object, info) \
00136 ATX_INTERFACE(object)->GetInfo(object, info)
00137 
00138 #define BLT_MediaNode_GetPortByName(object, name, port) \
00139 ATX_INTERFACE(object)->GetPortByName(object, name, port)
00140 
00141 #define BLT_MediaNode_Activate(object, stream) \
00142 ATX_INTERFACE(object)->Activate(object, stream)
00143 
00144 #define BLT_MediaNode_Deactivate(object) \
00145 ATX_INTERFACE(object)->Deactivate(object)
00146 
00147 #define BLT_MediaNode_Start(object) \
00148 ATX_INTERFACE(object)->Start(object)
00149 
00150 #define BLT_MediaNode_Stop(object) \
00151 ATX_INTERFACE(object)->Stop(object)
00152 
00153 #define BLT_MediaNode_Pause(object) \
00154 ATX_INTERFACE(object)->Pause(object)
00155 
00156 #define BLT_MediaNode_Resume(object) \
00157 ATX_INTERFACE(object)->Resume(object)
00158 
00159 #define BLT_MediaNode_Seek(object, mode, point) \
00160 ATX_INTERFACE(object)->Seek(object, mode, point)
00161 
00162 /*----------------------------------------------------------------------
00163 |   prototypes
00164 +---------------------------------------------------------------------*/
00165 #if defined(__cplusplus)
00166 extern "C" {
00167 #endif
00168 
00169 BLT_Result BLT_BaseMediaNode_Construct(BLT_BaseMediaNode* self,
00170                                        BLT_Module*        module,
00171                                        BLT_Core*          core);
00172 BLT_Result BLT_BaseMediaNode_Destruct(BLT_BaseMediaNode* self);
00173 BLT_Result BLT_BaseMediaNode_GetInfo(BLT_MediaNode*     self,
00174                                      BLT_MediaNodeInfo* info);
00175 BLT_Result BLT_BaseMediaNode_Activate(BLT_MediaNode* self,
00176                                       BLT_Stream*    stream);
00177 BLT_Result BLT_BaseMediaNode_Deactivate(BLT_MediaNode* self);
00178 BLT_Result BLT_BaseMediaNode_Start(BLT_MediaNode* self);
00179 BLT_Result BLT_BaseMediaNode_Stop(BLT_MediaNode* self);
00180 BLT_Result BLT_BaseMediaNode_Pause(BLT_MediaNode* self);
00181 BLT_Result BLT_BaseMediaNode_Resume(BLT_MediaNode* self);
00182 BLT_Result BLT_BaseMediaNode_Seek(BLT_MediaNode* self, 
00183                                   BLT_SeekMode*  mode,
00184                                   BLT_SeekPoint* point);
00185 
00186 #if defined(__cplusplus)
00187 }
00188 #endif
00189 
00190 /*----------------------------------------------------------------------
00191 |   template macros
00192 +---------------------------------------------------------------------*/
00193 #define BLT_MODULE_IMPLEMENT_SIMPLE_MEDIA_NODE_FACTORY(_module_type, _class)    \
00194 BLT_METHOD                                                              \
00195 _module_type##_CreateInstance(BLT_Module*        self,                  \
00196                               BLT_Core*                core,            \
00197                               BLT_ModuleParametersType parameters_type, \
00198                               BLT_AnyConst             parameters,      \
00199                               const ATX_InterfaceId*   interface_id,    \
00200                               ATX_Object**             object)          \
00201 {                                                                       \
00202     if (ATX_INTERFACE_IDS_EQUAL(interface_id,                           \
00203                                 &ATX_INTERFACE_ID__BLT_MediaNode)) {    \
00204         return _class##_Create(self,                                    \
00205                                core,                                    \
00206                                parameters_type,                         \
00207                                parameters,                              \
00208                                (BLT_MediaNode**)object);                \
00209     } else {                                                            \
00210         return BLT_ERROR_INVALID_INTERFACE;                             \
00211     }                                                                   \
00212 }                                                                       \
00213 
00214 #endif /* _BLT_MEDIA_NODE_H_ */