diff options
Diffstat (limited to 'public/mouthinfo.h')
| -rw-r--r-- | public/mouthinfo.h | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/public/mouthinfo.h b/public/mouthinfo.h new file mode 100644 index 0000000..e474db7 --- /dev/null +++ b/public/mouthinfo.h @@ -0,0 +1,197 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Workfile: $ +// $Date: $ +// +//----------------------------------------------------------------------------- +// $Log: $ +// +// $NoKeywords: $ +//=============================================================================// +#if !defined( MOUTHINFO_H ) +#define MOUTHINFO_H +#ifdef _WIN32 +#pragma once +#endif + +class CAudioSource; + +#pragma pack(push,4) +class CVoiceData +{ +public: + CVoiceData( void ) + { + m_flElapsed = 0.0f; + m_pAudioSource = NULL; + m_bIgnorePhonemes = false; + } + + void SetElapsedTime( float t ) + { + m_flElapsed = t; + } + + float GetElapsedTime() const + { + return m_flElapsed; + } + + void SetSource( CAudioSource *source, bool bIgnorePhonemes ) + { + m_pAudioSource = source; + m_bIgnorePhonemes = bIgnorePhonemes; + } + + bool ShouldIgnorePhonemes() const + { + return m_bIgnorePhonemes; + } + + CAudioSource *GetSource() + { + return m_pAudioSource; + } + +private: + float m_flElapsed; + CAudioSource *m_pAudioSource; + bool m_bIgnorePhonemes; +}; + +#define UNKNOWN_VOICE_SOURCE -1 + +//----------------------------------------------------------------------------- +// Purpose: Describes position of mouth for lip syncing +//----------------------------------------------------------------------------- +class CMouthInfo +{ +public: + // 0 = mouth closed, 255 = mouth agape + byte mouthopen; + // counter for running average + byte sndcount; + // running average + int sndavg; + +public: + CMouthInfo( void ) { m_nVoiceSources = 0; m_needsEnvelope = false; } + virtual ~CMouthInfo( void ) { ClearVoiceSources(); } + + int GetNumVoiceSources( void ); + CVoiceData *GetVoiceSource( int number ); + + void ClearVoiceSources( void ); + int GetIndexForSource( CAudioSource *source ); + bool IsSourceReferenced( CAudioSource *source ); + + CVoiceData *AddSource( CAudioSource *source, bool bIgnorePhonemes ); + + void RemoveSource( CAudioSource *source ); + void RemoveSourceByIndex( int index ); + + bool IsActive( void ); + bool NeedsEnvelope() { return m_needsEnvelope != 0; } + void ActivateEnvelope() { m_needsEnvelope = true; } + +private: + enum + { + MAX_VOICE_DATA = 4 + }; + + short m_nVoiceSources; + short m_needsEnvelope; + CVoiceData m_VoiceSources[ MAX_VOICE_DATA ]; +}; +#pragma pack(pop) + + +inline bool CMouthInfo::IsActive( void ) +{ + return ( GetNumVoiceSources() > 0 ) ? true : false; +} + +inline int CMouthInfo::GetNumVoiceSources( void ) +{ + return m_nVoiceSources; +} + +inline CVoiceData *CMouthInfo::GetVoiceSource( int number ) +{ + if ( number < 0 || number >= m_nVoiceSources ) + return NULL; + + return &m_VoiceSources[ number ]; +} + +inline void CMouthInfo::ClearVoiceSources( void ) +{ + m_nVoiceSources = 0; +} + +inline int CMouthInfo::GetIndexForSource( CAudioSource *source ) +{ + for ( int i = 0; i < m_nVoiceSources; i++ ) + { + CVoiceData *v = &m_VoiceSources[ i ]; + if ( !v ) + continue; + + if ( v->GetSource() == source ) + return i; + } + + return UNKNOWN_VOICE_SOURCE; +} + +inline bool CMouthInfo::IsSourceReferenced( CAudioSource *source ) +{ + if ( GetIndexForSource( source ) != UNKNOWN_VOICE_SOURCE ) + return true; + + return false; +} + +inline void CMouthInfo::RemoveSource( CAudioSource *source ) +{ + int idx = GetIndexForSource( source ); + if ( idx == UNKNOWN_VOICE_SOURCE ) + return; + + RemoveSourceByIndex( idx ); +} + +inline void CMouthInfo::RemoveSourceByIndex( int index ) +{ + if ( index < 0 || index >= m_nVoiceSources ) + return; + + m_VoiceSources[ index ] = m_VoiceSources[ --m_nVoiceSources ]; +} + +inline CVoiceData *CMouthInfo::AddSource( CAudioSource *source, bool bIgnorePhonemes ) +{ + int idx = GetIndexForSource( source ); + if ( idx == UNKNOWN_VOICE_SOURCE ) + { + if ( m_nVoiceSources < MAX_VOICE_DATA ) + { + idx = m_nVoiceSources++; + } + else + { + // No room! + return NULL; + } + } + + CVoiceData *data = &m_VoiceSources[ idx ]; + data->SetSource( source, bIgnorePhonemes ); + data->SetElapsedTime( 0.0f ); + return data; +} + +#endif // MOUTHINFO_H
\ No newline at end of file |