diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/scenemanager/wavefile.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'utils/scenemanager/wavefile.cpp')
| -rw-r--r-- | utils/scenemanager/wavefile.cpp | 379 |
1 files changed, 379 insertions, 0 deletions
diff --git a/utils/scenemanager/wavefile.cpp b/utils/scenemanager/wavefile.cpp new file mode 100644 index 0000000..96d4ded --- /dev/null +++ b/utils/scenemanager/wavefile.cpp @@ -0,0 +1,379 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "wavefile.h" +#include "sentence.h" +#include "iscenemanagersound.h" +#include "SoundEmitterSystem/isoundemittersystembase.h" +#include "snd_wave_source.h" +#include "cmdlib.h" +#include "workspacemanager.h" +#include "vcdfile.h" +#include "workspacebrowser.h" +#include "multiplerequest.h" +#include "UtlBuffer.h" +#include "scenemanager_tools.h" + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *name - +//----------------------------------------------------------------------------- +CWaveFile::CWaveFile( CVCDFile *vcd, CSoundEntry *se, char const *filename ) + : m_pOwner( vcd ), m_pOwnerSE( se ) +{ + m_bSentenceLoaded = false; + + m_Sentence.Reset(); + + Q_strncpy( m_szName, filename, sizeof( m_szName ) ); + + m_pWaveFile = NULL; + + Q_snprintf( m_szFileName, sizeof( m_szFileName ), "sound/%s", filename ); +} + +CWaveFile::~CWaveFile() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : int +//----------------------------------------------------------------------------- +int CWaveFile::GetLanguageId() +{ + return GetWorkspaceManager()->GetLanguageId(); +} + +void CWaveFile::EnsureSentence() +{ + if ( m_bSentenceLoaded ) + return; + + m_bSentenceLoaded = true; + + if ( m_szFileName[ 0 ] ) + { + SceneManager_LoadSentenceFromWavFile( m_szFileName, m_Sentence ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CWaveFile::HasLoadedSentenceInfo() const +{ + return m_bSentenceLoaded; +} + + +CVCDFile *CWaveFile::GetOwnerVCDFile() +{ + return m_pOwner; +} + +CSoundEntry *CWaveFile::GetOwnerSoundEntry() +{ + return m_pOwnerSE; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *name - +//----------------------------------------------------------------------------- +void CWaveFile::SetName( char const *filename ) +{ + if ( !Q_stricmp( m_szName, filename ) ) + return; + + Q_strncpy( m_szName, filename, sizeof( m_szName ) ); + + Q_snprintf( m_szFileName, sizeof( m_szFileName ), "sound/%s", filename ); + + if ( m_szFileName[ 0 ] ) + { + SceneManager_LoadSentenceFromWavFile( m_szFileName, m_Sentence ); + m_bSentenceLoaded = true; + } +} + +char const *CWaveFile::GetName() const +{ + return m_szName; +} + +char const *CWaveFile::GetFileName() const +{ + return m_szFileName; +} + +char const *CWaveFile::GetSentenceText() +{ + EnsureSentence(); + return m_Sentence.GetText(); +} + +void CWaveFile::SetSentenceText( char const *newText ) +{ + EnsureSentence(); + if ( !Q_stricmp( GetSentenceText(), newText ) ) + return; + + if ( !IsCheckedOut() ) + { + int retval = MultipleRequest( va( "Check out '%s'?", GetFileName() ) ); + if ( retval != 0 ) + return; + + VSS_Checkout( GetFileName() ); + } + + m_Sentence.SetText( newText ); + + SceneManager_SaveSentenceToWavFile( GetFileName(), m_Sentence ); +} + +void CWaveFile::ValidateTree( mxTreeView *tree, mxTreeViewItem* parent ) +{ +} + +void CWaveFile::Play() +{ + if ( !m_pWaveFile ) + { + m_pWaveFile = sound->FindOrAddSound( m_szFileName ); + } + + if ( !m_pWaveFile ) + { + Con_Printf( "Can't play '%s', no wave file loaded\n", GetFileName() ); + return; + } + + Con_Printf( "Playing '%s' : '%s'\n", GetFileName(), GetSentenceText() ); + + CAudioMixer *temp; + sound->PlaySound( m_pWaveFile, &temp ); +} + +bool CWaveFile::GetVoiceDuck() +{ + EnsureSentence(); + return m_Sentence.GetVoiceDuck(); +} + +void CWaveFile::SetVoiceDuck( bool duck ) +{ + EnsureSentence(); + if ( GetVoiceDuck() == duck ) + return; + + m_Sentence.SetVoiceDuck( duck ); + + if ( !IsCheckedOut() ) + { + int retval = MultipleRequest( va( "Check out '%s'?", GetFileName() ) ); + if ( retval != 0 ) + return; + + VSS_Checkout( GetFileName() ); + } + + SceneManager_SaveSentenceToWavFile( GetFileName(), m_Sentence ); +} + +void CWaveFile::ToggleVoiceDucking() +{ + EnsureSentence(); + m_Sentence.SetVoiceDuck( !m_Sentence.GetVoiceDuck() ); + + if ( !IsCheckedOut() ) + { + int retval = MultipleRequest( va( "Check out '%s'?", GetFileName() ) ); + if ( retval != 0 ) + return; + + VSS_Checkout( GetFileName() ); + } + + SceneManager_SaveSentenceToWavFile( GetFileName(), m_Sentence ); +} + +bool CWaveFile::IsCheckedOut() const +{ + return filesystem->IsFileWritable( GetFileName() ); +} + +int CWaveFile::GetIconIndex() const +{ + if ( IsCheckedOut() ) + { + return IMAGE_WAV_CHECKEDOUT; + } + else + { + return IMAGE_WAV; + } +} + + +void CWaveFile::Checkout(bool updatestateicons /*= true*/) +{ + VSS_Checkout( GetFileName(), updatestateicons ); +} + +void CWaveFile::Checkin(bool updatestateicons /*= true*/) +{ + VSS_Checkin( GetFileName(), updatestateicons ); +} + + +void CWaveFile::MoveChildUp( ITreeItem *child ) +{ +} + +void CWaveFile::MoveChildDown( ITreeItem *child ) +{ +} + +void CWaveFile::SetDirty( bool dirty ) +{ + if ( GetOwnerVCDFile() ) + { + GetOwnerVCDFile()->SetDirty( dirty ); + } +} + +bool CWaveFile::IsChildFirst( ITreeItem *child ) +{ + return false; +} + +bool CWaveFile::IsChildLast( ITreeItem *child ) +{ + return false; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : sentence - +//----------------------------------------------------------------------------- +void CWaveFile::SetThreadLoadedSentence( CSentence& sentence ) +{ + if ( m_bSentenceLoaded ) + return; + + m_bSentenceLoaded = true; + m_Sentence = sentence; +} + +#define WORD_DATA_EXTENSION ".txt" + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *tempfile - +//----------------------------------------------------------------------------- +void CWaveFile::ExportValveDataChunk( char const *tempfile ) +{ + EnsureSentence(); + + if ( m_Sentence.m_Words.Count() <= 0 ) + { + Con_ColorPrintf( ERROR_R, ERROR_G, ERROR_B, "CWaveFile::ExportValveDataChunk: Sentence has no word data\n" ); + return; + } + + SafeCreatePath( va( "%s%s", SceneManager_GetGameDirectory(), (char *)tempfile ) ); + + FileHandle_t fh = filesystem->Open( tempfile, "wb" ); + if ( !fh ) + { + Con_ColorPrintf( ERROR_R, ERROR_G, ERROR_B, "CWaveFile::ExportValveDataChunk: Unable to write to %s (read-only?)\n", tempfile ); + return; + } + else + { + // Buffer and dump data + CUtlBuffer buf( 0, 0, CUtlBuffer::TEXT_BUFFER ); + + m_Sentence.SaveToBuffer( buf ); + + filesystem->Write( buf.Base(), buf.TellPut(), fh ); + filesystem->Close(fh); + + Con_Printf( "Exported %i words to %s\n", m_Sentence.m_Words.Count(), tempfile ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *tempfile - +//----------------------------------------------------------------------------- +void CWaveFile::ImportValveDataChunk( char const *tempfile ) +{ + EnsureSentence(); + + FileHandle_t fh = filesystem->Open( tempfile, "rb" ); + if ( !fh ) + { + Con_ColorPrintf( ERROR_R, ERROR_G, ERROR_B, "CWaveFile::ImportValveDataChunk: Unable to read from %s\n", tempfile ); + return; + } + + int len = filesystem->Size( fh ); + if ( len <= 4 ) + { + Con_ColorPrintf( ERROR_R, ERROR_G, ERROR_B, "CWaveFile::ImportValveDataChunk: File %s has length 0\n", tempfile ); + return; + } + + CSentence newSentence; + + unsigned char *buf = new unsigned char[ len + 1 ]; + + filesystem->Read( buf, len, fh ); + filesystem->Close( fh ); + + newSentence.InitFromDataChunk( (void *)( buf ), len ); + + delete[] buf; + + // See if we can write it out... + if ( !IsCheckedOut() ) + { + int retval = MultipleRequest( va( "Check out '%s'?", GetFileName() ) ); + if ( retval != 0 ) + return; + + VSS_Checkout( GetFileName() ); + } + + if ( !IsCheckedOut() ) + { + MakeFileWriteable( GetFileName() ); + Con_Printf( "Unable to check out %s, forcing it to be writable instead!\n", GetFileName() ); + } + + Con_Printf( "Imported %i words from %s\n", newSentence.m_Words.Count(), tempfile ); + + m_Sentence = newSentence; + + SceneManager_SaveSentenceToWavFile( GetFileName(), m_Sentence ); +} + +void CWaveFile::GetPhonemeExportFile( char *path, int maxlen ) +{ + char relative[ 512 ]; + strcpy( relative, GetFileName() ); + Q_StripExtension( relative, relative, sizeof( relative ) ); + Q_DefaultExtension( relative, WORD_DATA_EXTENSION, sizeof( relative ) ); + + Q_snprintf( path, maxlen, "phonemes/%s", relative ); + Q_FixSlashes( path ); +} + |