tron@2186: /* $Id$ */ tron@2186: rubidium@9111: /** @file driver.h Base for all drivers (video, sound, music, etc). */ 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: { glx@9260: 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: smatz@9159: /** Frees memory used for this->name smatz@9159: */ smatz@9159: virtual ~DriverFactoryBase() { smatz@9159: if (this->name == NULL) return; glx@9260: glx@9260: /* Prefix the name with driver type to make it unique */ glx@9260: char buf[32]; glx@9260: strecpy(buf, GetDriverTypeName(type), lastof(buf)); glx@9260: strecpy(buf + 5, this->name, lastof(buf)); glx@9260: glx@9260: GetDrivers().erase(buf); glx@9260: if (GetDrivers().empty()) delete &GetDrivers(); smatz@9159: free(this->name); smatz@9159: } smatz@9159: smatz@9159: /** Shuts down all active drivers smatz@9159: */ smatz@9159: static void ShutdownDrivers() smatz@9159: { smatz@9159: for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) { smatz@9159: Driver *driver = *GetActiveDriver(dt); smatz@9159: if (driver != NULL) driver->Stop(); smatz@9159: } smatz@9159: } 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 */