summaryrefslogtreecommitdiffstats
path: root/src/audio/oal/stream.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/oal/stream.h')
-rw-r--r--src/audio/oal/stream.h89
1 files changed, 72 insertions, 17 deletions
diff --git a/src/audio/oal/stream.h b/src/audio/oal/stream.h
index 666d42e0..f1e5f458 100644
--- a/src/audio/oal/stream.h
+++ b/src/audio/oal/stream.h
@@ -4,8 +4,56 @@
#ifdef AUDIO_OAL
#include <AL/al.h>
-#define NUM_STREAMBUFFERS 5
-#define STREAMBUFFER_SIZE 0x4000
+#define NUM_STREAMBUFFERS 4
+
+class IDecoder
+{
+public:
+ virtual ~IDecoder() { }
+
+ virtual bool IsOpened() = 0;
+
+ virtual uint32 GetSampleSize() = 0;
+ virtual uint32 GetSampleCount() = 0;
+ virtual uint32 GetSampleRate() = 0;
+ virtual uint32 GetChannels() = 0;
+
+ uint32 GetAvgSamplesPerSec()
+ {
+ return GetChannels() * GetSampleRate();
+ }
+
+ uint32 ms2samples(uint32 ms)
+ {
+ return float(ms) / 1000.0f * float(GetChannels()) * float(GetSampleRate());
+ }
+
+ uint32 samples2ms(uint32 sm)
+ {
+ return float(sm) * 1000.0f / float(GetChannels()) / float(GetSampleRate());
+ }
+
+ uint32 GetBufferSamples()
+ {
+ //return (GetAvgSamplesPerSec() >> 2) - (GetSampleCount() % GetChannels());
+ return (GetAvgSamplesPerSec() / 4); // 250ms
+ }
+
+ uint32 GetBufferSize()
+ {
+ return GetBufferSamples() * GetSampleSize();
+ }
+
+ virtual void Seek(uint32 milliseconds) = 0;
+ virtual uint32 Tell() = 0;
+
+ uint32 GetLength()
+ {
+ return float(GetSampleCount()) * 1000.0f / float(GetSampleRate());
+ }
+
+ virtual uint32 Decode(void *buffer) = 0;
+};
class CStream
{
@@ -13,30 +61,34 @@ class CStream
ALuint &m_alSource;
ALuint (&m_alBuffers)[NUM_STREAMBUFFERS];
- bool m_bIsOpened;
bool m_bPaused;
-
- uint32 m_nLength;
- uint32 m_nLengthMS;
- uint32 m_nBitRate;
-
- unsigned long m_nFormat;
- unsigned long m_nFreq;
+ bool m_bActive;
- uint32 m_nBufferSize;
void *m_pBuffer;
- ALint iTotalBuffersProcessed;
+ bool m_bReset;
+ uint32 m_nVolume;
+ uint8 m_nPan;
+ uint32 m_nPosBeforeReset;
+
+ IDecoder *m_pSoundFile;
+
+ bool HasSource();
+ void SetPosition(float x, float y, float z);
+ void SetPitch(float pitch);
+ void SetGain(float gain);
+ void Pause();
+ void SetPlay(bool state);
bool FillBuffer(ALuint alBuffer);
int32 FillBuffers();
+ void ClearBuffers();
public:
static void Initialise();
static void Terminate();
CStream(char *filename, ALuint &source, ALuint (&buffers)[NUM_STREAMBUFFERS]);
~CStream();
-
void Delete();
bool IsOpened();
@@ -44,14 +96,17 @@ public:
void SetPause (bool bPause);
void SetVolume(uint32 nVol);
void SetPan (uint8 nPan);
- void SetPos (uint32 nPos);
-
- uint32 GetPos();
- uint32 GetLength();
+ void SetPosMS (uint32 nPos);
+ uint32 GetPosMS();
+ uint32 GetLengthMS();
bool Setup();
void Start();
+ void Stop();
void Update(void);
+
+ void ProviderInit();
+ void ProviderTerm();
};
#endif \ No newline at end of file