src/music/win32_m.cpp
branchnoai
changeset 9701 d1ac22c62f64
parent 9631 8a2d1c2ceb88
child 6870 ca3fd1fbe311
equal deleted inserted replaced
9700:e442ce398e83 9701:d1ac22c62f64
     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 }