Проверьте, закончилась ли музыка, OnStopped? - PullRequest
1 голос
/ 30 марта 2011

Можно ли заставить SFML 1.6 самостоятельно обрабатывать музыку?В настоящее время у меня есть это:

//in music.cpp
music.Play()

//in main.cpp
//on every frame check for end of music
if(music.getStatus() == Sound::Stopped)
    loadNextMusicFile();

Разве в SFML нет способа просто сказать: «Играй, пока музыка не остановилась, затем загрузи следующую», не реализовав это самостоятельно?Или, по крайней мере, более «элегантный» способ заметить, когда музыка остановилась (например, событие OnStopped)?

1 Ответ

3 голосов
/ 30 марта 2011

Если вы посмотрите на код из Music.cpp

bool Music::OnGetData(SoundStream::Chunk& data)
{
    Lock lock(myMutex);

    // Fill the chunk parameters
    data.Samples   = &mySamples[0];
    data.NbSamples = myFile->Read(&mySamples[0], mySamples.size());

    // Check if we have reached the end of the audio file
    return data.NbSamples == mySamples.size();
}

Вы видите, что он вернет false, когда его в конце файла.

Итак, что вы хотите сделать, это подкласс sf :: Music. например,

class MyMusic : public sf::Music
{
   bool OnGetData(SoundStream::Chunk& data)
   {
       bool running = sf::Music::OnGetData(data);
       if(!running)
          OnMusicEnd();
       return running;
   }
public:
   void OnMusicEnd()
   {
       // ...
   }

};
...