tron@2186: /* $Id$ */ tron@2186: belugas@6125: /** @file driver.h */ belugas@6125: tron@2171: #ifndef DRIVER_H tron@2171: #define DRIVER_H tron@2171: peter1138@7170: #include "debug.h" rubidium@8112: #include "core/enum_type.hpp" rubidium@8214: #include "string_func.h" peter1138@7170: #include peter1138@7170: #include tron@2171: rubidium@7318: bool GetDriverParamBool(const char * const *parm, const char *name); rubidium@7318: int GetDriverParamInt(const char * const *parm, const char *name, int def); tron@2171: peter1138@7170: class Driver { peter1138@7170: public: peter1138@7170: virtual const char *Start(const char * const *parm) = 0; peter1138@7170: peter1138@7170: virtual void Stop() = 0; peter1138@7170: peter1138@7170: virtual ~Driver() { } peter1138@7170: peter1138@7170: enum Type { peter1138@7170: DT_BEGIN = 0, peter1138@7170: DT_SOUND = 0, peter1138@7170: DT_MUSIC, peter1138@7170: DT_VIDEO, peter1138@7170: DT_END, peter1138@7170: }; peter1138@7170: }; peter1138@7170: peter1138@7170: DECLARE_POSTFIX_INCREMENT(Driver::Type); peter1138@7170: peter1138@7170: peter1138@7170: class DriverFactoryBase { peter1138@7170: private: peter1138@7170: Driver::Type type; peter1138@7170: char *name; peter1138@7193: int priority; peter1138@7170: typedef std::map Drivers; peter1138@7170: peter1138@7170: static Drivers &GetDrivers() peter1138@7170: { peter1138@7170: static Drivers &s_drivers = *new Drivers(); peter1138@7170: return s_drivers; peter1138@7170: } peter1138@7170: peter1138@7170: static Driver **GetActiveDriver(Driver::Type type) peter1138@7170: { peter1138@7170: static Driver *s_driver[3] = { NULL, NULL, NULL }; peter1138@7170: return &s_driver[type]; peter1138@7170: } peter1138@7170: peter1138@7170: static const char *GetDriverTypeName(Driver::Type type) peter1138@7170: { peter1138@7170: static const char *driver_type_name[] = { "sound", "music", "video" }; peter1138@7170: return driver_type_name[type]; peter1138@7170: } peter1138@7170: peter1138@7170: protected: smatz@8844: void RegisterDriver(const char *name, Driver::Type type, int priority); peter1138@7170: peter1138@7170: public: peter1138@7170: DriverFactoryBase() : peter1138@7170: name(NULL) peter1138@7170: {} peter1138@7170: peter1138@7170: virtual ~DriverFactoryBase() { if (this->name != NULL) GetDrivers().erase(this->name); free(this->name); } peter1138@7170: smatz@8844: static const Driver *SelectDriver(const char *name, Driver::Type type); smatz@8844: static char *GetDriversInfo(char *p, const char *last); peter1138@7170: peter1138@7170: /** peter1138@7170: * Get a nice description of the driver-class. peter1138@7170: */ peter1138@7170: virtual const char *GetDescription() = 0; peter1138@7170: peter1138@7170: /** peter1138@7170: * Create an instance of this driver-class. peter1138@7170: */ peter1138@7170: virtual Driver *CreateInstance() = 0; peter1138@7170: }; tron@2171: Darkvater@2436: #endif /* DRIVER_H */