source-engine/engine/audio/snd_wave_mixer_mp3.h

60 lines
1.9 KiB
C
Raw Permalink Normal View History

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