tron@2186: /* $Id$ */ tron@2186: rubidium@10429: /** @file driver.h Base for all drivers (video, sound, music, etc). */ belugas@6451: tron@2171: #ifndef DRIVER_H tron@2171: #define DRIVER_H tron@2171: peter1138@7666: #include "debug.h" rubidium@8608: #include "core/enum_type.hpp" rubidium@8710: #include "string_func.h" peter1138@7666: #include tron@2171: rubidium@7814: bool GetDriverParamBool(const char * const *parm, const char *name); rubidium@7814: int GetDriverParamInt(const char * const *parm, const char *name, int def); tron@2171: peter1138@7666: class Driver { peter1138@7666: public: peter1138@7666: virtual const char *Start(const char * const *parm) = 0; peter1138@7666: peter1138@7666: virtual void Stop() = 0; peter1138@7666: peter1138@7666: virtual ~Driver() { } peter1138@7666: peter1138@7666: enum Type { peter1138@7666: DT_BEGIN = 0, peter1138@7666: DT_SOUND = 0, peter1138@7666: DT_MUSIC, peter1138@7666: DT_VIDEO, peter1138@7666: DT_END, peter1138@7666: }; peter1138@7666: }; peter1138@7666: peter1138@7666: DECLARE_POSTFIX_INCREMENT(Driver::Type); peter1138@7666: peter1138@7666: peter1138@7666: class DriverFactoryBase { peter1138@7666: private: peter1138@7666: Driver::Type type; smatz@11062: const char *name; peter1138@7689: int priority; smatz@11062: smatz@11062: struct StringCompare { smatz@11062: bool operator () (const char *a, const char *b) const smatz@11062: { smatz@11062: return strcmp(a, b) < 0; smatz@11062: } smatz@11062: }; smatz@11062: smatz@11062: typedef std::map Drivers; peter1138@7666: peter1138@7666: static Drivers &GetDrivers() peter1138@7666: { glx@10582: static Drivers &s_drivers = *new Drivers(); peter1138@7666: return s_drivers; peter1138@7666: } peter1138@7666: peter1138@7666: static Driver **GetActiveDriver(Driver::Type type) peter1138@7666: { peter1138@7666: static Driver *s_driver[3] = { NULL, NULL, NULL }; peter1138@7666: return &s_driver[type]; peter1138@7666: } peter1138@7666: peter1138@7666: static const char *GetDriverTypeName(Driver::Type type) peter1138@7666: { peter1138@7666: static const char *driver_type_name[] = { "sound", "music", "video" }; peter1138@7666: return driver_type_name[type]; peter1138@7666: } peter1138@7666: peter1138@7666: protected: smatz@9340: void RegisterDriver(const char *name, Driver::Type type, int priority); peter1138@7666: peter1138@7666: public: peter1138@7666: DriverFactoryBase() : peter1138@7666: name(NULL) peter1138@7666: {} peter1138@7666: smatz@10911: virtual ~DriverFactoryBase(); smatz@10479: smatz@10479: /** Shuts down all active drivers smatz@10479: */ smatz@10479: static void ShutdownDrivers() smatz@10479: { smatz@10479: for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) { smatz@10479: Driver *driver = *GetActiveDriver(dt); smatz@10479: if (driver != NULL) driver->Stop(); smatz@10479: } smatz@10479: } peter1138@7666: smatz@9340: static const Driver *SelectDriver(const char *name, Driver::Type type); smatz@9340: static char *GetDriversInfo(char *p, const char *last); peter1138@7666: peter1138@7666: /** peter1138@7666: * Get a nice description of the driver-class. peter1138@7666: */ peter1138@7666: virtual const char *GetDescription() = 0; peter1138@7666: peter1138@7666: /** peter1138@7666: * Create an instance of this driver-class. peter1138@7666: */ peter1138@7666: virtual Driver *CreateInstance() = 0; peter1138@7666: }; tron@2171: Darkvater@2436: #endif /* DRIVER_H */