Я пытаюсь воспроизвести звук, сопровождающий окно glfw на Mac, в C ++. Мой текущий подход заключается в том, чтобы выполнить системный вызов (afplay) в отдельном потоке для воспроизведения звука и использовать «killall afplay» в основном потоке, чтобы остановить его при необходимости.
В настоящее время системный вызов killall блокирует основной поток, а окно glfw не отвечает. При нажатии ctrl + c появляется сообщение «Соответствующие процессы не найдены», и системный вызов killall возвращает 256. Этот ctrl + c завершает системный вызов. Когда снова нажимаем Ctrl + C, мы выходим из основного потока.
Аналогичный подход работает на Linux-машине.
Команды afplay и killall работают хорошо, если они выдаются непосредственно из терминала.
1, когда я вызываю stop_sound () в "position 0", он работает (первый двоичный файл воспроизводит звук, и звук прерывается при запуске второго двоичного файла), поэтому я думаю, что он как-то связан с glfw.
2, когда я вызываю stop_sound в "position 1", он все еще блокируется.
3, использование нового потока для остановки звука или даже отсоединение его не имеет значения
void play_sound(){
system("afplay my_sound_file.wav");
}
void stop_sound(){
system("killall afplay");
}
main(){
//position 0
while (!glfwWindowShouldClose(window)) {
if(gui.R_key_pressed() && !play_sound){
std::thread audio(play_sound);
audio.detach();
play_sound = true;
}
if(gui.R_key_pressed() && play_sound){
stop_sound();
play_sound = false;
}
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
//position 1
exit(EXIT_SUCCESS);
}