source-engine/utils/scenemanager/audiowaveoutput.h

128 lines
3.6 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= 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