1
0
Fork 0

Codechange: Use unique_ptr to manage drivers.

pull/13909/head
Peter Nelson 2025-03-26 23:54:55 +00:00 committed by Peter Nelson
parent c3457cd4c0
commit d95422561b
27 changed files with 38 additions and 43 deletions

View File

@ -139,20 +139,18 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
FioFOpenFile(HWACCELERATION_TEST_FILE, "w", BASE_DIR);
}
Driver *oldd = *GetActiveDriver(type);
Driver *newd = d->CreateInstance();
*GetActiveDriver(type) = newd;
/* Keep old driver in case we need to switch back, or may still need to process an OS callback. */
auto oldd = std::move(GetActiveDriver(type));
GetActiveDriver(type) = d->CreateInstance();
auto err = newd->Start({});
auto err = GetActiveDriver(type)->Start({});
if (!err) {
Debug(driver, 1, "Successfully probed {} driver '{}'", GetDriverTypeName(type), d->name);
delete oldd;
return true;
}
*GetActiveDriver(type) = oldd;
GetActiveDriver(type) = std::move(oldd);
Debug(driver, 1, "Probing {} driver '{}' failed with error: {}", GetDriverTypeName(type), d->name, *err);
delete newd;
if (type == Driver::DT_VIDEO && _video_hw_accel && d->UsesHardwareAcceleration()) {
_video_hw_accel = false;
@ -185,17 +183,14 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
if (!StrEqualsIgnoreCase(dname, d->name)) continue;
/* Found our driver, let's try it */
Driver *newd = d->CreateInstance();
auto newd = d->CreateInstance();
auto err = newd->Start(parms);
if (err) {
delete newd;
UserError("Unable to load driver '{}'. The error was: {}", d->name, *err);
}
Debug(driver, 1, "Successfully loaded {} driver '{}'", GetDriverTypeName(type), d->name);
delete *GetActiveDriver(type);
*GetActiveDriver(type) = newd;
GetActiveDriver(type) = std::move(newd);
return true;
}
UserError("No such {} driver: {}\n", GetDriverTypeName(type), dname);

View File

@ -81,10 +81,10 @@ private:
* @param type The type to get the driver for.
* @return The active driver.
*/
static Driver **GetActiveDriver(Driver::Type type)
static std::unique_ptr<Driver> &GetActiveDriver(Driver::Type type)
{
static Driver *s_driver[3] = { nullptr, nullptr, nullptr };
return &s_driver[type];
static std::array<std::unique_ptr<Driver>, Driver::DT_END> s_driver{};
return s_driver[type];
}
/**
@ -123,7 +123,7 @@ public:
static void ShutdownDrivers()
{
for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) {
Driver *driver = *GetActiveDriver(dt);
auto &driver = GetActiveDriver(dt);
if (driver != nullptr) driver->Stop();
}
}
@ -144,7 +144,7 @@ public:
* Create an instance of this driver-class.
* @return The instance.
*/
virtual Driver *CreateInstance() const = 0;
virtual std::unique_ptr<Driver> CreateInstance() const = 0;
};
#endif /* DRIVER_H */

View File

@ -41,7 +41,7 @@ public:
static const int PRIORITY = 2;
#endif
FMusicDriver_Allegro() : DriverFactoryBase(Driver::DT_MUSIC, PRIORITY, "allegro", "Allegro MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Allegro(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Allegro>(); }
};
#endif /* MUSIC_ALLEGRO_H */

View File

