//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Mixer for ADPCM encoded audio // //=============================================================================// #ifndef SND_WAVE_MIXER_MP3_H #define SND_WAVE_MIXER_MP3_H #pragma once #include "vaudio/ivaudio.h" static const int MP3_BUFFER_SIZE = 16384; class CAudioMixerWaveMP3 : public CAudioMixerWave, public IAudioStreamEvent { public: CAudioMixerWaveMP3( IWaveData *data ); ~CAudioMixerWaveMP3( void ); virtual void Mix( IAudioDevice *pDevice, channel_t *pChannel, void *pData, int outputOffset, int inputOffset, fixedint fracRate, int outCount, int timecompress ); virtual int GetOutputData( void **pData, int sampleCount, char copyBuf[AUDIOSOURCE_COPYBUF_SIZE] ); // need to override this to fixup blocks // UNDONE: This doesn't quite work with MP3 - we need a MP3 position, not a sample position void SetSampleStart( int newPosition ); int GetPositionForSave() { return GetStream() ? GetStream()->GetPosition() : 0; } void SetPositionFromSaved(int position) { if ( GetStream() ) GetStream()->SetPosition(position); } // IAudioStreamEvent virtual int StreamRequestData( void *pBuffer, int bytesRequested, int offset ); virtual void SetStartupDelaySamples( int delaySamples ); virtual int GetMixSampleSize() { return CalcSampleSize( 16, m_channelCount ); } virtual int GetStreamOutputRate() { return GetStream() ? GetStream()->GetOutputRate() : 0; } private: IAudioStream *GetStream(); bool DecodeBlock( void ); void GetID3HeaderOffset(); // Lazily initialized, use GetStream IAudioStream *m_pStream; bool m_bStreamInit; char m_samples[MP3_BUFFER_SIZE]; int m_sampleCount; int m_samplePosition; int m_channelCount; int m_offset; int m_delaySamples; int m_headerOffset; }; CAudioMixerWaveMP3 *CreateMP3Mixer( IWaveData *data ); #endif // SND_WAVE_MIXER_MP3_H