File: SoundSource.h

package info (click to toggle)
spring 104.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 47,512 kB
  • sloc: cpp: 391,093; ansic: 79,943; python: 12,356; java: 12,201; awk: 5,889; sh: 1,826; xml: 655; makefile: 486; perl: 405; php: 211; objc: 194; sed: 2
file content (103 lines) | stat: -rw-r--r-- 2,553 bytes parent folder | download
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
/* 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;
	/// will stop during deletion
	~CSoundSource();

	// 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 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* buffer, float3 pos, float3 velocity, float volume, bool relative = false);
	void PlayAsync(IAudioChannel* channel, SoundItem* buffer, float3 pos, float3 velocity, float volume, 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;
		SoundItem* buffer;

		float3 pos;
		float3 velocity;

		float volume;
		bool relative;

		AsyncSoundItemData()
		: channel(nullptr)
		, buffer(nullptr)
		, volume(1.0f)
		, relative(false)
		{}
	};

private:
	static float referenceDistance;

	//! 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;

	SoundItem* curPlaying;
	IAudioChannel* curChannel;
	COggStream curStream;

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

	ALfloat curHeightRolloffModifier;
	AsyncSoundItemData asyncPlay;
};

#endif