@ -41,7 +41,7 @@ private:
class FMusicDriver_BeMidi : public DriverFactoryBase {
public:
FMusicDriver_BeMidi() : DriverFactoryBase(Driver::DT_MUSIC, 10, "bemidi", "BeOS MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_BeMidi(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_BeMidi>(); }
};
#endif /* MUSIC_BEMIDI_H */

View File

@ -31,7 +31,7 @@ public:
class FMusicDriver_Cocoa : public DriverFactoryBase {
public:
FMusicDriver_Cocoa() : DriverFactoryBase(Driver::DT_MUSIC, 10, "cocoa", "Cocoa MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Cocoa(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Cocoa>(); }
};
#endif /* MUSIC_MACOSX_COCOA_H */

View File

@ -35,7 +35,7 @@ public:
class FMusicDriver_DMusic : public DriverFactoryBase {
public:
FMusicDriver_DMusic() : DriverFactoryBase(Driver::DT_MUSIC, 10, "dmusic", "DirectMusic MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_DMusic(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_DMusic>(); }
};
#endif /* MUSIC_DMUSIC_H */

View File

@ -39,7 +39,7 @@ public:
class FMusicDriver_ExtMidi : public DriverFactoryBase {
public:
FMusicDriver_ExtMidi() : DriverFactoryBase(Driver::DT_MUSIC, 3, "extmidi", "External MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_ExtMidi(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_ExtMidi>(); }
};
#endif /* MUSIC_EXTERNAL_H */

View File

@ -33,7 +33,7 @@ public:
class FMusicDriver_FluidSynth : public DriverFactoryBase {
public:
FMusicDriver_FluidSynth() : DriverFactoryBase(Driver::DT_MUSIC, 5, "fluidsynth", "FluidSynth MIDI Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_FluidSynth(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_FluidSynth>(); }
};
#endif /* MUSIC_FLUIDSYNTH_H */

View File

@ -45,7 +45,7 @@ public:
*/
static MusicDriver *GetInstance()
{
return static_cast<MusicDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_MUSIC));
return static_cast<MusicDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_MUSIC).get());
}
};

View File

