Воспроизведение музыки на С ++ - PullRequest
0 голосов
/ 05 декабря 2018

У меня возникли проблемы с воспроизведением mp3-файла на c ++ (я прошу прощения за мой английский, это не мой родной язык).Я использую winapi в программе для воспроизведения музыки (я использую функцию mciSendStringW).Моя программа будет использовать 3 потока.Основной поток, поток для операции ввода / вывода и один для воспроизведения музыки.У меня две проблемы:

  1. Я не знаю, когда закончится музыка (я не знаю размер и длину песни).Я могу использовать:

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 выключить песню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...