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.
257 lines
6.3 KiB
257 lines
6.3 KiB
5 years ago
|
//========= 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;
|
||
|
}
|