aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/facade/Sound.h
blob: ee43d94ec0c110a65583bde0c0e1bb974fe21823 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#pragma once

#include <memory>
#include <soloud/soloud.h>
#include <soloud/soloud_wav.h>

#include "../api/Asset.h"

namespace crepe {

/**
 * \brief Sound resource facade
 *
 * This class is a wrapper around a \c SoLoud::Wav instance, which holds a
 * single sample. It is part of the sound facade.
 */
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