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__ */ |