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.
197 lines
3.9 KiB
197 lines
3.9 KiB
//========= 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
|