//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $Workfile: $ // $Date: $ // $NoKeywords: $ //===========================================================================// #ifndef SND_DEVICE_H #define SND_DEVICE_H #ifdef _WIN32 #pragma once #endif #include "tier0/platform.h" //----------------------------------------------------------------------------- // 4.28 fixed point stuff for real-time resampling //----------------------------------------------------------------------------- #define FIX_BITS 28 #define FIX_SCALE (1 << FIX_BITS) #define FIX_MASK ((1 << FIX_BITS)-1) #define FIX_FLOAT(a) ((int)((a) * FIX_SCALE)) #define FIX(a) (((int)(a)) << FIX_BITS) #define FIX_INTPART(a) (((int)(a)) >> FIX_BITS) #define FIX_FRACTION(a,b) (FIX(a)/(b)) #define FIX_FRACPART(a) ((a) & FIX_MASK) typedef unsigned int fixedint; //----------------------------------------------------------------------------- // sound rate defines //----------------------------------------------------------------------------- #define SOUND_DMA_SPEED 44100 // hardware playback rate #define SOUND_11k 11025 // 11khz sample rate #define SOUND_22k 22050 // 22khz sample rate #define SOUND_44k 44100 // 44khz sample rate #define SOUND_ALL_RATES 1 // mix all sample rates //----------------------------------------------------------------------------- // Information about the channel //----------------------------------------------------------------------------- struct channel_t { int leftvol; int rightvol; float pitch; }; //----------------------------------------------------------------------------- // The audio device is responsible for mixing //----------------------------------------------------------------------------- abstract_class IAudioDevice { public: // Add a virtual destructor to silence the clang warning. // This is harmless but not important since the only derived class // doesn't have a destructor. virtual ~IAudioDevice() {} // This initializes the sound hardware. true on success, false on failure virtual bool Init( void ) = 0; // This releases all sound hardware virtual void Shutdown( void ) = 0; // device parameters virtual const char *DeviceName( void ) const = 0; virtual int DeviceChannels( void ) const = 0; // 1 = mono, 2 = stereo virtual int DeviceSampleBits( void ) const = 0; // bits per sample (8 or 16) virtual int DeviceSampleBytes( void ) const = 0; // above / 8 virtual int DeviceSampleRate( void ) const = 0; // Actual DMA speed virtual int DeviceSampleCount( void ) const = 0; // Total samples in buffer // Called each time a new paint buffer is mixed (may be multiple times per frame) virtual void MixBegin( void ) = 0; // Main mixing routines virtual void Mix8Mono( channel_t *pChannel, char *pData, int outputOffset, int inputOffset, fixedint rateScaleFix, int outCount, int timecompress, bool forward = true ) = 0; virtual void Mix8Stereo( channel_t *pChannel, char *pData, int outputOffset, int inputOffset, fixedint rateScaleFix, int outCount, int timecompress, bool forward = true ) = 0; virtual void Mix16Mono( channel_t *pChannel, short *pData, int outputOffset, int inputOffset, fixedint rateScaleFix, int outCount, int timecompress, bool forward = true ) = 0; virtual void Mix16Stereo( channel_t *pChannel, short *pData, int outputOffset, int inputOffset, fixedint rateScaleFix, int outCount, int timecompress, bool forward = true ) = 0; // Size of the paint buffer in samples virtual int PaintBufferSampleCount( void ) const = 0; // Adds a mixer to be mixed virtual void AddSource( CAudioMixer *pSource ) = 0; // Stops all sounds virtual void StopSounds( void ) = 0; // Updates sound mixing virtual void Update( float time ) = 0; // Resets the device virtual void Flush( void ) = 0; virtual int FindSourceIndex( CAudioMixer *pSource ) = 0; virtual CAudioMixer *GetMixerForSource( CAudioSource *source ) = 0; virtual void FreeChannel( int channelIndex ) = 0; }; #endif // SND_DEVICE_H