@ -33,7 +33,7 @@ public:
class FMusicDriver_Null : public DriverFactoryBase {
public:
FMusicDriver_Null() : DriverFactoryBase(Driver::DT_MUSIC, 1, "null", "Null Music Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Null(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Null>(); }
};
#endif /* MUSIC_NULL_H */

View File

@ -33,7 +33,7 @@ public:
class FMusicDriver_Win32 : public DriverFactoryBase {
public:
FMusicDriver_Win32() : DriverFactoryBase(Driver::DT_MUSIC, 5, "win32", "Win32 Music Driver") {}
Driver *CreateInstance() const override { return new MusicDriver_Win32(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Win32>(); }
};
#endif /* MUSIC_WIN32_H */

View File

@ -27,7 +27,7 @@ public:
class FSoundDriver_Allegro : public DriverFactoryBase {
public:
FSoundDriver_Allegro() : DriverFactoryBase(Driver::DT_SOUND, 4, "allegro", "Allegro Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_Allegro(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Allegro>(); }
};
#endif /* SOUND_ALLEGRO_H */

View File

@ -23,7 +23,7 @@ public:
class FSoundDriver_Cocoa : public DriverFactoryBase {
public:
FSoundDriver_Cocoa() : DriverFactoryBase(Driver::DT_SOUND, 10, "cocoa", "Cocoa Sound Driver (param hz)") {}
Driver *CreateInstance() const override { return new SoundDriver_Cocoa(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Cocoa>(); }
};
#endif /* SOUND_COCOA_H */

View File

@ -26,7 +26,7 @@ public:
class FSoundDriver_Null : public DriverFactoryBase {
public:
FSoundDriver_Null() : DriverFactoryBase(Driver::DT_SOUND, 1, "null", "Null Sound Driver") {}
Driver *CreateInstance() const override { return new SoundDriver_Null(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Null>(); }
};
#endif /* SOUND_NULL_H */

View File

@ -25,7 +25,7 @@ public:
class FSoundDriver_SDL : public DriverFactoryBase {
public:
FSoundDriver_SDL() : DriverFactoryBase(Driver::DT_SOUND, 5, "sdl", "SDL Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_SDL(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_SDL>(); }
};
#endif /* SOUND_SDL_H */

View File

@ -34,7 +34,7 @@ public:
*/
static SoundDriver *GetInstance()
{
return static_cast<SoundDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_SOUND));
return static_cast<SoundDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_SOUND).get());
}
};

View File

@ -25,7 +25,7 @@ public:
class FSoundDriver_Win32 : public DriverFactoryBase {
public:
FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 9, "win32", "Win32 WaveOut Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_Win32(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Win32>(); }
};
#endif /* SOUND_WIN32_H */

View File

@ -25,7 +25,7 @@ public:
class FSoundDriver_XAudio2 : public DriverFactoryBase {
public:
FSoundDriver_XAudio2() : DriverFactoryBase(Driver::DT_SOUND, 10, "xaudio2", "XAudio2 Sound Driver (param hz,samples)") {}
Driver *CreateInstance() const override { return new SoundDriver_XAudio2(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_XAudio2>(); }
};
#endif /* SOUND_XAUDIO2_H */

View File

@ -46,7 +46,7 @@ protected:
class FVideoDriver_Allegro : public DriverFactoryBase {
public:
FVideoDriver_Allegro() : DriverFactoryBase(Driver::DT_VIDEO, 4, "allegro", "Allegro Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Allegro(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Allegro>(); }
};
#endif /* VIDEO_ALLEGRO_H */

View File

@ -58,7 +58,7 @@ protected:
class FVideoDriver_CocoaOpenGL : public DriverFactoryBase {
public:
FVideoDriver_CocoaOpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 9, "cocoa-opengl", "Cocoa OpenGL Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_CocoaOpenGL(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_CocoaOpenGL>(); }
protected:
bool UsesHardwareAcceleration() const override { return true; }

View File

@ -129,7 +129,7 @@ protected:
class FVideoDriver_CocoaQuartz : public DriverFactoryBase {
public:
FVideoDriver_CocoaQuartz() : DriverFactoryBase(Driver::DT_VIDEO, 8, "cocoa", "Cocoa Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_CocoaQuartz(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_CocoaQuartz>(); }
};
#endif /* VIDEO_COCOA_H */

View File

@ -41,7 +41,7 @@ public:
static const int PRIORITY = 0;
#endif
FVideoDriver_Dedicated() : DriverFactoryBase(Driver::DT_VIDEO, PRIORITY, "dedicated", "Dedicated Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Dedicated(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Dedicated>(); }
};
#endif /* VIDEO_DEDICATED_H */

View File

@ -37,7 +37,7 @@ public:
class FVideoDriver_Null : public DriverFactoryBase {
public:
FVideoDriver_Null() : DriverFactoryBase(Driver::DT_VIDEO, 0, "null", "Null Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Null(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Null>(); }
};
#endif /* VIDEO_NULL_H */

View File

@ -33,7 +33,7 @@ private:
class FVideoDriver_SDL_Default : public DriverFactoryBase {
public:
FVideoDriver_SDL_Default() : DriverFactoryBase(Driver::DT_VIDEO, 5, "sdl", "SDL Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_SDL_Default(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_SDL_Default>(); }
};
#endif /* VIDEO_SDL2_DEFAULT_H */

View File

@ -52,7 +52,7 @@ private:
class FVideoDriver_SDL_OpenGL : public DriverFactoryBase {
public:
FVideoDriver_SDL_OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 8, "sdl-opengl", "SDL OpenGL Video Driver") {}
/* virtual */ Driver *CreateInstance() const override { return new VideoDriver_SDL_OpenGL(); }
/* virtual */ std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_SDL_OpenGL>(); }
protected:
bool UsesHardwareAcceleration() const override { return true; }

View File

@ -200,7 +200,7 @@ public:
*/
static VideoDriver *GetInstance()
{
return static_cast<VideoDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO));
return static_cast<VideoDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO).get());
}
static std::string GetCaption();

View File

@ -110,7 +110,7 @@ public:
class FVideoDriver_Win32GDI : public DriverFactoryBase {
public:
FVideoDriver_Win32GDI() : DriverFactoryBase(Driver::DT_VIDEO, 9, "win32", "Win32 GDI Video Driver") {}
Driver *CreateInstance() const override { return new VideoDriver_Win32GDI(); }
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Win32GDI>(); }
};
#ifdef WITH_OPENGL
@ -168,7 +168,7 @@ protected:
class FVideoDriver_Win32OpenGL : public DriverFactoryBase {
public:
FVideoDriver_Win32OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 10, "win32-opengl", "Win32 OpenGL Video Driver") {}
/* virtual */ Driver *CreateInstance() const override { return new VideoDriver_Win32OpenGL(); }
/* virtual */ std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Win32OpenGL>(); }
protected:
bool UsesHardwareAcceleration() const override { return true; }