summaryrefslogtreecommitdiff
path: root/utils/scenemanager/soundproperties.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/scenemanager/soundproperties.cpp')
-rw-r--r--utils/scenemanager/soundproperties.cpp616
1 files changed, 616 insertions, 0 deletions
diff --git a/utils/scenemanager/soundproperties.cpp b/utils/scenemanager/soundproperties.cpp
new file mode 100644
index 0000000..a2e8053
--- /dev/null
+++ b/utils/scenemanager/soundproperties.cpp
@@ -0,0 +1,616 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+#include "cbase.h"
+#include <mxtk/mx.h>
+#include <stdio.h>
+#include "resource.h"
+#include "SoundProperties.h"
+#include "SoundEmitterSystem/isoundemittersystembase.h"
+#include "soundentry.h"
+#include "cmdlib.h"
+#include "workspacemanager.h"
+#include "wavebrowser.h"
+#include "wavefile.h"
+#include "waveproperties.h"
+
+static CSoundParams g_Params;
+
+static void PopulateChannelList( HWND wnd, CSoundParametersInternal *p )
+{
+ HWND control = GetDlgItem( wnd, IDC_CHANNEL );
+ if ( !control )
+ {
+ return;
+ }
+
+ SendMessage( control, CB_RESETCONTENT, 0, 0 );
+ if ( p )
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->ChannelToString() );
+ }
+ else
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)"CHAN_VOICE" );
+ }
+
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_VOICE" );
+
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_AUTO" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_WEAPON" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_ITEM" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_BODY" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_STREAM" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"CHAN_STATIC" );
+}
+
+static void PopulateVolumeList( HWND wnd, CSoundParametersInternal *p )
+{
+ HWND control = GetDlgItem( wnd, IDC_VOLUME );
+ if ( !control )
+ {
+ return;
+ }
+
+ SendMessage( control, CB_RESETCONTENT, 0, 0 );
+
+ if ( p )
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->VolumeToString() );
+ }
+ else
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)"VOL_NORM" );
+ }
+
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"VOL_NORM" );
+}
+
+static void PopulateSoundlevelList( HWND wnd, CSoundParametersInternal *p )
+{
+ HWND control = GetDlgItem( wnd, IDC_SOUNDLEVEL );
+ if ( !control )
+ {
+ return;
+ }
+
+ SendMessage( control, CB_RESETCONTENT, 0, 0 );
+
+ if ( p )
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->SoundLevelToString() );
+ }
+ else
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)"SNDLVL_NORM" );
+ }
+
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_NORM" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_NONE" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_IDLE" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_TALKING" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_STATIC" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_GUNFIRE" );
+
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_25dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_30dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_35dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_40dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_45dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_50dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_55dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_60dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_65dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_70dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_75dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_80dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_85dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_90dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_95dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_100dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_105dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_120dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_130dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_140dB" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"SNDLVL_150dB" );
+}
+
+static void PopulatePitchList( HWND wnd, CSoundParametersInternal *p )
+{
+ HWND control = GetDlgItem( wnd, IDC_PITCH );
+ if ( !control )
+ {
+ return;
+ }
+
+ SendMessage( control, CB_RESETCONTENT, 0, 0 );
+
+ if ( p )
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)p->PitchToString() );
+ }
+ else
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)"PITCH_NORM" );
+ }
+
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"PITCH_NORM" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"PITCH_LOW" );
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)"PITCH_HIGH" );
+}
+
+
+static void PopulateScriptList( HWND wnd, char const *curscript )
+{
+ HWND control = GetDlgItem( wnd, IDC_SOUNDSCRIPT );
+ if ( !control )
+ {
+ return;
+ }
+
+ SendMessage( control, CB_RESETCONTENT, 0, 0 );
+
+ if ( curscript )
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)curscript );
+ }
+
+ int c = g_pSoundEmitterSystem->GetNumSoundScripts();
+ for ( int i = 0; i < c; i++ )
+ {
+ // add text to combo box
+ SendMessage( control, CB_ADDSTRING, 0, (LPARAM)g_pSoundEmitterSystem->GetSoundScriptName( i ) );
+
+ if ( !curscript && i == 0 )
+ {
+ SendMessage( control, WM_SETTEXT , 0, (LPARAM)g_pSoundEmitterSystem->GetSoundScriptName( i ) );
+ }
+ }
+}
+
+static bool WaveLessFunc( const char *const& name1, const char *const& name2 )
+{
+ if ( stricmp( name1, name2 ) < 0 )
+ return true;
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : wnd -
+// Output : static void
+//-----------------------------------------------------------------------------
+static void PopulateWaveList( HWND wnd, CSoundParametersInternal *p )
+{
+ HWND control = GetDlgItem( wnd, IDC_WAVELIST );
+ if ( !control )
+ return;
+
+ // Remove all
+ SendMessage( control, LB_RESETCONTENT, 0, 0 );
+
+ if ( !p )
+ return;
+
+ CUtlRBTree< char const *, int > m_SortedNames( 0, 0, WaveLessFunc );
+
+ int c = p->NumSoundNames();
+ for ( int i = 0; i < c; i++ )
+ {
+ char const *name = strdup( g_pSoundEmitterSystem->GetWaveName( p->GetSoundNames()[ i ].symbol ) );
+
+ m_SortedNames.Insert( name );
+ }
+
+ int j = m_SortedNames.FirstInorder();
+ while ( j != m_SortedNames.InvalidIndex() )
+ {
+ char const *name = m_SortedNames[ j ];
+ if ( name && name[ 0 ] )
+ {
+ SendMessage( control, LB_ADDSTRING, 0, (LPARAM)name );
+ }
+
+ delete name;
+
+ j = m_SortedNames.NextInorder( j );
+ }
+}
+
+static void PopulateWaveList_Available( HWND wnd )
+{
+ HWND control = GetDlgItem( wnd, IDC_WAVELIST_AVAILABLE );
+ if ( !control )
+ return;
+
+ CWaveBrowser *wb = GetWorkspaceManager()->GetWaveBrowser();
+ if ( !wb )
+ {
+ Assert( 0 );
+ return;
+ }
+
+ CUtlRBTree< char const *, int > m_SortedNames( 0, 0, WaveLessFunc );
+
+ int c = wb->GetSoundCount();;
+ for ( int i = 0; i < c; i++ )
+ {
+ CWaveFile *entry = wb->GetSound( i );
+ if ( !entry )
+ continue;
+
+ char const *name = entry->GetName();
+ m_SortedNames.Insert( name );
+ }
+
+ // Remove all
+ SendMessage( control, LB_RESETCONTENT, 0, 0 );
+
+ int j = m_SortedNames.FirstInorder();
+ while ( j != m_SortedNames.InvalidIndex() )
+ {
+ char const *name = m_SortedNames[ j ];
+ if ( name && name[ 0 ] )
+ {
+ SendMessage( control, LB_ADDSTRING, 0, (LPARAM)name );
+ }
+
+ j = m_SortedNames.NextInorder( j );
+ }
+}
+
+static void SoundProperties_GetSelectedWaveList( HWND hwndDlg, HWND control, CUtlVector< int >& list )
+{
+ if ( !control )
+ return;
+
+ int count = SendMessage( control, LB_GETSELCOUNT, 0, 0 );
+ if ( count == LB_ERR )
+ return;
+
+ int *s = new int[ count ];
+
+ SendMessage( control, LB_GETSELITEMS, count, (LPARAM)s );
+
+ for ( int i = 0 ;i < count; i++ )
+ {
+ list.AddToTail( s[ i ] );
+ }
+
+ delete[] s;
+}
+
+static const char *SoundProperties_GetSelectedWave( HWND hwndDlg, HWND control, int *item = NULL )
+{
+ if ( item )
+ *item = -1;
+
+ if ( !control )
+ return NULL;
+
+ int selectedionindex = SendMessage( control, LB_GETCURSEL, 0, 0 );
+ if ( selectedionindex == LB_ERR )
+ return NULL;
+
+ static char itemtext[ 256 ];
+ SendMessage( control, LB_GETTEXT, selectedionindex, (LPARAM)itemtext );
+
+ if ( item )
+ {
+ *item = selectedionindex;
+ }
+
+ return itemtext;
+}
+
+static void SoundProperties_OnOK( HWND hwndDlg )
+{
+ CSoundParametersInternal outparams;
+
+ // Gather info and make changes
+ CSoundEntry *item = g_Params.items[ 0 ];
+
+ int soundindex = -1;
+ char const *script = NULL;
+
+ char outsoundname[ 256 ];
+ char outscriptfile[ 256 ];
+
+ GetDlgItemText( hwndDlg, IDC_SOUNDNAME, outsoundname, sizeof( outsoundname ) );
+ GetDlgItemText( hwndDlg, IDC_SOUNDSCRIPT, outscriptfile, sizeof( outscriptfile ) );
+
+ if ( !g_Params.addsound )
+ {
+ soundindex = g_pSoundEmitterSystem->GetSoundIndex( item->GetName() );
+ script = g_pSoundEmitterSystem->GetSourceFileForSound( soundindex );
+ }
+
+ char sz[ 128 ];
+ GetDlgItemText( hwndDlg, IDC_CHANNEL, sz, sizeof( sz ) );
+ outparams.ChannelFromString( sz );
+
+ GetDlgItemText( hwndDlg, IDC_VOLUME, sz, sizeof( sz ) );
+ outparams.VolumeFromString( sz );
+
+ GetDlgItemText( hwndDlg, IDC_SOUNDLEVEL, sz, sizeof( sz ) );
+ outparams.SoundLevelFromString( sz );
+
+ GetDlgItemText( hwndDlg, IDC_PITCH, sz, sizeof( sz ) );
+ outparams.PitchFromString( sz );
+
+ bool owneronly = SendMessage( GetDlgItem( hwndDlg, IDC_OWNERONLY ), BM_GETCHECK, 0, 0 ) == BST_CHECKED ? true : false;
+
+ outparams.SetOnlyPlayToOwner( owneronly );
+
+ // Retrieve wave list
+ int c = SendMessage( GetDlgItem( hwndDlg, IDC_WAVELIST ), LB_GETCOUNT, 0, 0 );
+
+ for ( int i = 0; i < c; i++ )
+ {
+ char wavename[ 256 ];
+ SendMessage( GetDlgItem( hwndDlg, IDC_WAVELIST ), LB_GETTEXT, i, (LPARAM)wavename );
+
+ CUtlSymbol sym = g_pSoundEmitterSystem->AddWaveName( wavename );
+ SoundFile sf;
+ sf.symbol = sym;
+ sf.gender = GENDER_NONE;
+ outparams.AddSoundName( sf );
+ }
+
+ if ( g_Params.addsound )
+ {
+ g_pSoundEmitterSystem->AddSound( outsoundname, outscriptfile, outparams );
+ }
+ else
+ {
+ // Update sound stuff
+ g_pSoundEmitterSystem->MoveSound( item->GetName(), outscriptfile );
+ item->SetScriptFile( outscriptfile );
+ g_pSoundEmitterSystem->UpdateSoundParameters( item->GetName(), outparams );
+ // Rename if necessary
+ g_pSoundEmitterSystem->RenameSound( item->GetName(), outsoundname );
+ }
+
+ // Apply changes
+ item->SetName( outsoundname );
+
+ // Repopulate things
+ GetWorkspaceManager()->RefreshBrowsers();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : hwndDlg -
+// uMsg -
+// wParam -
+// lParam -
+// Output : static BOOL CALLBACK
+//-----------------------------------------------------------------------------
+static BOOL CALLBACK SoundPropertiesDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ switch(uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ g_Params.PositionSelf( hwndDlg );
+
+ CSoundEntry *item = NULL;
+
+ CSoundParametersInternal *p = NULL;
+ char const *script = NULL;
+
+ if ( g_Params.addsound )
+ {
+ Assert( g_Params.items.Count() == 0 );
+
+ CSoundEntry *entry = new CSoundEntry( NULL, "Unnamed" );
+ g_Params.items.AddToTail( entry );
+
+ item = item = g_Params.items[ 0 ];
+
+ SendMessage( GetDlgItem( hwndDlg, IDC_OWNERONLY ), BM_SETCHECK,
+ ( WPARAM )BST_UNCHECKED,
+ ( LPARAM )0 );
+
+ SetDlgItemText( hwndDlg, IDC_STATIC_SENTENCETEXT, "" );
+ SetDlgItemTextW( hwndDlg, IDC_STATIC_CLOSECAPTION, L"" );
+ }
+ else
+ {
+ item = g_Params.items[ 0 ];
+
+ int soundindex = g_pSoundEmitterSystem->GetSoundIndex( item->GetName() );
+
+ script = g_pSoundEmitterSystem->GetSourceFileForSound( soundindex );
+
+ p = g_pSoundEmitterSystem->InternalGetParametersForSound( soundindex );
+ Assert( p );
+
+ SendMessage( GetDlgItem( hwndDlg, IDC_OWNERONLY ), BM_SETCHECK,
+ ( WPARAM ) p->OnlyPlayToOwner() ? BST_CHECKED : BST_UNCHECKED,
+ ( LPARAM )0 );
+
+ SetDlgItemText( hwndDlg, IDC_STATIC_SENTENCETEXT, item->GetSentenceText( 0 ) );
+ wchar_t cctext[ 1024 ];
+ item->GetCCText( cctext, sizeof( cctext ) / sizeof( wchar_t ) );
+
+ SetDlgItemTextW( hwndDlg, IDC_STATIC_CLOSECAPTION, cctext );
+ }
+
+ PopulateChannelList( hwndDlg, p );
+ PopulateVolumeList( hwndDlg, p );
+ PopulateSoundlevelList( hwndDlg, p );
+ PopulatePitchList( hwndDlg, p );
+
+ PopulateWaveList( hwndDlg, p );
+
+ SetDlgItemText( hwndDlg, IDC_SOUNDNAME, item->GetName() );
+
+ PopulateScriptList( hwndDlg, script );
+
+ PopulateWaveList_Available( hwndDlg );
+
+ SetWindowText( hwndDlg, g_Params.m_szDialogTitle );
+
+ SetFocus( GetDlgItem( hwndDlg, IDC_SOUNDNAME ) );
+ }
+ return FALSE;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ {
+ SoundProperties_OnOK( hwndDlg );
+
+ EndDialog( hwndDlg, 1 );
+ }
+ break;
+ case IDCANCEL:
+ EndDialog( hwndDlg, 0 );
+ break;
+ case IDC_WAVELIST:
+ {
+ if ( HIWORD(wParam) == LBN_SELCHANGE )
+ {
+ // Find selected item in wave list...
+ char const *wave = SoundProperties_GetSelectedWave( hwndDlg, GetDlgItem( hwndDlg, IDC_WAVELIST ) );
+ if ( wave )
+ {
+ // Look it up
+ CWaveBrowser *wb = GetWorkspaceManager()->GetWaveBrowser();
+ if ( wb )
+ {
+ CWaveFile *wavefile = wb->FindEntry( wave, true );
+ if ( wavefile )
+ {
+ SetDlgItemText( hwndDlg, IDC_STATIC_SENTENCETEXT, wavefile->GetSentenceText() );
+ }
+ }
+ }
+ }
+ }
+ break;
+ case IDC_WAVEPROPERTIES:
+ {
+ // Find selected item in wave list...
+ char const *wave = SoundProperties_GetSelectedWave( hwndDlg, GetDlgItem( hwndDlg, IDC_WAVELIST ) );
+ if ( wave )
+ {
+ // Look it up
+ CWaveBrowser *wb = GetWorkspaceManager()->GetWaveBrowser();
+ if ( wb )
+ {
+ CWaveFile *wavefile = wb->FindEntry( wave, true );
+ if ( wavefile )
+ {
+ CWaveParams wp;
+ memset( &wp, 0, sizeof( wp ) );
+
+ Q_snprintf( wp.m_szDialogTitle, sizeof( wp.m_szDialogTitle ), "Wave Properties" );
+
+ wp.items.AddToTail( wavefile );
+
+ WaveProperties( &wp );
+ }
+ }
+ }
+ }
+ break;
+ case IDC_REMOVEWAVE:
+ {
+ CUtlVector<int> selected;
+ SoundProperties_GetSelectedWaveList( hwndDlg, GetDlgItem( hwndDlg, IDC_WAVELIST ), selected );
+ int count = selected.Count();
+ if ( count >= 1 )
+ {
+ int i;
+ for ( i = 0; i < count; i++ )
+ {
+ char wavename[ 256 ];
+
+ SendMessage( GetDlgItem( hwndDlg, IDC_WAVELIST), LB_GETTEXT, selected[ i ], (LPARAM)wavename );
+
+ // Add it to global parameters, too
+ CWaveBrowser *wb = GetWorkspaceManager()->GetWaveBrowser();
+ if ( wb )
+ {
+ CWaveFile *wavefile = wb->FindEntry( wavename, true );
+ if ( wavefile )
+ {
+ CSoundEntry *item = g_Params.items[ 0 ];
+ item->RemoveWave( wavefile );
+ }
+ }
+ }
+
+ for ( i = count - 1; i >= 0; i-- )
+ {
+ // Remove them from list
+ SendMessage( GetDlgItem( hwndDlg, IDC_WAVELIST), LB_DELETESTRING, selected[ i ], 0 );
+ }
+ }
+ }
+ break;
+ case IDC_ADDWAVE:
+ {
+ CUtlVector<int> selected;
+ SoundProperties_GetSelectedWaveList( hwndDlg, GetDlgItem( hwndDlg, IDC_WAVELIST_AVAILABLE ), selected );
+ int count = selected.Count();
+ if ( count >= 1 )
+ {
+ int i;
+ for ( i = 0; i < count; i++ )
+ {
+ char wavename[ 256 ];
+
+ // Get selection wave name
+ SendMessage( GetDlgItem( hwndDlg, IDC_WAVELIST_AVAILABLE), LB_GETTEXT, selected[ i ], (LPARAM)wavename );
+
+ // Add it to global parameters, too
+ CWaveBrowser *wb = GetWorkspaceManager()->GetWaveBrowser();
+ if ( wb )
+ {
+ CWaveFile *wavefile = wb->FindEntry( wavename, true );
+ if ( wavefile )
+ {
+ CSoundEntry *item = g_Params.items[ 0 ];
+ if ( item->FindWave( wavefile ) == -1 )
+ {
+ item->AddWave( wavefile );
+ // Add it to list
+ SendMessage( GetDlgItem( hwndDlg, IDC_WAVELIST ), LB_ADDSTRING, 0, (LPARAM)wavename );
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
+ return FALSE;
+ }
+ return FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *view -
+// *actor -
+// Output : int
+//-----------------------------------------------------------------------------
+int SoundProperties( CSoundParams *params )
+{
+ g_Params = *params;
+
+ int retval = DialogBox( (HINSTANCE)GetModuleHandle( 0 ),
+ MAKEINTRESOURCE( IDD_SOUNDPROPERTIES ),
+ (HWND)GetWorkspaceManager()->getHandle(),
+ (DLGPROC)SoundPropertiesDialogProc );
+
+ *params = g_Params;
+
+ return retval;
+} \ No newline at end of file