157 lines
4.0 KiB
C++
157 lines
4.0 KiB
C++
//========= 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
|