forked from NaiJi/project-kyoku
Encapsulate music and timer interpolation, test with pause
parent
c2677bdd2b
commit
cf1119c742
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include "tools/mathutils.h"
|
||||
#include <string>
|
||||
|
||||
class Music
|
||||
{
|
||||
public:
|
||||
virtual ~Music() = default;
|
||||
|
||||
virtual bool openFromFile(const std::string& filepath) = 0;
|
||||
|
||||
virtual void play() = 0;
|
||||
virtual void pause() = 0;
|
||||
virtual void stop() = 0;
|
||||
|
||||
virtual void setVolume(int volume) = 0;
|
||||
|
||||
virtual void setOffset(const microsec& offset) = 0;
|
||||
virtual microsec fetchOffset() = 0;
|
||||
};
|
@ -0,0 +1,58 @@
|
||||
#include "musicsfml.h"
|
||||
|
||||
MusicSFML::MusicSFML() :
|
||||
_sfml_music_offset(0),
|
||||
_previous_frame_offset(0),
|
||||
_absolute_offset(0)
|
||||
{}
|
||||
|
||||
bool MusicSFML::openFromFile(const std::string& filepath)
|
||||
{
|
||||
return _music.openFromFile(filepath);
|
||||
}
|
||||
|
||||
void MusicSFML::play()
|
||||
{
|
||||
_music.play();
|
||||
_sfml_music_offset = _offset_interpolator.restart().asMicroseconds();
|
||||
}
|
||||
|
||||
void MusicSFML::pause()
|
||||
{
|
||||
_music.pause();
|
||||
}
|
||||
|
||||
void MusicSFML::stop()
|
||||
{
|
||||
_music.stop();
|
||||
}
|
||||
|
||||
void MusicSFML::setVolume(int volume)
|
||||
{
|
||||
_music.setVolume(volume);
|
||||
}
|
||||
|
||||
void MusicSFML::setOffset(const microsec& offset)
|
||||
{
|
||||
_previous_frame_offset += (offset - _absolute_offset);
|
||||
_music.setPlayingOffset(sf::microseconds(offset));
|
||||
}
|
||||
|
||||
microsec MusicSFML::fetchOffset()
|
||||
{
|
||||
if (_music.getStatus() != sf::Music::Status::Playing)
|
||||
return _absolute_offset;
|
||||
|
||||
const auto interpolator_timestamp = _offset_interpolator.getElapsedTime().asMicroseconds();
|
||||
const auto sfml_new_offset = _music.getPlayingOffset().asMicroseconds();
|
||||
|
||||
_absolute_offset += (interpolator_timestamp - _previous_frame_offset);
|
||||
_previous_frame_offset = interpolator_timestamp;
|
||||
if (sfml_new_offset != _sfml_music_offset)
|
||||
{
|
||||
_absolute_offset = ((_absolute_offset + sfml_new_offset) / 2);
|
||||
_sfml_music_offset = sfml_new_offset;
|
||||
}
|
||||
|
||||
return _absolute_offset;
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include "tools/music.h"
|
||||
|
||||
#include <SFML/Audio/Music.hpp>
|
||||
|
||||
class MusicSFML : public Music
|
||||
{
|
||||
public:
|
||||
explicit MusicSFML();
|
||||
|
||||
virtual bool openFromFile(const std::string& filepath) override;
|
||||
|
||||
virtual void play() override;
|
||||
virtual void pause() override;
|
||||
virtual void stop() override;
|
||||
|
||||
virtual void setVolume(int volume) override;
|
||||
|
||||
virtual void setOffset(const microsec& offset) override;
|
||||
virtual microsec fetchOffset() override;
|
||||
|
||||
private:
|
||||
sf::Music _music;
|
||||
sf::Clock _offset_interpolator;
|
||||
|
||||
microsec _sfml_music_offset;
|
||||
microsec _previous_frame_offset;
|
||||
microsec _absolute_offset;
|
||||
};
|
Loading…
Reference in New Issue