You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.6 KiB
127 lines
3.6 KiB
//========= 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
|
|
|