summaryrefslogtreecommitdiff
path: root/utils/scenemanager/audiowaveoutput.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/scenemanager/audiowaveoutput.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/scenemanager/audiowaveoutput.h')
-rw-r--r--utils/scenemanager/audiowaveoutput.h127
1 files changed, 127 insertions, 0 deletions
diff --git a/utils/scenemanager/audiowaveoutput.h b/utils/scenemanager/audiowaveoutput.h
new file mode 100644
index 0000000..c169c16
--- /dev/null
+++ b/utils/scenemanager/audiowaveoutput.h
@@ -0,0 +1,127 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef AUDIOWAVEOUTPUT_H
+#define AUDIOWAVEOUTPUT_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "sound.h"
+#include "utlvector.h"
+
+#define OUTPUT_BUFFER_COUNT 32
+#define MAX_CHANNELS 16
+
+class CAudioMixer;
+
+class CAudioMixerState
+{
+public:
+ CAudioMixer *mixer;
+ int submit_mixer_sample;
+};
+
+class CAudioBuffer
+{
+public:
+ WAVEHDR *hdr;
+ bool submitted;
+ int submit_sample_count;
+
+ CUtlVector< CAudioMixerState > m_Referenced;
+};
+
+#define OUTPUT_SAMPLE_RATE 44100
+#define PAINTBUFFER_SIZE 1024
+
+typedef struct
+{
+ int left;
+ int right;
+} portable_samplepair_t;
+
+class CAudioDeviceSWMix : public IAudioDevice
+{
+public:
+ virtual void Mix8Mono( channel_t *pChannel, char *pData, int outputOffset, int inputOffset, int rateScaleFix, int outCount, int timecompress, bool forward = true );
+ virtual void Mix8Stereo( channel_t *pChannel, char *pData, int outputOffset, int inputOffset, int rateScaleFix, int outCount, int timecompress, bool forward = true );
+ virtual void Mix16Mono( channel_t *pChannel, short *pData, int outputOffset, int inputOffset, int rateScaleFix, int outCount, int timecompress, bool forward = true );
+ virtual void Mix16Stereo( channel_t *pChannel, short *pData, int outputOffset, int inputOffset, int rateScaleFix, int outCount, int timecompress, bool forward = true );
+ virtual int MaxSampleCount( void );
+ virtual void MixBegin( void );
+
+ void TransferBufferStereo16( short *pOutput, int sampleCount );
+
+private:
+ portable_samplepair_t m_paintbuffer[ PAINTBUFFER_SIZE ];
+};
+
+class CAudioWaveOutput : public CAudioOutput
+{
+public:
+ CAudioWaveOutput( void );
+ ~CAudioWaveOutput( void );
+
+ // returns the size of each sample in bytes
+ virtual int SampleSize( void ) { return 2; }
+
+ // returns the sampling rate of the data
+ virtual int SampleRate( void ) { return OUTPUT_SAMPLE_RATE; }
+
+ // returns the mono/stereo status of this device (true if stereo)
+ virtual bool IsStereo( void ) { return true; }
+
+ // mix a buffer up to time (time is absolute)
+ virtual void Update( float time );
+
+ virtual void Flush( void );
+
+ virtual void AddSource( CAudioMixer *pSource );
+ virtual void StopSounds( void );
+ virtual int FindSourceIndex( CAudioMixer *pSource );
+
+ virtual int GetOutputPosition( void );
+ virtual float GetAmountofTimeAhead( void );
+ virtual int GetNumberofSamplesAhead( void );
+
+ virtual CAudioMixer *GetMixerForSource( CAudioSource *pSource );
+
+
+private:
+ void OpenDevice( void );
+ bool ValidDevice( void ) { return m_deviceHandle != 0; }
+ void ClearDevice( void ) { m_deviceHandle = NULL; }
+ CAudioBuffer *GetEmptyBuffer( void );
+ void SilenceBuffer( short *pSamples, int sampleCount );
+
+ void SetChannel( int channelIndex, CAudioMixer *pSource );
+ void FreeChannel( int channelIndex );
+
+ void RemoveMixerChannelReferences( CAudioMixer *mixer );
+ void AddToReferencedList( CAudioMixer *mixer, CAudioBuffer *buffer );
+ void RemoveFromReferencedList( CAudioMixer *mixer, CAudioBuffer *buffer );
+ bool IsSourceReferencedByActiveBuffer( CAudioMixer *mixer );
+ bool IsSoundInReferencedList( CAudioMixer *mixer, CAudioBuffer *buffer );
+
+ // Compute how many samples we've mixed since most recent buffer submission
+ void ComputeSampleAheadAmount( void );
+
+ HWAVEOUT m_deviceHandle;
+
+ float m_mixTime;
+ float m_baseTime;
+ int m_sampleIndex;
+ CAudioBuffer m_buffers[ OUTPUT_BUFFER_COUNT ];
+
+ CAudioMixer *m_sourceList[MAX_CHANNELS];
+ int m_nEstimatedSamplesAhead;
+public:
+ CAudioDeviceSWMix m_audioDevice;
+
+};
+#endif // AUDIOWAVEOUTPUT_H