summaryrefslogtreecommitdiff
path: root/engine/audio/private/snd_wave_source.h
diff options
context:
space:
mode:
Diffstat (limited to 'engine/audio/private/snd_wave_source.h')
-rw-r--r--engine/audio/private/snd_wave_source.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/engine/audio/private/snd_wave_source.h b/engine/audio/private/snd_wave_source.h
new file mode 100644
index 0000000..09fe4c1
--- /dev/null
+++ b/engine/audio/private/snd_wave_source.h
@@ -0,0 +1,160 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Workfile: $
+// $Date: $
+//
+//-----------------------------------------------------------------------------
+// $Log: $
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef SND_WAVE_SOURCE_H
+#define SND_WAVE_SOURCE_H
+#pragma once
+
+#include "snd_audio_source.h"
+class IterateRIFF;
+#include "sentence.h"
+#include "snd_sfx.h"
+
+//=============================================================================
+// Functions to create audio sources from wave files or from wave data.
+//=============================================================================
+extern CAudioSource* Audio_CreateMemoryWave( CSfxTable *pSfx );
+extern CAudioSource* Audio_CreateStreamedWave( CSfxTable *pSfx );
+
+class CAudioSourceWave : public CAudioSource
+{
+public:
+ CAudioSourceWave( CSfxTable *pSfx );
+ CAudioSourceWave( CSfxTable *pSfx, CAudioSourceCachedInfo *info );
+ ~CAudioSourceWave( void );
+
+ virtual int GetType( void );
+ virtual void GetCacheData( CAudioSourceCachedInfo *info );
+
+ void Setup( const char *pFormat, int formatSize, IterateRIFF &walk );
+ virtual int SampleRate( void );
+ virtual int SampleSize( void );
+ virtual int SampleCount( void );
+
+ virtual int Format( void );
+ virtual int DataSize( void );
+
+ void *GetHeader( void );
+ virtual bool IsVoiceSource();
+
+ virtual void ParseChunk( IterateRIFF &walk, int chunkName );
+ virtual void ParseSentence( IterateRIFF &walk );
+
+ void ConvertSamples( char *pData, int sampleCount );
+ bool IsLooped( void );
+ bool IsStereoWav( void );
+ bool IsStreaming( void );
+ int GetCacheStatus( void );
+ int ConvertLoopedPosition( int samplePosition );
+ void CacheLoad( void );
+ void CacheUnload( void );
+ virtual int ZeroCrossingBefore( int sample );
+ virtual int ZeroCrossingAfter( int sample );
+ virtual void ReferenceAdd( CAudioMixer *pMixer );
+ virtual void ReferenceRemove( CAudioMixer *pMixer );
+ virtual bool CanDelete( void );
+ virtual CSentence *GetSentence( void );
+ const char *GetName();
+
+ virtual bool IsAsyncLoad();
+
+ virtual void CheckAudioSourceCache();
+
+ virtual char const *GetFileName();
+
+ // 360 uses alternate play once semantics
+ virtual void SetPlayOnce( bool bIsPlayOnce ) { m_bIsPlayOnce = IsPC() ? bIsPlayOnce : false; }
+ virtual bool IsPlayOnce() { return IsPC() ? m_bIsPlayOnce : false; }
+
+ virtual void SetSentenceWord( bool bIsWord ) { m_bIsSentenceWord = bIsWord; }
+ virtual bool IsSentenceWord() { return m_bIsSentenceWord; }
+
+ int GetLoopingInfo( int *pLoopBlock, int *pNumLeadingSamples, int *pNumTrailingSamples );
+
+ virtual int SampleToStreamPosition( int samplePosition ) { return 0; }
+ virtual int StreamToSamplePosition( int streamPosition ) { return 0; }
+
+protected:
+ void ParseCueChunk( IterateRIFF &walk );
+ void ParseSamplerChunk( IterateRIFF &walk );
+
+ void Init( const char *pHeaderBuffer, int headerSize );
+ bool GetStartupData( void *dest, int destsize, int& bytesCopied );
+ bool GetXboxAudioStartupData();
+
+ //-----------------------------------------------------------------------------
+ // Purpose:
+ // Output : byte
+ //-----------------------------------------------------------------------------
+ inline byte *GetCachedDataPointer()
+ {
+ VPROF("CAudioSourceWave::GetCachedDataPointer");
+
+ CAudioSourceCachedInfo *info = m_AudioCacheHandle.Get( CAudioSource::AUDIO_SOURCE_WAV, m_pSfx->IsPrecachedSound(), m_pSfx, &m_nCachedDataSize );
+ if ( !info )
+ {
+ Assert( !"CAudioSourceWave::GetCachedDataPointer info == NULL" );
+ return NULL;
+ }
+
+ return (byte *)info->CachedData();
+ }
+
+ int m_bits;
+ int m_rate;
+ int m_channels;
+ int m_format;
+ int m_sampleSize;
+ int m_loopStart;
+ int m_sampleCount; // can be "samples" or "bytes", depends on format
+
+ CSfxTable *m_pSfx;
+ CSentence *m_pTempSentence;
+
+ int m_dataStart; // offset of sample data
+ int m_dataSize; // size of sample data
+
+ char *m_pHeader;
+ int m_nHeaderSize;
+
+ CAudioSourceCachedInfoHandle_t m_AudioCacheHandle;
+
+ int m_nCachedDataSize;
+
+ // number of actual samples (regardless of format)
+ // compressed formats alter definition of m_sampleCount
+ // used to spare expensive calcs by decoders
+ int m_numDecodedSamples;
+
+ // additional data needed by xma decoder to for looping
+ unsigned short m_loopBlock; // the block the loop occurs in
+ unsigned short m_numLeadingSamples; // number of leader samples in the loop block to discard
+ unsigned short m_numTrailingSamples; // number of trailing samples in the final block to discard
+ unsigned short unused;
+
+ unsigned int m_bNoSentence : 1;
+ unsigned int m_bIsPlayOnce : 1;
+ unsigned int m_bIsSentenceWord : 1;
+
+private:
+ CAudioSourceWave( const CAudioSourceWave & ); // not implemented, not allowed
+ int m_refCount;
+
+#ifdef _DEBUG
+ // Only set in debug mode so you can see the name.
+ const char *m_pDebugName;
+#endif
+};
+
+
+#endif // SND_WAVE_SOURCE_H