This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

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