1
0
Fork 0

Codechange: Pass a MusicSongInfo struct instead of bare filename to music drivers.

Preparation for later extending the info passed to music drivers.
pull/6816/head
Niels Martin Hansen 2018-03-17 14:51:30 +01:00 committed by Michael Lutz
parent 1c2d29e1a3
commit f946b3da56
23 changed files with 85 additions and 41 deletions

View File

@ -285,11 +285,23 @@ static const uint NUM_SONGS_AVAILABLE = 1 + NUM_SONG_CLASSES * NUM_SONGS_CLASS;
/** Maximum number of songs in the (custom) playlist */ /** Maximum number of songs in the (custom) playlist */
static const uint NUM_SONGS_PLAYLIST = 32; static const uint NUM_SONGS_PLAYLIST = 32;
enum MusicTrackType {
MTT_STANDARDMIDI, ///< Standard MIDI file
};
/** Metadata about a music track. */
struct MusicSongInfo {
char songname[32]; ///< name of song displayed in UI
byte tracknr; ///< track number of song displayed in UI
const char *filename; ///< file on disk containing song (when used in MusicSet class, this pointer is owned by MD5File object for the file)
MusicTrackType filetype; ///< decoder required for song file
};
/** All data of a music set. */ /** All data of a music set. */
struct MusicSet : BaseSet<MusicSet, NUM_SONGS_AVAILABLE, false> { struct MusicSet : BaseSet<MusicSet, NUM_SONGS_AVAILABLE, false> {
/** The name of the different songs. */ /** Data about individual songs in set. */
char song_name[NUM_SONGS_AVAILABLE][32]; MusicSongInfo songinfo[NUM_SONGS_AVAILABLE];
byte track_nr[NUM_SONGS_AVAILABLE]; /** Number of valid songs in set. */
byte num_available; byte num_available;
bool FillSetDetails(struct IniFile *ini, const char *path, const char *full_filename); bool FillSetDetails(struct IniFile *ini, const char *path, const char *full_filename);

View File

@ -66,13 +66,16 @@ bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_f
if (ret) { if (ret) {
this->num_available = 0; this->num_available = 0;
IniGroup *names = ini->GetGroup("names"); IniGroup *names = ini->GetGroup("names");
for (uint i = 0, j = 1; i < lengthof(this->song_name); i++) { for (uint i = 0, j = 1; i < lengthof(this->songinfo); i++) {
const char *filename = this->files[i].filename; const char *filename = this->files[i].filename;
if (names == NULL || StrEmpty(filename)) { if (names == NULL || StrEmpty(filename)) {
this->song_name[i][0] = '\0'; this->songinfo[i].songname[0] = '\0';
continue; continue;
} }
this->songinfo[i].filename = filename; // non-owned pointer
this->songinfo[i].filetype = MTT_STANDARDMIDI;
IniItem *item = NULL; IniItem *item = NULL;
/* As we possibly add a path to the filename and we compare /* As we possibly add a path to the filename and we compare
* on the filename with the path as in the .obm, we need to * on the filename with the path as in the .obm, we need to
@ -91,8 +94,8 @@ bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_f
return false; return false;
} }
strecpy(this->song_name[i], item->value, lastof(this->song_name[i])); strecpy(this->songinfo[i].songname, item->value, lastof(this->songinfo[i].songname));
this->track_nr[i] = j++; this->songinfo[i].tracknr = j++;
this->num_available++; this->num_available++;
} }
} }

View File

@ -58,10 +58,12 @@ void MusicDriver_Allegro::Stop()
if (--_allegro_instance_count == 0) allegro_exit(); if (--_allegro_instance_count == 0) allegro_exit();
} }
void MusicDriver_Allegro::PlaySong(const char *filename) void MusicDriver_Allegro::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
if (_midi != NULL) destroy_midi(_midi); if (_midi != NULL) destroy_midi(_midi);
_midi = load_midi(filename); _midi = load_midi(song.filename);
play_midi(_midi, false); play_midi(_midi, false);
} }

View File

@ -21,7 +21,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -12,6 +12,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "../openttd.h" #include "../openttd.h"
#include "bemidi.h" #include "bemidi.h"
#include "../base_media_base.h"
/* BeOS System Includes */ /* BeOS System Includes */
#include <MidiSynthFile.h> #include <MidiSynthFile.h>
@ -34,11 +35,13 @@ void MusicDriver_BeMidi::Stop()
midiSynthFile.UnloadFile(); midiSynthFile.UnloadFile();
} }
void MusicDriver_BeMidi::PlaySong(const char *filename) void MusicDriver_BeMidi::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
this->Stop(); this->Stop();
entry_ref midiRef; entry_ref midiRef;
get_ref_for_path(filename, &midiRef); get_ref_for_path(song.filename, &midiRef);
midiSynthFile.LoadFile(&midiRef); midiSynthFile.LoadFile(&midiRef);
midiSynthFile.Start(); midiSynthFile.Start();
} }

View File

@ -21,7 +21,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -19,6 +19,7 @@
#include "../os/macosx/macos.h" #include "../os/macosx/macos.h"
#include "cocoa_m.h" #include "cocoa_m.h"
#include "../debug.h" #include "../debug.h"
#include "../base_media_base.h"
#define Rect OTTDRect #define Rect OTTDRect
#define Point OTTDPoint #define Point OTTDPoint
@ -143,8 +144,10 @@ void MusicDriver_Cocoa::Stop()
* *
* @param filename Path to a MIDI file. * @param filename Path to a MIDI file.
*/ */
void MusicDriver_Cocoa::PlaySong(const char *filename) void MusicDriver_Cocoa::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
DEBUG(driver, 2, "cocoa_m: trying to play '%s'", filename); DEBUG(driver, 2, "cocoa_m: trying to play '%s'", filename);
this->StopSong(); this->StopSong();
@ -158,7 +161,7 @@ void MusicDriver_Cocoa::PlaySong(const char *filename)
return; return;
} }
const char *os_file = OTTD2FS(filename); const char *os_file = OTTD2FS(song.filename);
CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8*)os_file, strlen(os_file), false); CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8*)os_file, strlen(os_file), false);
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)

