2017-01-12 7 views
0

GUIアプリケーションのバックグラウンドスレッドで曲を再生しようとしています。 std :: threadまたはSFML Threadsでこれを行う簡単な方法はありますか?SFMLを使用してバックグラウンドスレッドでサウンドを再生する簡単な方法はありますか?

私はこのためにstd :: threadを使用しようとしましたが、my_thread.join()を呼び出すとGUIスレッドをブロックします。ここで

私が何をしたいの例です。SFMLで

#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インスタンスのためにsf :: Sound :: play()を呼び出すだけです。 –

+0

ここで書いたことに基づいて最良の賭けはsf :: Musicを保存することですどこか(普通はクラスやオーディオマネージャー)、音楽を演奏して2番目の機能を終了させないようにします。 – Eddge

+0

あなたはジュークボックスクラスを楽しむことができます:https://github.com/SFML/SFML/wiki/Source%3A-Jukebox –

答えて

1

有効なSF ::サウンドまたは平方フィートを持っている必要があります::再生する音楽のための音楽、その変数はあなたを破壊しますその1行のステートメントは常に括弧を使用している場合、常に私が知っている、に関係なく、ブラケットを使用し、また

#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 
    } 

} 

:もはやあなたが投稿コードの可能な解決策は、このようなものになるだろう、そのオブジェクトへの有効な参照を持っていません許可されていますが、後でトラブルシューティングをするとあなたの人生が楽になりますon。

関連する問題