aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/api/AudioSource.h
blob: eaa56e894e891c8dd6608a8e4b736103b604c0b3 (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
#pragma once

#include "../Component.h"
#include "../facade/SoundHandle.h"
#include "../types.h"

#include "Asset.h"
#include "GameObject.h"

namespace crepe {

class AudioSystem;

//! Audio source component
class AudioSource : public Component {
	//! AudioSource components are handled by AudioSystem
	friend class AudioSystem;

protected:
	/**
	 * \param source Sound sample to load
	 */
	AudioSource(game_object_id_t id, const Asset & source);
	//! Only ComponentManager creates components
	friend class ComponentManager;

public:
	// std::unique_ptr needs to be able to destoy this component
	virtual ~AudioSource() = default;

public:
	//! Start this audio source
	void play(bool looping = false);
	//! Stop this audio source
	void stop();

public:
	//! Play when this component becomes active
	bool play_on_awake = false;
	//! Repeat the current audio clip during playback
	bool loop = false;
	//! Normalized volume (0.0 - 1.0)
	float volume = 1.0;

private:
	//! This audio source's clip
	const Asset source;

	/**
	 * \name One-shot state variables
	 *
	 * These variables trigger function calls when set to true, and are unconditionally reset on
	 * every system update.
	 *
	 * \{
	 */
	//! Play this sample
	bool oneshot_play = false;
	//! Stop this sample
	bool oneshot_stop = false;
	//! \}
	/**
	 * \name State diffing variables
	 * \{
	 */
	typeof(active) last_active = false;
	typeof(volume) last_volume = volume;
	typeof(loop) last_loop = loop;
	//! \}
	//! This source's voice handle
	SoundHandle voice {};
};

} // namespace crepe