extmidi.c
changeset 342 c16e965ab592
parent 0 29654efe3188
child 1301 bf64ba5b6774
equal deleted inserted replaced
341:e41bddf39d9a 342:c16e965ab592
    10 #include <signal.h>
    10 #include <signal.h>
    11 #include <sys/stat.h>
    11 #include <sys/stat.h>
    12 #include <errno.h>
    12 #include <errno.h>
    13 
    13 
    14 #ifndef EXTERNAL_PLAYER
    14 #ifndef EXTERNAL_PLAYER
    15 #define EXTERNAL_PLAYER "/usr/bin/timidity"
    15 #define EXTERNAL_PLAYER "timidity"
    16 #endif
    16 #endif
    17 
    17 
    18 static pid_t _pid;
    18 static pid_t _pid;
    19 
    19 
    20 static void extmidi_kill(void) {
    20 static void extmidi_kill(void)
    21     if(_pid > 0) {
    21 {
    22         kill(_pid, SIGKILL);
    22 	if (_pid > 0) {
    23         while(waitpid(_pid, NULL, WNOHANG) != _pid);
    23 		kill(_pid, SIGKILL);
    24     }
    24 		while (waitpid(_pid, NULL, WNOHANG) != _pid);
    25     _pid = 0;
    25 	}
       
    26 	_pid = 0;
    26 }
    27 }
    27 
    28 
    28 static char *extmidi_start(char **parm) {
    29 static char *extmidi_start(char **parm)
    29     _pid = 0;
    30 {
    30 
    31 	_pid = 0;
    31     return NULL;
    32 	return NULL;
    32 }
    33 }
    33 
    34 
    34 static void extmidi_stop(void) {
    35 static void extmidi_stop(void)
    35     extmidi_kill();
    36 {
       
    37 	extmidi_kill();
    36 }
    38 }
    37 
    39 
    38 static void extmidi_play_song(const char *filename) {
    40 static void extmidi_play_song(const char *filename)
    39     extmidi_kill();
    41 {
       
    42 	extmidi_kill();
    40 
    43 
    41     _pid = fork();
    44 	_pid = fork();
    42     if(_pid < 0) {
    45 	if (_pid < 0) {
    43         fprintf(stderr, "extmidi: couldn't fork: %s\n", strerror(errno));
    46 		fprintf(stderr, "extmidi: couldn't fork: %s\n", strerror(errno));
    44         _pid = 0;
    47 		_pid = 0;
    45         return;
    48 		return;
    46     }
    49 	}
    47 
    50 
    48     if(_pid == 0) {
    51 	if (_pid == 0) {
    49         #if defined(MIDI_ARG)
    52 		#if defined(MIDI_ARG)
    50 			execl(EXTERNAL_PLAYER, "extmidi", MIDI_ARG, filename, NULL);
    53 			execlp(EXTERNAL_PLAYER, "extmidi", MIDI_ARG, filename, NULL);
    51 		#else
    54 		#else
    52 			execl(EXTERNAL_PLAYER, "extmidi", filename, NULL);
    55 			execlp(EXTERNAL_PLAYER, "extmidi", filename, NULL);
    53 		#endif
    56 		#endif
       
    57 		fprintf(stderr, "extmidi: couldn't execl: %s\n", strerror(errno));
       
    58 		exit(0);
       
    59 	}
    54 
    60 
    55         fprintf(stderr, "extmidi: couldn't execl: %s\n", strerror(errno));
    61 	usleep(500);
    56 
    62 
    57         exit(0);
    63 	if (_pid == waitpid(_pid, NULL, WNOHANG)) {
    58     }
    64 		fprintf(stderr, "extmidi: play song failed\n");
       
    65 		_pid = 0;
    59 
    66 
    60 
    67 		usleep(5000);
    61 
    68 	}
    62     usleep(500);
       
    63 
       
    64 
       
    65     if(_pid == waitpid(_pid, NULL, WNOHANG)) {
       
    66         fprintf(stderr, "extmidi: play song failed\n");
       
    67         _pid = 0;
       
    68 
       
    69     usleep(5000);
       
    70 
       
    71     }
       
    72 }
    69 }
    73 
    70 
    74 static void extmidi_stop_song(void) {
    71 static void extmidi_stop_song(void)
    75     extmidi_kill();
    72 {
       
    73 	extmidi_kill();
    76 }
    74 }
    77 
    75 
    78 static bool extmidi_is_playing(void) {
    76 static bool extmidi_is_playing(void)
    79     if(_pid == 0)
    77 {
    80         return 0;
    78 	if (_pid == 0)
       
    79 		return 0;
    81 
    80 
    82     if(waitpid(_pid, NULL, WNOHANG) == _pid) {
    81 	if (waitpid(_pid, NULL, WNOHANG) == _pid) {
    83         _pid = 0;
    82 		_pid = 0;
    84         return 0;
    83 		return 0;
    85     }
    84 	}
    86 
    85 
    87     return 1;
    86 	return 1;
    88 }
    87 }
    89 
    88 
    90 static void extmidi_set_volume(byte vol) {
    89 static void extmidi_set_volume(byte vol)
    91     fprintf(stderr, "extmidi: set volume not implemented\n");
    90 {
       
    91 	fprintf(stderr, "extmidi: set volume not implemented\n");
    92 }
    92 }
    93 
    93 
    94 const HalMusicDriver _extmidi_music_driver = {
    94 const HalMusicDriver _extmidi_music_driver = {
    95 	extmidi_start,
    95 	extmidi_start,
    96 	extmidi_stop,
    96 	extmidi_stop,
    97 	extmidi_play_song,
    97 	extmidi_play_song,
    98 	extmidi_stop_song,
    98 	extmidi_stop_song,
    99 	extmidi_is_playing,
    99 	extmidi_is_playing,
   100 	extmidi_set_volume,
   100 	extmidi_set_volume,
   101 };
   101 };
       
   102 
   102 #endif /* __MORPHOS__ */
   103 #endif /* __MORPHOS__ */
   103 #endif /* __BEOS__ */
   104 #endif /* __BEOS__ */