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.
187 lines
6.0 KiB
187 lines
6.0 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef SND_MP3_SOURCE_H
|
||
|
#define SND_MP3_SOURCE_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "snd_audio_source.h"
|
||
|
#include "snd_wave_data.h"
|
||
|
#include "snd_sfx.h"
|
||
|
|
||
|
class IWaveData;
|
||
|
class CAudioMixer;
|
||
|
|
||
|
abstract_class CAudioSourceMP3 : public CAudioSource
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CAudioSourceMP3( CSfxTable *pSfx );
|
||
|
CAudioSourceMP3( CSfxTable *pSfx, CAudioSourceCachedInfo *info );
|
||
|
virtual ~CAudioSourceMP3();
|
||
|
|
||
|
// Create an instance (mixer) of this audio source
|
||
|
virtual CAudioMixer *CreateMixer( int initialStreamPosition = 0 ) = 0;
|
||
|
|
||
|
virtual int GetType( void );
|
||
|
virtual void GetCacheData( CAudioSourceCachedInfo *info );
|
||
|
|
||
|
// Provide samples for the mixer. You can point pData at your own data, or if you prefer to copy the data,
|
||
|
// you can copy it into copyBuf and set pData to copyBuf.
|
||
|
virtual int GetOutputData( void **pData, int samplePosition, int sampleCount, char copyBuf[AUDIOSOURCE_COPYBUF_SIZE] ) = 0;
|
||
|
|
||
|
virtual int SampleRate( void );
|
||
|
|
||
|
// Returns true if the source is a voice source.
|
||
|
// This affects the voice_overdrive behavior (all sounds get quieter when
|
||
|
// someone is speaking).
|
||
|
virtual bool IsVoiceSource() { return false; }
|
||
|
virtual int SampleSize( void ) { return 1; }
|
||
|
|
||
|
// Total number of samples in this source. NOTE: Some sources are infinite (mic input), they should return
|
||
|
// a count equal to one second of audio at their current rate.
|
||
|
virtual int SampleCount( void ) { return m_dataSize; }
|
||
|
|
||
|
virtual int Format() { return 0; }
|
||
|
virtual int DataSize( void ) { return 0; }
|
||
|
|
||
|
virtual bool IsLooped( void ) { return false; }
|
||
|
virtual bool IsStereoWav( void ) { return false; }
|
||
|
virtual bool IsStreaming( void ) { return false; }
|
||
|
virtual int GetCacheStatus( void ) { return AUDIO_IS_LOADED; }
|
||
|
virtual void CacheLoad( void ) {}
|
||
|
virtual void CacheUnload( void ) {}
|
||
|
virtual CSentence *GetSentence( void ) { return NULL; }
|
||
|
|
||
|
virtual int ZeroCrossingBefore( int sample ) { return sample; }
|
||
|
virtual int ZeroCrossingAfter( int sample ) { return sample; }
|
||
|
|
||
|
// mixer's references
|
||
|
virtual void ReferenceAdd( CAudioMixer *pMixer );
|
||
|
virtual void ReferenceRemove( CAudioMixer *pMixer );
|
||
|
// check reference count, return true if nothing is referencing this
|
||
|
virtual bool CanDelete( void );
|
||
|
|
||
|
virtual bool IsAsyncLoad();
|
||
|
|
||
|
virtual void CheckAudioSourceCache();
|
||
|
|
||
|
virtual char const *GetFileName();
|
||
|
|
||
|
virtual void SetPlayOnce( bool isPlayOnce ) { m_bIsPlayOnce = isPlayOnce; }
|
||
|
virtual bool IsPlayOnce() { return m_bIsPlayOnce; }
|
||
|
|
||
|
virtual void SetSentenceWord( bool bIsWord ) { m_bIsSentenceWord = bIsWord; }
|
||
|
virtual bool IsSentenceWord() { return m_bIsSentenceWord; }
|
||
|
|
||
|
virtual int SampleToStreamPosition( int samplePosition ) { return 0; }
|
||
|
virtual int StreamToSamplePosition( int streamPosition ) { return 0; }
|
||
|
|
||
|
virtual void SetSentence( CSentence *pSentence );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Output : byte
|
||
|
//-----------------------------------------------------------------------------
|
||
|
inline byte *GetCachedDataPointer()
|
||
|
{
|
||
|
VPROF("CAudioSourceMP3::GetCachedDataPointer");
|
||
|
|
||
|
CAudioSourceCachedInfo *info = m_AudioCacheHandle.Get( CAudioSource::AUDIO_SOURCE_MP3, m_pSfx->IsPrecachedSound(), m_pSfx, &m_nCachedDataSize );
|
||
|
if ( !info )
|
||
|
{
|
||
|
Assert( !"CAudioSourceMP3::GetCachedDataPointer info == NULL" );
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
return (byte *)info->CachedData();
|
||
|
}
|
||
|
|
||
|
CAudioSourceCachedInfoHandle_t m_AudioCacheHandle;
|
||
|
int m_nCachedDataSize;
|
||
|
|
||
|
protected:
|
||
|
CSfxTable *m_pSfx;
|
||
|
int m_sampleRate;
|
||
|
int m_dataSize;
|
||
|
int m_dataStart;
|
||
|
int m_refCount;
|
||
|
bool m_bIsPlayOnce : 1;
|
||
|
bool m_bIsSentenceWord : 1;
|
||
|
bool m_bCheckedForPendingSentence;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Streaming MP3 file
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CAudioSourceStreamMP3 : public CAudioSourceMP3, public IWaveStreamSource
|
||
|
{
|
||
|
public:
|
||
|
CAudioSourceStreamMP3( CSfxTable *pSfx );
|
||
|
CAudioSourceStreamMP3( CSfxTable *pSfx, CAudioSourceCachedInfo *info );
|
||
|
~CAudioSourceStreamMP3() {}
|
||
|
|
||
|
bool IsStreaming( void ) OVERRIDE { return true; }
|
||
|
bool IsStereoWav( void ) OVERRIDE { return false; }
|
||
|
CAudioMixer *CreateMixer( int initialStreamPosition = 0 ) OVERRIDE;
|
||
|
int GetOutputData( void **pData, int samplePosition, int sampleCount, char copyBuf[AUDIOSOURCE_COPYBUF_SIZE] ) OVERRIDE;
|
||
|
|
||
|
// IWaveStreamSource
|
||
|
int UpdateLoopingSamplePosition( int samplePosition ) OVERRIDE
|
||
|
{
|
||
|
return samplePosition;
|
||
|
}
|
||
|
void UpdateSamples( char *pData, int sampleCount ) OVERRIDE {}
|
||
|
|
||
|
int GetLoopingInfo( int *pLoopBlock, int *pNumLeadingSamples, int *pNumTrailingSamples ) OVERRIDE
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void Prefetch() OVERRIDE;
|
||
|
|
||
|
private:
|
||
|
CAudioSourceStreamMP3( const CAudioSourceStreamMP3 & ); // not implemented, not accessible
|
||
|
};
|
||
|
|
||
|
class CAudioSourceMP3Cache : public CAudioSourceMP3
|
||
|
{
|
||
|
public:
|
||
|
CAudioSourceMP3Cache( CSfxTable *pSfx );
|
||
|
CAudioSourceMP3Cache( CSfxTable *pSfx, CAudioSourceCachedInfo *info );
|
||
|
~CAudioSourceMP3Cache( void );
|
||
|
|
||
|
int GetCacheStatus( void ) OVERRIDE;
|
||
|
void CacheLoad( void ) OVERRIDE;
|
||
|
void CacheUnload( void ) OVERRIDE;
|
||
|
// NOTE: "samples" are bytes for MP3
|
||
|
int GetOutputData( void **pData, int samplePosition, int sampleCount, char copyBuf[AUDIOSOURCE_COPYBUF_SIZE] ) OVERRIDE;
|
||
|
CAudioMixer *CreateMixer( int initialStreamPosition = 0 ) OVERRIDE;
|
||
|
CSentence *GetSentence( void ) OVERRIDE;
|
||
|
|
||
|
void Prefetch() OVERRIDE {}
|
||
|
|
||
|
protected:
|
||
|
virtual char *GetDataPointer( void );
|
||
|
memhandle_t m_hCache;
|
||
|
|
||
|
private:
|
||
|
CAudioSourceMP3Cache( const CAudioSourceMP3Cache & );
|
||
|
|
||
|
unsigned int m_bNoSentence : 1;
|
||
|
};
|
||
|
|
||
|
bool Audio_IsMP3( const char *pName );
|
||
|
CAudioSource *Audio_CreateStreamedMP3( CSfxTable *pSfx );
|
||
|
CAudioSource *Audio_CreateMemoryMP3( CSfxTable *pSfx );
|
||
|
|
||
|
#endif // SND_MP3_SOURCE_H
|