summaryrefslogtreecommitdiff
path: root/engine/audio/private/circularbuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'engine/audio/private/circularbuffer.h')
-rw-r--r--engine/audio/private/circularbuffer.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/engine/audio/private/circularbuffer.h b/engine/audio/private/circularbuffer.h
new file mode 100644
index 0000000..d24f04d
--- /dev/null
+++ b/engine/audio/private/circularbuffer.h
@@ -0,0 +1,99 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Defines an interface for circular buffers. Data can be written to
+// and read from these buffers as though from a file. When it is
+// write-overflowed (you write more data in than the buffer can hold),
+// the read pointer is advanced to allow the new data to be written.
+// This means old data will be discarded if you write too much data
+// into the buffer.
+//
+// MikeD: Moved all the functions into a class.
+// Changed it so when the buffer overflows, the old data
+// is discarded rather than the new.
+//
+//=====================================================================================//
+
+#ifndef CIRCULARBUFFER_H
+#define CIRCULARBUFFER_H
+
+#pragma once
+
+class CCircularBuffer
+{
+public:
+ CCircularBuffer();
+ CCircularBuffer( int size );
+ void SetSize( int nSize );
+
+protected:
+ inline void AssertValid()
+ {
+#ifdef _DEBUG
+ Assert( this );
+ Assert( m_nSize > 0 );
+ Assert( m_nCount >= 0 );
+ Assert( m_nCount <= m_nSize );
+ Assert( m_nWrite < m_nSize );
+
+ // Verify that m_nCount is correct.
+ if( m_nRead == m_nWrite )
+ {
+ Assert( m_nCount == 0 || m_nCount == m_nSize );
+ }
+ else
+ {
+ int testCount=0;
+ if ( m_nRead < m_nWrite )
+ testCount = m_nWrite - m_nRead;
+ else
+ testCount = (m_nSize - m_nRead) + m_nWrite;
+
+ Assert( testCount == m_nCount );
+ }
+#endif
+ }
+
+public:
+
+ void Flush();
+ int GetSize(); // Get the size of the buffer (how much can you write without reading
+ // before losing data.
+
+ int GetWriteAvailable(); // Get the amount available to write without overflowing.
+ // Note: you can write however much you want, but it may overflow,
+ // in which case the newest data is kept and the oldest is discarded.
+
+ int GetReadAvailable(); // Get the amount available to read.
+
+ int GetMaxUsed();
+ int Peek(char *pchDest, int nCount);
+ int Advance(int nCount);
+ int Read(void *pchDest, int nCount);
+ int Write(void *pchData, int nCount);
+
+public:
+ int m_nCount; // Space between the read and write pointers (how much data we can read).
+
+ int m_nRead; // Read index into circular buffer
+ int m_nWrite; // Write index into circular buffer
+
+ int m_nSize; // Size of circular buffer in bytes (how much data it can hold).
+ char m_chData[1]; // Circular buffer holding data
+};
+
+
+// Use this to instantiate a CircularBuffer.
+template< int size >
+class CSizedCircularBuffer : public CCircularBuffer
+{
+public:
+ CSizedCircularBuffer() : CCircularBuffer(size) {}
+
+private:
+ char myData[size-1];
+};
+
+CCircularBuffer *AllocateCircularBuffer( int nSize );
+void FreeCircularBuffer( CCircularBuffer *pCircularBuffer );
+
+#endif // CIRCULARBUFFER_H \ No newline at end of file