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
|
/* 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 <boost/noncopyable.hpp>
#include "System/Misc/SpringTime.h"
#include "System/float3.h"
class IAudioChannel;
class SoundItem;
class COggStream;
/**
* @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 : boost::noncopyable
{
public:
/// is ready after this
CSoundSource();
/// will stop during deletion
~CSoundSource();
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)
{}
};
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;
ALuint id;
SoundItem* curPlaying;
IAudioChannel* curChannel;
COggStream* curStream;
float curVolume;
spring_time loopStop;
bool in3D;
bool efxEnabled;
int efxUpdates;
ALfloat curHeightRolloffModifier;
AsyncSoundItemData asyncPlay;
};
#endif
|