Проверка воспроизведения музыки с помощью SDL2

Использование SDL для создания простой игры, и у меня есть фоновая музыка, играющая с самого начала программы, но я хочу иметь возможность проверить, когда музыка перестала играть, чтобы можно было запустить следующую дорожку. Я использую библиотеку SDL_mixer для загрузки и воспроизведения музыки.

bool loadTrack()
{
    song = Mix_LoadMUS( "backgroundmusic.mp3" ); 
    if (song == NULL)
    {
        return false;
    }
    else
    {
        Mix_PlayMusic(song, -1);
        return true;
    }
}

Я загружаю и играю музыку в классе, который я создал под названием «музыка», песня определена в конструкторе класса как NULL, затем даю ей имя дорожки и воспроизводит ее в методе «loadTrack» в этом классе. Я хочу использовать другой метод в классе, который можно вызвать и вернуть true, если трек закончил воспроизведение, и false, если он все еще воспроизводится. Моя проблема заключается в том, что я понятия не имею, как проверить, воспроизводится ли трек или есть ли в библиотеках микшера собственная функция для проверки того, воспроизводится ли он.


person Bananas88    schedule 19.12.2017    source источник


Ответы (1)


SDL_Mixer имеет Mix_PlayingMusic() для проверки воспроизведения музыки. Но поскольку вы передаете -1 в Mix_PlayMusic, он зацикливается и воспроизводится вечно, никогда не останавливается.

Я думаю, вы можете «вручную» перезапустить песню, передав 1 (воспроизведение один раз) вместо -1 в Mix_PlayMusic. Затем в вашем основном цикле, прежде чем перейти к следующему кадру, проверьте, не перестала ли воспроизводиться музыка, чтобы вы могли либо запустить ее снова, либо воспроизвести другую музыку. Однако это приведет к небольшому перерыву в тишине между каждым перезапуском (около 1 кадра ~ 1/60 с, если ваша игра работает со скоростью 60 кадров в секунду). Поэтому, если вы просто хотите плавно зациклить музыку, лучше пусть SDL_Mixer сделает это, а не вручную, как здесь.

person tnt    schedule 19.12.2017
comment
именно тот ответ, который мне был нужен, попробую, когда вернусь домой сегодня, спасибо - person Bananas88; 21.12.2017