(svn r19168) -Fix: under some circumstances timidity (via extmidi) would not shut down properly causing all kinds of trouble (e.g. blocked audio output). Try harder to shut down timidity and first shut down the music so shut down order is the inverse of initialisation order. Based on a patch by Jindřich Makovička.

This commit is contained in:
rubidium 2010-02-20 17:30:22 +00:00
parent e905cb57d8
commit 9c6512ef9e
2 changed files with 29 additions and 7 deletions

View File

@ -28,12 +28,13 @@ public:
virtual ~Driver() { } virtual ~Driver() { }
/** The type of driver */
enum Type { enum Type {
DT_BEGIN = 0, DT_BEGIN = 0, ///< Helper for iteration
DT_SOUND = 0, DT_MUSIC = 0, ///< A music driver, needs to be before sound to properly shut down extmidi forked music players
DT_MUSIC, DT_SOUND, ///< A sound driver
DT_VIDEO, DT_VIDEO, ///< A video driver
DT_END, DT_END, ///< Helper for iteration
}; };
virtual const char *GetName() const = 0; virtual const char *GetName() const = 0;
@ -64,7 +65,7 @@ private:
static const char *GetDriverTypeName(Driver::Type type) static const char *GetDriverTypeName(Driver::Type type)
{ {
static const char * const driver_type_name[] = { "sound", "music", "video" }; static const char * const driver_type_name[] = { "music", "sound", "video" };
return driver_type_name[type]; return driver_type_name[type];
} }

View File

@ -15,6 +15,7 @@
#include "../string_func.h" #include "../string_func.h"
#include "../sound/sound_driver.hpp" #include "../sound/sound_driver.hpp"
#include "../video/video_driver.hpp" #include "../video/video_driver.hpp"
#include "../gfx_func.h"
#include "extmidi.h" #include "extmidi.h"
#include <fcntl.h> #include <fcntl.h>
#include <sys/types.h> #include <sys/types.h>
@ -108,7 +109,27 @@ void MusicDriver_ExtMidi::DoPlay()
void MusicDriver_ExtMidi::DoStop() void MusicDriver_ExtMidi::DoStop()
{ {
if (this->pid != -1) kill(this->pid, SIGTERM); if (this->pid <= 0) return;
/* First try to gracefully stop for about five seconds;
* 5 seconds = 5000 milliseconds, 10 ms per cycle => 500 cycles. */
for (int i = 0; i < 500; i++) {
kill(this->pid, SIGTERM);
if (waitpid(this->pid, NULL, WNOHANG) == this->pid) {
/* It has shut down, so we are done */
this->pid = -1;
return;
}
/* Wait 10 milliseconds. */
CSleep(10);
}
DEBUG(driver, 0, "extmidi: gracefully stopping failed, trying the hard way");
/* Gracefully stopping failed. Do it the hard way
* and wait till the process finally died. */
kill(this->pid, SIGKILL);
waitpid(this->pid, NULL, 0);
this->pid = -1;
} }
#endif /* __MORPHOS__ */ #endif /* __MORPHOS__ */