View File

@ -20,7 +20,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -21,6 +21,7 @@
#include "../core/mem_func.hpp" #include "../core/mem_func.hpp"
#include "../thread/thread.h" #include "../thread/thread.h"
#include "../fileio_func.h" #include "../fileio_func.h"
#include "../base_media_base.h"
#include "dmusic.h" #include "dmusic.h"
#include "midifile.hpp" #include "midifile.hpp"
#include "midi.h" #include "midi.h"
@ -1225,11 +1226,13 @@ void MusicDriver_DMusic::Stop()
} }
void MusicDriver_DMusic::PlaySong(const char *filename) void MusicDriver_DMusic::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
ThreadMutexLocker lock(_thread_mutex); ThreadMutexLocker lock(_thread_mutex);
_playback.next_file.LoadFile(filename); _playback.next_file.LoadFile(song.filename);
_playback.next_segment.start = 0; _playback.next_segment.start = 0;
_playback.next_segment.end = 0; _playback.next_segment.end = 0;
_playback.next_segment.loop = false; _playback.next_segment.loop = false;

View File

@ -23,7 +23,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -17,6 +17,7 @@
#include "../video/video_driver.hpp" #include "../video/video_driver.hpp"
#include "../gfx_func.h" #include "../gfx_func.h"
#include "extmidi.h" #include "extmidi.h"
#include "../base_media_base.h"
#include <fcntl.h> #include <fcntl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
@ -83,9 +84,11 @@ void MusicDriver_ExtMidi::Stop()
this->DoStop(); this->DoStop();
} }
void MusicDriver_ExtMidi::PlaySong(const char *filename) void MusicDriver_ExtMidi::PlaySong(const MusicSongInfo &song)
{ {
strecpy(this->song, filename, lastof(this->song)); if (song.filetype != MTT_STANDARDMIDI) return;
strecpy(this->song, song.filename, lastof(this->song));
this->DoStop(); this->DoStop();
} }

