aboutsummaryrefslogtreecommitdiff
path: root/mp/src/public/mouthinfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/public/mouthinfo.h')
-rw-r--r--mp/src/public/mouthinfo.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/mp/src/public/mouthinfo.h b/mp/src/public/mouthinfo.h
new file mode 100644
index 00000000..2d0b7a48
--- /dev/null
+++ b/mp/src/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