201 lines
4.2 KiB
C
201 lines
4.2 KiB
C
|
//========= Copyright (c) 1996-2005, 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; }
|
||
|
~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_nVoiceSources;
|
||
|
if ( m_nVoiceSources > 0 )
|
||
|
{
|
||
|
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
|