View File

@ -28,7 +28,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -14,6 +14,7 @@
#include "../sound_type.h" #include "../sound_type.h"
#include "../debug.h" #include "../debug.h"
#include "libtimidity.h" #include "libtimidity.h"
#include "../base_media_base.h"
#include <fcntl.h> #include <fcntl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
@ -73,11 +74,13 @@ void MusicDriver_LibTimidity::Stop()
mid_exit(); mid_exit();
} }
void MusicDriver_LibTimidity::PlaySong(const char *filename) void MusicDriver_LibTimidity::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
this->StopSong(); this->StopSong();
_midi.stream = mid_istream_open_file(filename); _midi.stream = mid_istream_open_file(song.filename);
if (_midi.stream == NULL) { if (_midi.stream == NULL) {
DEBUG(driver, 0, "Could not open music file"); DEBUG(driver, 0, "Could not open music file");
return; return;

View File

@ -21,7 +21,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -14,6 +14,8 @@
#include "../driver.h" #include "../driver.h"
struct MusicSongInfo;
/** Driver for all music playback. */ /** Driver for all music playback. */
class MusicDriver : public Driver { class MusicDriver : public Driver {
public: public:
@ -21,7 +23,7 @@ public:
* Play a particular song. * Play a particular song.
* @param filename The name of file with the song to play. * @param filename The name of file with the song to play.
*/ */
virtual void PlaySong(const char *filename) = 0; virtual void PlaySong(const MusicSongInfo &song) = 0;
/** /**
* Stop playing the current song. * Stop playing the current song.

View File

@ -21,7 +21,7 @@ public:
/* virtual */ void Stop() { } /* virtual */ void Stop() { }
/* virtual */ void PlaySong(const char *filename) { } /* virtual */ void PlaySong(const MusicSongInfo &song) { }
/* virtual */ void StopSong() { } /* virtual */ void StopSong() { }

View File

@ -12,6 +12,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "../openttd.h" #include "../openttd.h"
#include "os2_m.h" #include "os2_m.h"
#include "../base_media_base.h"
#define INCL_DOS #define INCL_DOS
#define INCL_OS2MM #define INCL_OS2MM
@ -49,11 +50,13 @@ static long CDECL MidiSendCommand(const char *cmd, ...)
/** OS/2's music player's factory. */ /** OS/2's music player's factory. */
static FMusicDriver_OS2 iFMusicDriver_OS2; static FMusicDriver_OS2 iFMusicDriver_OS2;
void MusicDriver_OS2::PlaySong(const char *filename) void MusicDriver_OS2::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
MidiSendCommand("close all"); MidiSendCommand("close all");
if (MidiSendCommand("open %s type sequencer alias song", filename) != 0) { if (MidiSendCommand("open %s type sequencer alias song", song.filename) != 0) {
return; return;
} }

View File

@ -21,7 +21,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -31,6 +31,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "qtmidi.h" #include "qtmidi.h"
#include "../debug.h" #include "../debug.h"
#include "../base_media_base.h"
#define Rect OTTDRect #define Rect OTTDRect
#define Point OTTDPoint #define Point OTTDPoint
@ -258,8 +259,9 @@ void MusicDriver_QtMidi::Stop()
* *
* @param filename Path to a MIDI file. * @param filename Path to a MIDI file.
*/ */
void MusicDriver_QtMidi::PlaySong(const char *filename) void MusicDriver_QtMidi::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
if (!_quicktime_started) return; if (!_quicktime_started) return;
DEBUG(driver, 2, "qtmidi: trying to play '%s'", filename); DEBUG(driver, 2, "qtmidi: trying to play '%s'", filename);
@ -276,7 +278,7 @@ void MusicDriver_QtMidi::PlaySong(const char *filename)
FALLTHROUGH; FALLTHROUGH;
case QT_STATE_IDLE: case QT_STATE_IDLE:
LoadMovieForMIDIFile(filename, &_quicktime_movie); LoadMovieForMIDIFile(song.filename, &_quicktime_movie);
SetMovieVolume(_quicktime_movie, VOLUME); SetMovieVolume(_quicktime_movie, VOLUME);
StartMovie(_quicktime_movie); StartMovie(_quicktime_movie);
_quicktime_state = QT_STATE_PLAY; _quicktime_state = QT_STATE_PLAY;

View File

@ -20,7 +20,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -18,6 +18,7 @@
#include "../debug.h" #include "../debug.h"
#include "midifile.hpp" #include "midifile.hpp"
#include "midi.h" #include "midi.h"
#include "../base_media_base.h"
#include "../safeguards.h" #include "../safeguards.h"
@ -304,12 +305,14 @@ void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DW
} }
} }
void MusicDriver_Win32::PlaySong(const char *filename) void MusicDriver_Win32::PlaySong(const MusicSongInfo &song)
{ {
if (song.filetype != MTT_STANDARDMIDI) return;
DEBUG(driver, 2, "Win32-MIDI: PlaySong: entry"); DEBUG(driver, 2, "Win32-MIDI: PlaySong: entry");
EnterCriticalSection(&_midi.lock); EnterCriticalSection(&_midi.lock);
_midi.next_file.LoadFile(filename); _midi.next_file.LoadFile(song.filename);
_midi.next_segment.start = 0; _midi.next_segment.start = 0;
_midi.next_segment.end = 0; _midi.next_segment.end = 0;
_midi.next_segment.loop = false; _midi.next_segment.loop = false;

View File

@ -21,7 +21,7 @@ public:
/* virtual */ void Stop(); /* virtual */ void Stop();
/* virtual */ void PlaySong(const char *filename); /* virtual */ void PlaySong(const MusicSongInfo &song);
/* virtual */ void StopSong(); /* virtual */ void StopSong();

View File

@ -42,7 +42,7 @@
*/ */
static const char *GetSongName(int index) static const char *GetSongName(int index)
{ {
return BaseMusic::GetUsedSet()->song_name[index]; return BaseMusic::GetUsedSet()->songinfo[index].songname;
} }
/** /**
@ -52,7 +52,7 @@ static const char *GetSongName(int index)
*/ */
static int GetTrackNumber(int index) static int GetTrackNumber(int index)
{ {
return BaseMusic::GetUsedSet()->track_nr[index]; return BaseMusic::GetUsedSet()->songinfo[index].tracknr;
} }
/** The currently played song */ /** The currently played song */
@ -186,10 +186,12 @@ static void MusicVolumeChanged(byte new_vol)
static void DoPlaySong() static void DoPlaySong()
{ {
char filename[MAX_PATH]; char filename[MAX_PATH];
if (FioFindFullPath(filename, lastof(filename), BASESET_DIR, BaseMusic::GetUsedSet()->files[_music_wnd_cursong - 1].filename) == NULL) { MusicSongInfo songinfo = BaseMusic::GetUsedSet()->songinfo[_music_wnd_cursong - 1]; // copy
FioFindFullPath(filename, lastof(filename), OLD_GM_DIR, BaseMusic::GetUsedSet()->files[_music_wnd_cursong - 1].filename); if (FioFindFullPath(filename, lastof(filename), BASESET_DIR, songinfo.filename) == NULL) {
FioFindFullPath(filename, lastof(filename), OLD_GM_DIR, songinfo.filename);
} }
MusicDriver::GetInstance()->PlaySong(filename); songinfo.filename = filename; // non-owned pointer
MusicDriver::GetInstance()->PlaySong(songinfo);
SetWindowDirty(WC_MUSIC_WINDOW, 0); SetWindowDirty(WC_MUSIC_WINDOW, 0);
} }