You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
6.3 KiB
256 lines
6.3 KiB
//========= 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; |
|
}
|
|
|