mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-10 03:18:50 +08:00
178 lines
3.3 KiB
C++
178 lines
3.3 KiB
C++
#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
|
|
|
|
class CMouthInfo
|
|
{
|
|
public:
|
|
byte mouthopen;
|
|
byte sndcount;
|
|
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
|
|
{
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
CVoiceData* data = &m_VoiceSources[idx];
|
|
data->SetSource(source, bIgnorePhonemes);
|
|
data->SetElapsedTime(0.0f);
|
|
return data;
|
|
}
|
|
|
|
#endif |