equal
deleted
inserted
replaced
9 bool stop_song; |
9 bool stop_song; |
10 bool terminate; |
10 bool terminate; |
11 bool playing; |
11 bool playing; |
12 int new_vol; |
12 int new_vol; |
13 HANDLE wait_obj; |
13 HANDLE wait_obj; |
|
14 HANDLE thread; |
14 UINT_PTR devid; |
15 UINT_PTR devid; |
15 char start_song[260]; |
16 char start_song[260]; |
16 } _midi; |
17 } _midi; |
17 |
18 |
18 static FMusicDriver_Win32 iFMusicDriver_Win32; |
19 static FMusicDriver_Win32 iFMusicDriver_Win32; |
82 return strcmp(buf, "playing") == 0 || strcmp(buf, "seeking") == 0; |
83 return strcmp(buf, "playing") == 0 || strcmp(buf, "seeking") == 0; |
83 } |
84 } |
84 |
85 |
85 static DWORD WINAPI MidiThread(LPVOID arg) |
86 static DWORD WINAPI MidiThread(LPVOID arg) |
86 { |
87 { |
87 _midi.wait_obj = CreateEvent(NULL, FALSE, FALSE, NULL); |
|
88 |
|
89 do { |
88 do { |
90 char *s; |
89 char *s; |
91 int vol; |
90 int vol; |
92 |
91 |
93 vol = _midi.new_vol; |
92 vol = _midi.new_vol; |
100 if (s[0] != '\0') { |
99 if (s[0] != '\0') { |
101 _midi.playing = MidiIntPlaySong(s); |
100 _midi.playing = MidiIntPlaySong(s); |
102 s[0] = '\0'; |
101 s[0] = '\0'; |
103 |
102 |
104 // Delay somewhat in case we don't manage to play. |
103 // Delay somewhat in case we don't manage to play. |
105 if (!_midi.playing) Sleep(5000); |
104 if (!_midi.playing) WaitForMultipleObjects(1, &_midi.wait_obj, FALSE, 5000); |
106 } |
105 } |
107 |
106 |
108 if (_midi.stop_song && _midi.playing) { |
107 if (_midi.stop_song && _midi.playing) { |
109 _midi.stop_song = false; |
108 _midi.stop_song = false; |
110 _midi.playing = false; |
109 _midi.playing = false; |
114 if (_midi.playing && !MidiIntIsSongPlaying()) _midi.playing = false; |
113 if (_midi.playing && !MidiIntIsSongPlaying()) _midi.playing = false; |
115 |
114 |
116 WaitForMultipleObjects(1, &_midi.wait_obj, FALSE, 1000); |
115 WaitForMultipleObjects(1, &_midi.wait_obj, FALSE, 1000); |
117 } while (!_midi.terminate); |
116 } while (!_midi.terminate); |
118 |
117 |
119 DeleteObject(_midi.wait_obj); |
118 MidiIntStopSong(); |
120 return 0; |
119 return 0; |
121 } |
120 } |
122 |
121 |
123 const char *MusicDriver_Win32::Start(const char * const *parm) |
122 const char *MusicDriver_Win32::Start(const char * const *parm) |
124 { |
123 { |
125 MIDIOUTCAPS midicaps; |
124 MIDIOUTCAPS midicaps; |
126 DWORD threadId; |
|
127 UINT nbdev; |
125 UINT nbdev; |
128 UINT_PTR dev; |
126 UINT_PTR dev; |
129 char buf[16]; |
127 char buf[16]; |
130 |
128 |
131 mciSendStringA("capability sequencer has audio", buf, lengthof(buf), 0); |
129 mciSendStringA("capability sequencer has audio", buf, lengthof(buf), 0); |
141 _midi.devid = dev; |
139 _midi.devid = dev; |
142 break; |
140 break; |
143 } |
141 } |
144 } |
142 } |
145 |
143 |
146 if (CreateThread(NULL, 8192, MidiThread, 0, 0, &threadId) == NULL) return "Failed to create thread"; |
144 if (NULL == (_midi.wait_obj = CreateEvent(NULL, FALSE, FALSE, NULL))) return "Failed to create event"; |
|
145 if (NULL == (_midi.thread = CreateThread(NULL, 8192, MidiThread, 0, 0, NULL))) return "Failed to create thread"; |
147 |
146 |
148 return NULL; |
147 return NULL; |
149 } |
148 } |
150 |
149 |
151 void MusicDriver_Win32::Stop() |
150 void MusicDriver_Win32::Stop() |
152 { |
151 { |
153 _midi.terminate = true; |
152 _midi.terminate = true; |
154 SetEvent(_midi.wait_obj); |
153 SetEvent(_midi.wait_obj); |
|
154 WaitForMultipleObjects(1, &_midi.thread, true, INFINITE); |
|
155 CloseHandle(_midi.wait_obj); |
|
156 CloseHandle(_midi.thread); |
155 } |
157 } |