@ -5,6 +5,8 @@
# include "ttd.h"
# include "ttd.h"
# include "hal.h"
# include "hal.h"
# include "sound.h"
# include "sound.h"
# include "string.h"
# include <fcntl.h>
# include <sys/types.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <sys/wait.h>
# include <unistd.h>
# include <unistd.h>
@ -12,89 +14,97 @@
# include <sys/stat.h>
# include <sys/stat.h>
# include <errno.h>
# include <errno.h>
static pid_t _pid ;
static struct {
char song [ MAX_PATH ] ;
int pid ;
} _midi ;
static void extmidi_kill ( void )
static void DoPlay ( void ) ;
{
static void DoStop ( void ) ;
if ( _pid > 0 ) {
kill ( _pid , SIGKILL ) ;
while ( waitpid ( _pid , NULL , WNOHANG ) ! = _pid ) ;
}
_pid = 0 ;
}
static const char * extmidi_start ( const char * const * parm )
static const char * ExtMidiStart ( const char * const * parm )
{
{
_pid = 0 ;
_midi . song [ 0 ] = ' \0 ' ;
_midi . pid = - 1 ;
return NULL ;
return NULL ;
}
}
static void extmidi_s top( void )
static void ExtMidiS top( void )
{
{
extmidi_kill ( ) ;
_midi . song [ 0 ] = ' \0 ' ;
DoStop ( ) ;
}
}
static void extmidi_play_song( const char * filename )
static void ExtMidiPlaySong( const char * filename )
{
{
extmidi_kill ( ) ;
ttd_strlcpy ( _midi . song , filename , lengthof ( _midi . song ) ) ;
DoStop ( ) ;
_pid = fork ( ) ;
}
if ( _pid < 0 ) {
fprintf ( stderr , " extmidi: couldn't fork: %s \n " , strerror ( errno ) ) ;
_pid = 0 ;
return ;
}
if ( _pid = = 0 ) {
# if defined(MIDI_ARG)
execlp ( msf . extmidi , " extmidi " , MIDI_ARG , filename , NULL ) ;
# else
execlp ( msf . extmidi , " extmidi " , filename , NULL ) ;
# endif
fprintf ( stderr , " extmidi: couldn't execl: %s \n " , strerror ( errno ) ) ;
exit ( 0 ) ;
}
usleep ( 500 ) ;
if ( _pid = = waitpid ( _pid , NULL , WNOHANG ) ) {
fprintf ( stderr , " extmidi: play song failed \n " ) ;
_pid = 0 ;
usleep ( 5000 ) ;
static void ExtMidiStopSong ( void )
}
{
_midi . song [ 0 ] = ' \0 ' ;
DoStop ( ) ;
}
}
static void extmidi_stop_so ng( void )
static bool ExtMidiIsPlaying ( void )
{
{
extmidi_kill ( ) ;
if ( _midi . pid ! = - 1 & & waitpid ( _midi . pid , NULL , WNOHANG ) = = _midi . pid )
_midi . pid = - 1 ;
if ( _midi . pid = = - 1 & & _midi . song [ 0 ] ! = ' \0 ' ) DoPlay ( ) ;
return _midi . pid ! = - 1 ;
}
}
static bool extmidi_is_playing ( void )
static void ExtMidiSetVolume ( byte vol )
{
{
if ( _pid = = 0 )
fprintf ( stderr , " extmidi: set volume not implemented \n " ) ;
return 0 ;
}
if ( waitpid ( _pid , NULL , WNOHANG ) = = _pid ) {
static void DoPlay ( void )
_pid = 0 ;
{
return 0 ;
_midi . pid = fork ( ) ;
switch ( _midi . pid ) {
case 0 : {
int d ;
close ( 0 ) ;
close ( 1 ) ;
close ( 2 ) ;
d = open ( " /dev/null " , O_RDONLY ) ;
if ( d ! = - 1 ) {
if ( dup2 ( d , 1 ) ! = - 1 & & dup2 ( d , 2 ) ! = - 1 ) {
# if defined(MIDI_ARG)
execlp ( msf . extmidi , " extmidi " , MIDI_ARG , _midi . song , NULL ) ;
# else
execlp ( msf . extmidi , " extmidi " , _midi . song , NULL ) ;
# endif
}
}
exit ( 1 ) ;
}
case - 1 :
fprintf ( stderr , " extmidi: couldn't fork: %s \n " , strerror ( errno ) ) ;
/* FALLTHROUGH */
default :
_midi . song [ 0 ] = ' \0 ' ;
break ;
}
}
return 1 ;
}
}
static void extmidi_set_volume ( byte vol )
static void DoStop( void )
{
{
fprintf ( stderr , " extmidi: set volume not implemented \n " ) ;
if ( _midi . pid ! = - 1 ) kill ( _midi . pid , SIGTERM ) ;
}
}
const HalMusicDriver _extmidi_music_driver = {
const HalMusicDriver _extmidi_music_driver = {
extmidi_start ,
ExtMidiS tart,
extmidi_stop ,
ExtMidiS top,
extmidi_play_song ,
ExtMidiPlayS ong,
extmidi_stop_song ,
ExtMidiStopS ong,
extmidi_is_playing ,
ExtMidiIsP laying,
extmidi_set_volume ,
ExtMidiSetV olume,
} ;
} ;
# endif /* __MORPHOS__ */
# endif /* __MORPHOS__ */