changeset 11525:bbb51b4fef13 draft

(svn r15886) -Fix [FS#2770]: libtimidity cannot handle frees of NULL (in contrast of most other frees)
author rubidium <rubidium@openttd.org>
date Sun, 29 Mar 2009 10:52:54 +0000
parents 420a4f0b4e0b
children aea3c6ad1ab4
files src/music/libtimidity.cpp
diffstat 1 files changed, 8 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/music/libtimidity.cpp
+++ b/src/music/libtimidity.cpp
@@ -50,6 +50,7 @@
 const char *MusicDriver_LibTimidity::Start(const char * const *param)
 {
 	_midi.status = MIDI_STOPPED;
+	_midi.song = NULL;
 
 	if (mid_init(param == NULL ? NULL : (char *)param[0]) < 0) {
 		/* If init fails, it can be because no configuration was found.
@@ -81,15 +82,14 @@
 
 void MusicDriver_LibTimidity::Stop()
 {
-	if (_midi.status == MIDI_PLAYING) {
-		_midi.status = MIDI_STOPPED;
-		mid_song_free(_midi.song);
-	}
+	if (_midi.status == MIDI_PLAYING) this->StopSong();
 	mid_exit();
 }
 
 void MusicDriver_LibTimidity::PlaySong(const char *filename)
 {
+	this->StopSong();
+
 	_midi.stream = mid_istream_open_file(filename);
 	if (_midi.stream == NULL) {
 		DEBUG(driver, 0, "Could not open music file");
@@ -112,7 +112,9 @@
 void MusicDriver_LibTimidity::StopSong()
 {
 	_midi.status = MIDI_STOPPED;
-	mid_song_free(_midi.song);
+	/* mid_song_free cannot handle NULL! */
+	if (_midi.song != NULL) mid_song_free(_midi.song);
+	_midi.song = NULL;
 }
 
 bool MusicDriver_LibTimidity::IsSongPlaying()
@@ -130,6 +132,5 @@
 
 void MusicDriver_LibTimidity::SetVolume(byte vol)
 {
-	if (_midi.song != NULL)
-		mid_song_set_volume(_midi.song, vol);
+	if (_midi.song != NULL) mid_song_set_volume(_midi.song, vol);
 }