У меня возникли проблемы с воспроизведением mp3-файла на c ++ (я прошу прощения за мой английский, это не мой родной язык).Я использую winapi в программе для воспроизведения музыки (я использую функцию mciSendStringW).Моя программа будет использовать 3 потока.Основной поток, поток для операции ввода / вывода и один для воспроизведения музыки.У меня две проблемы:
- Я не знаю, когда закончится музыка (я не знаю размер и длину песни).Я могу использовать:
mciSendStringW(LR"(play SongPath1.mp3 wait)", NULL, 0, NULL)
Но у меня вторая проблема
Я не могу остановить музыку, если я использую:
mciSendStringW(LR"(play SongPath1.mp3 wait)", NULL, 0, NULL);
Поскольку программа будет остановлена в этой строке, пока песня не закончится.Например, пользователь выключил музыку, но я не могу сказать, что остановил музыку, и я не могу уничтожить музыкальный поток в другом потоке.Но если я использую
mciSendStringW(LR"(play SongPath1.mp3)", NULL, 0, NULL);
Без флага «ждать», я могу написать что-то вроде этого:
mciSendStringW(LR"(play SongPath1.mp3 )", NULL, 0, NULL);
while(true){
g_song_mutex.lock(); /*global mutex for g_switch_off_music*/
if(g_switch_off_music) { /*global bool for switch off music*/
mciSendStringW(LR"(stop SongPath1.mp3)", NULL, 0, NULL);
return;
this_thread::sleep_for(chrono::milliseconds(300));
}
g_song_mutex.unlock();
}
Но у меня будет больше одной песни, и когда первая песня закончится, будетначать секонгНо я не знаю, когда закончится песня.И запрограммируйте, если я использую:
mciSendStringW(LR"(play SongPath1.mp3)", NULL, 0, NULL);
Невозможно воспроизвести вторую песню (или повторить первую), или если я использую:
mciSendStringW(LR"(play SongPath1.mp3 wait)", NULL, 0, NULL);
Programm can 't выключить песню.