File: SoundSource.h

package info (click to toggle)
spring 106.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 55,316 kB
  • sloc: cpp: 543,954; ansic: 44,800; python: 12,575; java: 12,201; awk: 5,889; sh: 1,796; asm: 1,546; xml: 655; perl: 405; php: 211; objc: 194; makefile: 76; sed: 2
file content (109 lines) | stat: -rw-r--r-- 2,672 bytes parent folder | download | duplicates (3)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef SOUNDSOURCE_H
#define SOUNDSOURCE_H

#include <string>

#include <al.h>

#include "System/Misc/NonCopyable.h"
#include "System/Misc/SpringTime.h"
#include "System/float3.h"
#include "OggStream.h"

class IAudioChannel;
class SoundItem;

/**
 * @brief One soundsource wich can play some sounds
 *
 * Construct some of them, and they can play SoundItems positioned anywhere in 3D-space for you.
 */
class CSoundSource
{
public:
	/// is ready after this
	CSoundSource();
	CSoundSource(CSoundSource&& src) { *this = std::move(src); }
	CSoundSource(const CSoundSource& src) = delete;
	~CSoundSource() { Delete(); }

	// sources don't ever need to actually move, just here to satisfy compiler
	CSoundSource& operator = (CSoundSource&& src) { return *this; }
	CSoundSource& operator = (const CSoundSource& src) = delete;

	void Update();
	void Delete();

	void UpdateVolume();
	bool IsValid() const { return (id != 0); };

	int GetCurrentPriority() const;
	bool IsPlaying(const bool checkOpenAl = false) const;
	void Stop();

	/// will stop a currently playing sound, if any
	void Play(IAudioChannel* channel, SoundItem* item, float3 pos, float3 velocity, float volume, bool relative = false);
	void PlayAsync(IAudioChannel* channel, size_t id, float3 pos, float3 velocity, float volume, float priority, bool relative = false);
	void PlayStream(IAudioChannel* channel, const std::string& stream, float volume);
	void StreamStop();
	void StreamPause();
	float GetStreamTime();
	float GetStreamPlayTime();

	static void SetPitch(const float& newPitch) { globalPitch = newPitch; }
	static void SetHeightRolloffModifer(const float& mod) { heightRolloffModifier = mod; }

private:
	struct AsyncSoundItemData {
		IAudioChannel* channel = nullptr;

		size_t id = 0;

		float3 position;
		float3 velocity;

		float volume = 1.0f;
		float priority = 0.0f;

		bool relative = false;
	};

	// light-weight SoundItem with only the data needed for playback
	struct SoundItemData {
		size_t id;

		unsigned int loopTime;
		int priority;

		float rndGain;
		float rolloff;
	};

private:
	// used to adjust the pitch to the GameSpeed (optional)
	static float globalPitch;

	// reduce the rolloff when the camera is height above the ground (so we still hear something in tab mode or far zoom)
	static float heightRolloffModifier;

private:
	ALuint id;

	SoundItemData curPlayingItem;
	AsyncSoundItemData asyncPlayItem;

	IAudioChannel* curChannel;
	COggStream curStream;

	float curVolume;
	spring_time loopStop;
	bool in3D;
	bool efxEnabled;
	int efxUpdates;

	ALfloat curHeightRolloffModifier;
};

#endif