diff options
Diffstat (limited to 'src/crepe')
| -rw-r--r-- | src/crepe/Sound.cpp | 60 | ||||
| -rw-r--r-- | src/crepe/Sound.h | 82 | 
2 files changed, 142 insertions, 0 deletions
| diff --git a/src/crepe/Sound.cpp b/src/crepe/Sound.cpp new file mode 100644 index 0000000..64fa281 --- /dev/null +++ b/src/crepe/Sound.cpp @@ -0,0 +1,60 @@ +#include "util/log.h" + +#include "Sound.h" +#include "SoundContext.h" + +using namespace crepe; + +Sound::Sound(std::unique_ptr<Asset> res) { +	dbg_trace(); +	this->load(std::move(res)); +} + +Sound::Sound(const char * src) { +	dbg_trace(); +	this->load(std::make_unique<Asset>(src)); +} + +void Sound::load(std::unique_ptr<Asset> res) { +	this->sample.load(res->canonical()); +} + +void Sound::play() { +	SoundContext & ctx = SoundContext::get_instance(); +	if (ctx.engine.getPause(this->handle)) { +		// resume if paused +		ctx.engine.setPause(this->handle, false); +	} else { +		// or start new sound +		this->handle = ctx.engine.play(this->sample, this->volume); +		ctx.engine.setLooping(this->handle, this->looping); +	} +} + +void Sound::pause() { +	SoundContext & ctx = SoundContext::get_instance(); +	if (ctx.engine.getPause(this->handle)) return; +	ctx.engine.setPause(this->handle, true); +} + +void Sound::rewind() { +	SoundContext & ctx = SoundContext::get_instance(); +	if (!ctx.engine.isValidVoiceHandle(this->handle)) return; +	ctx.engine.seek(this->handle, 0); +} + +void Sound::set_volume(float volume) { +	this->volume = volume; + +	SoundContext & ctx = SoundContext::get_instance(); +	if (!ctx.engine.isValidVoiceHandle(this->handle)) return; +	ctx.engine.setVolume(this->handle, this->volume); +} + +void Sound::set_looping(bool looping) { +	this->looping = looping; + +	SoundContext & ctx = SoundContext::get_instance(); +	if (!ctx.engine.isValidVoiceHandle(this->handle)) return; +	ctx.engine.setLooping(this->handle, this->looping); +} diff --git a/src/crepe/Sound.h b/src/crepe/Sound.h new file mode 100644 index 0000000..b7cfbb8 --- /dev/null +++ b/src/crepe/Sound.h @@ -0,0 +1,82 @@ +#pragma once + +#include <soloud/soloud.h> +#include <soloud/soloud_wav.h> + +#include <memory> + +#include "Asset.h" + +namespace crepe { + +class Sound { +public: +	/** +	 * \brief Pause this sample +	 * +	 * Pauses this sound if it is playing, or does nothing if it is already +	 * paused. The playhead position is saved, such that calling \c play() after +	 * this function makes the sound resume. +	 */ +	void pause(); +	/** +	 * \brief Play this sample +	 * +	 * Resume playback if this sound is paused, or start from the beginning of +	 * the sample. +	 * +	 * \note This class only saves a reference to the most recent 'voice' of this +	 * sound. Calling \c play() while the sound is already playing causes +	 * multiple instances of the sample to play simultaniously. The sample +	 * started last is the one that is controlled afterwards. +	 */ +	void play(); +	/** +	 * \brief Reset playhead position +	 *  +	 * Resets the playhead position so that calling \c play() after this function +	 * makes it play from the start of the sample. If the sound is not paused +	 * before calling this function, this function will stop playback. +	 */ +	void rewind(); +	/** +	 * \brief Set playback volume / gain +	 * +	 * \param volume  Volume (0 = muted, 1 = full volume) +	 */ +	void set_volume(float volume); +	/** +	 * \brief Get playback volume / gain +	 * +	 * \return Volume +	 */ +	float get_volume() const { return this->volume; } +	/** +	 * \brief Set looping behavior for this sample +	 * +	 * \param looping  Looping behavior (false = one-shot, true = loop) +	 */ +	void set_looping(bool looping); +	/** +	 * \brief Get looping behavior +	 * +	 * \return true if looping, false if one-shot +	 */ +	bool get_looping() const { return this->looping; } + +public: +	Sound(const char * src); +	Sound(std::unique_ptr<Asset> res); + +private: +	void load(std::unique_ptr<Asset> res); + +private: +	SoLoud::Wav sample; +	SoLoud::handle handle; + +	float volume = 1.0f; +	bool looping = false; +}; + +} // namespace crepe |