source-engine/utils/voice_tweak/voice_tweak.cpp

257 lines
6.3 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//
//=============================================================================//
// voice_tweak.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include <assert.h>
#include "voice_tweak.h"
#include "waveout.h"
#include "voice_tweakDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//extern IVoiceRecord* CreateVoiceRecord_WaveIn(int sampleRate);
extern IVoiceRecord* CreateVoiceRecord_DSound(int sampleRate);
typedef enum
{
LANGUAGE_ENGLISH=0,
LANGUAGE_SPANISH=1,
LANGUAGE_FRENCH=2,
LANGUAGE_ITALIAN=3,
LANGUAGE_GERMAN=4,
LANGUAGE_COUNT=5
} VoiceTweakLanguageID;
VoiceTweakLanguageID g_CurrentLanguage = LANGUAGE_ENGLISH;
#define LANGENTRY(name) {IDS_##name##, IDS_SPANISH_##name##, IDS_FRENCH_##name##, IDS_ITALIAN_##name##, IDS_GERMAN_##name##}
int g_StringIDs[][LANGUAGE_COUNT] =
{
LANGENTRY(HELPTEXT),
LANGENTRY(ERROR),
LANGENTRY(CANTFINDMICBOOST),
LANGENTRY(CANTFINDMICVOLUME),
LANGENTRY(CANTFINDMICMUTE),
LANGENTRY(CANTCREATEWAVEIN),
LANGENTRY(CANTLOADVOICEMODULE),
LANGENTRY(CANTCREATEWAVEOUT),
LANGENTRY(NODPLAYVOICE),
LANGENTRY(WINDOWTITLE),
LANGENTRY(OKAY),
LANGENTRY(CANCEL),
LANGENTRY(SYSTEMSETUP),
LANGENTRY(HELP),
LANGENTRY(VOICEINPUT),
LANGENTRY(VOLUME),
LANGENTRY(ENABLEGAIN),
};
#define NUM_STRINGIDS (sizeof(g_StringIDs)/sizeof(g_StringIDs[0]))
// Pass in the english string ID, and this returns the string ID in the current language.
int MapLanguageStringID( int idEnglish )
{
for( int i=0; i < NUM_STRINGIDS; i++ )
{
if( idEnglish == g_StringIDs[i][LANGUAGE_ENGLISH] )
return g_StringIDs[i][g_CurrentLanguage];
}
assert( !"MapLanguageStringID: unknown string ID" );
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CVoiceTweakApp
BEGIN_MESSAGE_MAP(CVoiceTweakApp, CWinApp)
//{{AFX_MSG_MAP(CVoiceTweakApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVoiceTweakApp construction
CVoiceTweakApp::CVoiceTweakApp()
{
m_pVoiceRecord = 0;
m_pWaveOut = 0;
m_pMixerControls = 0;
}
CVoiceTweakApp::~CVoiceTweakApp()
{
StopDevices();
}
bool CVoiceTweakApp::StartDevices()
{
StopDevices();
CString str, errStr;
// Setup wave in.
if( !(m_pVoiceRecord = CreateVoiceRecord_DSound(VOICE_TWEAK_SAMPLE_RATE)) )
{
//if( !(m_pVoiceRecord = CreateVoiceRecord_WaveIn(VOICE_TWEAK_SAMPLE_RATE)) )
{
str.LoadString( MapLanguageStringID(IDS_CANTCREATEWAVEIN) );
::MessageBox(NULL, str, errStr, MB_OK);
return false;
}
}
m_pVoiceRecord->RecordStart();
if( !(m_pWaveOut = CreateWaveOut(VOICE_TWEAK_SAMPLE_RATE)) )
{
str.LoadString( MapLanguageStringID(IDS_CANTCREATEWAVEOUT) );
::MessageBox(NULL, str, errStr, MB_OK);
return false;
}
return true;
}
void CVoiceTweakApp::StopDevices()
{
if(m_pVoiceRecord)
{
m_pVoiceRecord->Release();
m_pVoiceRecord = NULL;
}
if(m_pWaveOut)
{
m_pWaveOut->Release();
m_pWaveOut = NULL;
}
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CVoiceTweakApp object
CVoiceTweakApp theApp;
char const* FindArg(char const *pName)
{
for(int i=0; i < __argc; i++)
if(stricmp(__argv[i], pName) == 0)
return ((i+1) < __argc) ? __argv[i+1] : "";
return NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CVoiceTweakApp initialization
BOOL CVoiceTweakApp::InitInstance()
{
// Set the thread locale so it grabs the string resources for the right language. If
// we don't have resources for the system default language, it just uses English.
if( FindArg("-french") )
g_CurrentLanguage = LANGUAGE_FRENCH;
else if( FindArg("-spanish") )
g_CurrentLanguage = LANGUAGE_SPANISH;
else if(FindArg("-italian"))
g_CurrentLanguage = LANGUAGE_ITALIAN;
else if(FindArg("-german"))
g_CurrentLanguage = LANGUAGE_GERMAN;
else
g_CurrentLanguage = LANGUAGE_ENGLISH;
CString errStr, str;
errStr.LoadString( MapLanguageStringID(IDS_ERROR) );
m_pMixerControls = GetMixerControls();
// Initialize the mixer controls.
bool bFoundVolume, bFoundMute;
float volume, mute;
bFoundVolume = m_pMixerControls->GetValue_Float(IMixerControls::Control::MicVolume, volume);
bFoundMute = m_pMixerControls->GetValue_Float(IMixerControls::Control::MicMute, mute);
if(!bFoundVolume)
{
str.LoadString( MapLanguageStringID(IDS_CANTFINDMICVOLUME) );
::MessageBox(NULL, str, errStr, MB_OK);
return FALSE;
}
if(!bFoundMute)
{
str.LoadString( MapLanguageStringID(IDS_CANTFINDMICMUTE) );
::MessageBox(NULL, str, errStr, MB_OK);
return FALSE;
}
// Set mute and boost for them automatically.
m_pMixerControls->SetValue_Float(IMixerControls::Control::MicMute, 1);
// We cycle the mic boost because for some reason Windows misses the first call to set it to 1, but
// if the user clicks the checkbox on and off again, it works.
m_pMixerControls->SetValue_Float(IMixerControls::Control::MicBoost, 1);
m_pMixerControls->SetValue_Float(IMixerControls::Control::MicBoost, 0);
m_pMixerControls->SetValue_Float(IMixerControls::Control::MicBoost, 1);
// Enable the mic for wave input.
m_pMixerControls->SelectMicrophoneForWaveInput();
if(!StartDevices())
return false;
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CVoiceTweakDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}