2017-01-12 5 views
0

Я пытаюсь воспроизвести песню в фоновом потоке моего приложения графического интерфейса, чтобы песня не блокировала поток графического интерфейса. Есть ли простой способ сделать это с помощью std :: thread или SFML Threads?Есть ли простой способ воспроизведения звука в фоновом потоке с использованием SFML

Я попытался использовать std :: thread для этого, но он по-прежнему блокирует поток графического интерфейса, когда я вызываю my_thread.join().

Вот пример того, что я хочу сделать:

#include <thread> 
#include <SFML/Audio.hpp> 
#include <unistd.h> 
#include <iostream> 

void func() { 
    sf::Music music; 
    music.openFromFile("mysong.wav"); 
    music.play(); 
    // if I don't have usleep here the function exits immediately 
    // why is that exactly??? 
    usleep(100000000); 
} 


int main() { 

    std::thread my_thread(func); 
    my_thread.join(); 

    // this is where I would process events/build windows in GUI 
    while(1) 
     std::cout << "here"; // <--- Want this to run while song plays 

} 
+0

Вам не нужно использовать потоки, вы просто вызываете sf :: Sound :: play() для sf :: Sound instance –

+0

Ваш лучший выбор основан на том, что вы написали здесь, чтобы сохранить sf :: Music где-то (обычно класс или аудио-менеджер) и воспроизводить музыку, чтобы она не останавливала вторую, после чего заканчивается ваша функция. – Eddge

+0

Вы можете наслаждаться моим классом Jukebox: https://github.com/SFML/SFML/wiki/Source%3A-Jukebox –

ответ

1

в SFML вам необходимо иметь действительный НФ :: Звук или НФ :: Музыка для музыки, чтобы играть, когда эта переменная разрушается вас больше не будет иметь действительную ссылку на этот объект возможным решения для кода, публикуемым будет что-то вроде этого:

#include <SFML/Audio.hpp> 
#include <unistd.h> 
#include <iostream> 

class CAudio 
{ 
    sf::Music music; 
public: 
    void func() 
    { 
     music.openFromFile("mysong.wav"); 
     music.play(); 
    } 

    sf::Status getStatus() 
    { 
     return music.getStatus(); 
    } 
}  

int main() { 

    CAudio my_music; 
    my_music.func(); 

    // http://www.sfml-dev.org/documentation/2.0/SoundSource_8hpp_source.php 
    while(my_music.getStatus() == sf::Status::Playing) 
    { 
     std::cout << "here"; // <--- Want this to run while song plays 
    } 

} 

Кроме того, всегда используйте скобки, независимо от того, св 1 линии оператор всегда использовать скобки, я знаю, его разрешено, но это упростит вашу жизнь, когда вы устраните неполадки позже на.

 Смежные вопросы

  • Нет связанных вопросов^_^