mirror of https://github.com/PCSX2/pcsx2.git
625 lines
20 KiB
C++
625 lines
20 KiB
C++
///GiGaHeRz's SPU2 Driver
|
||
//Copyright (c) 2003-2008, David Quintana <gigaherz@gmail.com>
|
||
//
|
||
//This library is free software; you can redistribute it and/or
|
||
//modify it under the terms of the GNU Lesser General Public
|
||
//License as published by the Free Software Foundation; either
|
||
//version 2.1 of the License, or (at your option) any later version.
|
||
//
|
||
//This library is distributed in the hope that it will be useful,
|
||
//but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
//Lesser General Public License for more details.
|
||
//
|
||
//You should have received a copy of the GNU Lesser General Public
|
||
//License along with this library; if not, write to the Free Software
|
||
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
//
|
||
|
||
#include "spu2.h"
|
||
#include "dialogs.h"
|
||
// Config Vars
|
||
|
||
|
||
static bool VolumeBoostEnabled = false;
|
||
static int VolumeShiftModifier = 0;
|
||
|
||
#ifndef PUBLIC
|
||
static const int LATENCY_MAX = 2000;
|
||
#else
|
||
static const int LATENCY_MAX = 500;
|
||
#endif
|
||
|
||
static const int LATENCY_MIN = 40;
|
||
|
||
|
||
// DEBUG
|
||
|
||
bool DebugEnabled=false;
|
||
bool _MsgToConsole=false;
|
||
bool _MsgKeyOnOff=false;
|
||
bool _MsgVoiceOff=false;
|
||
bool _MsgDMA=false;
|
||
bool _MsgAutoDMA=false;
|
||
bool _MsgOverruns=false;
|
||
bool _MsgCache=false;
|
||
|
||
bool _AccessLog=false;
|
||
bool _DMALog=false;
|
||
bool _WaveLog=false;
|
||
|
||
bool _CoresDump=false;
|
||
bool _MemDump=false;
|
||
bool _RegDump=false;
|
||
|
||
|
||
|
||
char AccessLogFileName[255];
|
||
char WaveLogFileName[255];
|
||
|
||
char DMA4LogFileName[255];
|
||
char DMA7LogFileName[255];
|
||
|
||
char CoresDumpFileName[255];
|
||
char MemDumpFileName[255];
|
||
char RegDumpFileName[255];
|
||
|
||
int WaveDumpFormat;
|
||
|
||
int AutoDMAPlayRate[2]={0,0};
|
||
|
||
// MIXING
|
||
int Interpolation=1;
|
||
/* values:
|
||
0: no interpolation (use nearest)
|
||
1. linear interpolation
|
||
2. cubic interpolation
|
||
*/
|
||
|
||
bool EffectsEnabled=false;
|
||
|
||
// OUTPUT
|
||
int SampleRate=48000;
|
||
int SndOutLatencyMS=160;
|
||
//int SndOutLatency=1024;
|
||
//int MaxBufferCount=8;
|
||
//int CurBufferCount=MaxBufferCount;
|
||
bool timeStretchEnabled=true;
|
||
|
||
u32 OutputModule=0; //OUTPUT_DSOUND;
|
||
|
||
//int VolumeMultiplier=1;
|
||
//int VolumeDivisor=1;
|
||
|
||
int LimitMode=0;
|
||
/* values:
|
||
0. No limiter
|
||
1. Soft limiter -- less cpu-intensive, but can cause problems
|
||
2. Hard limiter -- more cpu-intensive while limiting, but should give better (constant) speeds
|
||
*/
|
||
|
||
|
||
CONFIG_DSOUNDOUT Config_DSoundOut;
|
||
CONFIG_DSOUND51 Config_DSound51;
|
||
CONFIG_WAVEOUT Config_WaveOut;
|
||
CONFIG_ASIO Config_Asio;
|
||
|
||
// MISC
|
||
bool LimiterToggleEnabled=false;
|
||
int LimiterToggle=VK_SUBTRACT;
|
||
|
||
// DSP
|
||
bool dspPluginEnabled=false;
|
||
char dspPlugin[256];
|
||
int dspPluginModule=0;
|
||
|
||
// OUTPUT MODULES
|
||
char AsioDriver[129]="";
|
||
|
||
|
||
//////
|
||
|
||
const char NewCfgFile[]="inis\\SPU2Ghz-v2.ini";
|
||
const char LegacyCfgFile[]="inis\\SPU2Ghz.ini";
|
||
const char* CfgFile=NewCfgFile;
|
||
|
||
|
||
/*| Config File Format: |<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*\
|
||
+--+---------------------+------------------------+
|
||
| |
|
||
| Option=Value |
|
||
| |
|
||
| |
|
||
| Boolean Values: TRUE,YES,1,T,Y mean 'true', |
|
||
| everything else means 'false'. |
|
||
| |
|
||
| All Values are limited to 255 chars. |
|
||
| |
|
||
+-------------------------------------------------+
|
||
\*_____________________________________________*/
|
||
|
||
|
||
void CfgWriteBool(const char *Section, const char*Name, bool Value) {
|
||
char *Data=Value?"TRUE":"FALSE";
|
||
|
||
WritePrivateProfileString(Section,Name,Data,CfgFile);
|
||
}
|
||
|
||
void CfgWriteInt(const char *Section, const char*Name, int Value) {
|
||
char Data[255];
|
||
_itoa(Value,Data,10);
|
||
|
||
WritePrivateProfileString(Section,Name,Data,CfgFile);
|
||
}
|
||
|
||
void CfgWriteStr(const char *Section, const char* Name, const char *Data) {
|
||
WritePrivateProfileString(Section,Name,Data,CfgFile);
|
||
}
|
||
|
||
/*****************************************************************************/
|
||
|
||
bool CfgReadBool(const char *Section,const char *Name,bool Default) {
|
||
char Data[255]="";
|
||
GetPrivateProfileString(Section,Name,"",Data,255,CfgFile);
|
||
Data[254]=0;
|
||
if(strlen(Data)==0) {
|
||
CfgWriteBool(Section,Name,Default);
|
||
return Default;
|
||
}
|
||
|
||
if(strcmp(Data,"1")==0) return true;
|
||
if(strcmp(Data,"Y")==0) return true;
|
||
if(strcmp(Data,"T")==0) return true;
|
||
if(strcmp(Data,"YES")==0) return true;
|
||
if(strcmp(Data,"TRUE")==0) return true;
|
||
return false;
|
||
}
|
||
|
||
|
||
int CfgReadInt(const char *Section, const char*Name,int Default) {
|
||
char Data[255]="";
|
||
GetPrivateProfileString(Section,Name,"",Data,255,CfgFile);
|
||
Data[254]=0;
|
||
|
||
if(strlen(Data)==0) {
|
||
CfgWriteInt(Section,Name,Default);
|
||
return Default;
|
||
}
|
||
|
||
return atoi(Data);
|
||
}
|
||
|
||
|
||
void CfgReadStr(const char *Section, const char* Name, char *Data, int DataSize, const char *Default) {
|
||
GetPrivateProfileString(Section,Name,"",Data,DataSize,CfgFile);
|
||
|
||
if(strlen(Data)==0) {
|
||
sprintf_s( Data, DataSize, "%s", Default );
|
||
CfgWriteStr(Section,Name,Data);
|
||
}
|
||
}
|
||
|
||
// Tries to read the requested value.
|
||
// Returns FALSE if the value isn't found.
|
||
bool CfgFindName( const char *Section, const char* Name)
|
||
{
|
||
// Only load 24 characters. No need to load more.
|
||
char Data[24]="";
|
||
GetPrivateProfileString(Section,Name,"",Data,24,CfgFile);
|
||
Data[23]=0;
|
||
|
||
if(strlen(Data)==0) return false;
|
||
return true;
|
||
}
|
||
/*****************************************************************************/
|
||
|
||
void ReadSettings()
|
||
{
|
||
DebugEnabled=CfgReadBool("DEBUG","Global_Debug_Enabled",0);
|
||
_MsgToConsole=CfgReadBool("DEBUG","Show_Messages",0);
|
||
_MsgKeyOnOff =CfgReadBool("DEBUG","Show_Messages_Key_On_Off",0);
|
||
_MsgVoiceOff =CfgReadBool("DEBUG","Show_Messages_Voice_Off",0);
|
||
_MsgDMA =CfgReadBool("DEBUG","Show_Messages_DMA_Transfer",0);
|
||
_MsgAutoDMA =CfgReadBool("DEBUG","Show_Messages_AutoDMA",0);
|
||
_MsgOverruns =CfgReadBool("DEBUG","Show_Messages_Overruns",0);
|
||
_MsgCache =CfgReadBool("DEBUG","Show_Messages_CacheStats",0);
|
||
|
||
_AccessLog =CfgReadBool("DEBUG","Log_Register_Access",0);
|
||
_DMALog =CfgReadBool("DEBUG","Log_DMA_Transfers",0);
|
||
_WaveLog =CfgReadBool("DEBUG","Log_WAVE_Output",0);
|
||
|
||
_CoresDump =CfgReadBool("DEBUG","Dump_Info",0);
|
||
_MemDump =CfgReadBool("DEBUG","Dump_Memory",0);
|
||
_RegDump =CfgReadBool("DEBUG","Dump_Regs",0);
|
||
|
||
CfgReadStr("DEBUG","Access_Log_Filename",AccessLogFileName,255,"logs\\SPU2Log.txt");
|
||
CfgReadStr("DEBUG","WaveLog_Filename", WaveLogFileName, 255,"logs\\SPU2log.wav");
|
||
CfgReadStr("DEBUG","DMA4Log_Filename", DMA4LogFileName, 255,"logs\\SPU2dma4.dat");
|
||
CfgReadStr("DEBUG","DMA7Log_Filename", DMA7LogFileName, 255,"logs\\SPU2dma7.dat");
|
||
|
||
CfgReadStr("DEBUG","Info_Dump_Filename",CoresDumpFileName,255,"logs\\SPU2Cores.txt");
|
||
CfgReadStr("DEBUG","Mem_Dump_Filename", MemDumpFileName, 255,"logs\\SPU2mem.dat");
|
||
CfgReadStr("DEBUG","Reg_Dump_Filename", RegDumpFileName, 255,"logs\\SPU2regs.dat");
|
||
|
||
WaveDumpFormat=CfgReadInt("DEBUG","Wave_Log_Format",0);
|
||
|
||
|
||
AutoDMAPlayRate[0]=CfgReadInt("MIXING","AutoDMA_Play_Rate_0",0);
|
||
AutoDMAPlayRate[1]=CfgReadInt("MIXING","AutoDMA_Play_Rate_1",0);
|
||
|
||
Interpolation=CfgReadInt("MIXING","Interpolation",1);
|
||
|
||
// Moved Timestretch from DSP to Output
|
||
timeStretchEnabled = CfgReadBool(
|
||
CfgFindName( "OUTPUT", "Timestretch_Enable" ) ? "OUTPUT" : "DSP",
|
||
"Timestretch_Enable", true
|
||
);
|
||
|
||
// Moved Effects_Enable from Effects to Mixing
|
||
EffectsEnabled = CfgReadBool(
|
||
CfgFindName( "MIXING", "Enable_Effects" ) ? "MIXING" : "EFFECTS",
|
||
"Enable_Effects", false
|
||
);
|
||
EffectsEnabled = false; // force disabled for now.
|
||
|
||
SampleRate=CfgReadInt("OUTPUT","Sample_Rate",48000);
|
||
SndOutLatencyMS=CfgReadInt("OUTPUT","Latency", 160);
|
||
|
||
//OutputModule = CfgReadInt("OUTPUT","Output_Module", OUTPUT_DSOUND );
|
||
char omodid[128];
|
||
CfgReadStr( "OUTPUT", "Output_Module", omodid, 127, XAudio2Out->GetIdent() );
|
||
|
||
// find the driver index of this module:
|
||
OutputModule = FindOutputModuleById( omodid );
|
||
|
||
VolumeShiftModifier = CfgReadInt( "OUTPUT","Volume_Shift", 1 );
|
||
LimitMode=CfgReadInt("OUTPUT","Speed_Limit_Mode",0);
|
||
|
||
CfgReadStr("DSP PLUGIN","Filename",dspPlugin,255,"");
|
||
dspPluginModule = CfgReadInt("DSP PLUGIN","ModuleNum",0);
|
||
dspPluginEnabled= CfgReadBool("DSP PLUGIN","Enabled",false);
|
||
|
||
LimiterToggleEnabled = CfgReadBool("KEYS","Limiter_Toggle_Enabled",false);
|
||
LimiterToggle = CfgReadInt ("KEYS","Limiter_Toggle",VK_SUBTRACT);
|
||
|
||
// Read DSOUNDOUT and WAVEOUT configs:
|
||
CfgReadStr( "DSOUNDOUT", "Device", Config_DSoundOut.Device, 254, "default" );
|
||
CfgReadStr( "WAVEOUT", "Device", Config_WaveOut.Device, 254, "default" );
|
||
Config_DSoundOut.NumBuffers = CfgReadInt( "DSOUNDOUT", "Buffer_Count", 5 );
|
||
Config_WaveOut.NumBuffers = CfgReadInt( "WAVEOUT", "Buffer_Count", 4 );
|
||
|
||
// Read DSOUND51 config:
|
||
CfgReadStr( "DSOUND51", "Device", Config_DSound51.Device, 254, "default" );
|
||
Config_DSound51.NumBuffers = CfgReadInt( "DSOUND51", "Buffer_Count", 5 );
|
||
Config_DSound51.GainL =CfgReadInt("DSOUND51","Channel_Gain_L", 256);
|
||
Config_DSound51.GainR =CfgReadInt("DSOUND51","Channel_Gain_R", 256);
|
||
Config_DSound51.GainC =CfgReadInt("DSOUND51","Channel_Gain_C", 256);
|
||
Config_DSound51.GainLFE=CfgReadInt("DSOUND51","Channel_Gain_LFE",256);
|
||
Config_DSound51.GainSL =CfgReadInt("DSOUND51","Channel_Gain_SL", 200);
|
||
Config_DSound51.GainSR =CfgReadInt("DSOUND51","Channel_Gain_SR", 200);
|
||
Config_DSound51.AddCLR =CfgReadInt("DSOUND51","Channel_Center_In_LR", 56);
|
||
Config_DSound51.LowpassLFE = CfgReadInt("DSOUND51","LFE_Lowpass_Frequency", 80);
|
||
|
||
// Read ASIOOUT config:
|
||
CfgReadStr("ASIO","Asio_Driver_Name",AsioDriver,128,"");
|
||
|
||
// Sanity Checks
|
||
// -------------
|
||
|
||
SampleRate = 48000; // Yup nothing else is supported for now.
|
||
VolumeShiftModifier = min( max( VolumeShiftModifier, -2 ), 2 );
|
||
SndOutVolumeShift = SndOutVolumeShiftBase - VolumeShiftModifier;
|
||
SndOutLatencyMS = min( max( SndOutLatencyMS, LATENCY_MIN ), LATENCY_MAX );
|
||
|
||
Config_DSoundOut.NumBuffers = min( max( Config_DSoundOut.NumBuffers, 2 ), 8 );
|
||
Config_WaveOut.NumBuffers = min( max( Config_DSoundOut.NumBuffers, 3 ), 8 );
|
||
|
||
if( mods[OutputModule] == NULL )
|
||
{
|
||
// Unsupported or legacy module.
|
||
fprintf( stderr, " * SPU2: Unknown output module '%s' specified in configuration file.\n", omodid );
|
||
fprintf( stderr, " * SPU2: Defaulting to DirectSound (%s).\n", DSoundOut->GetIdent() );
|
||
OutputModule = FindOutputModuleById( DSoundOut->GetIdent() );
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/*****************************************************************************/
|
||
|
||
void WriteSettings()
|
||
{
|
||
CfgWriteBool("DEBUG","Global_Debug_Enabled",DebugEnabled);
|
||
|
||
// [Air] : Commented out so that we retain debug settings even if disabled...
|
||
//if(DebugEnabled)
|
||
{
|
||
CfgWriteBool("DEBUG","Show_Messages", _MsgToConsole);
|
||
CfgWriteBool("DEBUG","Show_Messages_Key_On_Off", _MsgKeyOnOff);
|
||
CfgWriteBool("DEBUG","Show_Messages_Voice_Off", _MsgVoiceOff);
|
||
CfgWriteBool("DEBUG","Show_Messages_DMA_Transfer",_MsgDMA);
|
||
CfgWriteBool("DEBUG","Show_Messages_AutoDMA", _MsgAutoDMA);
|
||
CfgWriteBool("DEBUG","Show_Messages_Overruns", _MsgOverruns);
|
||
CfgWriteBool("DEBUG","Show_Messages_CacheStats", _MsgCache);
|
||
|
||
CfgWriteBool("DEBUG","Log_Register_Access",_AccessLog);
|
||
CfgWriteBool("DEBUG","Log_DMA_Transfers", _DMALog);
|
||
CfgWriteBool("DEBUG","Log_WAVE_Output", _WaveLog);
|
||
|
||
CfgWriteBool("DEBUG","Dump_Info", _CoresDump);
|
||
CfgWriteBool("DEBUG","Dump_Memory",_MemDump);
|
||
CfgWriteBool("DEBUG","Dump_Regs", _RegDump);
|
||
|
||
CfgWriteStr("DEBUG","Access_Log_Filename",AccessLogFileName);
|
||
CfgWriteStr("DEBUG","WaveLog_Filename", WaveLogFileName);
|
||
CfgWriteStr("DEBUG","DMA4Log_Filename", DMA4LogFileName);
|
||
CfgWriteStr("DEBUG","DMA7Log_Filename", DMA7LogFileName);
|
||
|
||
CfgWriteStr("DEBUG","Info_Dump_Filename",CoresDumpFileName);
|
||
CfgWriteStr("DEBUG","Mem_Dump_Filename", MemDumpFileName);
|
||
CfgWriteStr("DEBUG","Reg_Dump_Filename", RegDumpFileName);
|
||
|
||
CfgWriteInt("DEBUG","Wave_Log_Format", WaveDumpFormat);
|
||
}
|
||
|
||
CfgWriteInt("MIXING","Interpolation",Interpolation);
|
||
|
||
CfgWriteInt("MIXING","AutoDMA_Play_Rate_0",AutoDMAPlayRate[0]);
|
||
CfgWriteInt("MIXING","AutoDMA_Play_Rate_1",AutoDMAPlayRate[1]);
|
||
|
||
CfgWriteBool("MIXING","Enable_Effects",EffectsEnabled);
|
||
|
||
CfgWriteStr("OUTPUT","Output_Module",mods[OutputModule]->GetIdent() );
|
||
CfgWriteInt("OUTPUT","Sample_Rate",SampleRate);
|
||
CfgWriteInt("OUTPUT","Latency",SndOutLatencyMS);
|
||
CfgWriteBool("OUTPUT","Timestretch_Enable",timeStretchEnabled);
|
||
CfgWriteInt("OUTPUT","Speed_Limit_Mode",LimitMode);
|
||
|
||
CfgWriteInt("OUTPUT","Volume_Shift",SndOutVolumeShiftBase - SndOutVolumeShift);
|
||
|
||
if( strlen( Config_DSoundOut.Device ) == 0 ) strcpy( Config_DSoundOut.Device, "default" );
|
||
if( strlen( Config_DSound51.Device ) == 0 ) strcpy( Config_DSound51.Device, "default" );
|
||
if( strlen( Config_WaveOut.Device ) == 0 ) strcpy( Config_WaveOut.Device, "default" );
|
||
|
||
CfgWriteStr("DSOUNDOUT","Device",Config_DSoundOut.Device);
|
||
CfgWriteInt("DSOUNDOUT","Buffer_Count",Config_DSoundOut.NumBuffers);
|
||
|
||
CfgWriteStr("WAVEOUT","Device",Config_WaveOut.Device);
|
||
CfgWriteInt("WAVEOUT","Buffer_Count",Config_WaveOut.NumBuffers);
|
||
|
||
CfgWriteStr("DSOUND51","Device",Config_DSound51.Device);
|
||
CfgWriteInt("DSOUND51","Buffer_Count", Config_DSound51.NumBuffers);
|
||
CfgWriteInt("DSOUND51","Channel_Gain_L", Config_DSound51.GainL);
|
||
CfgWriteInt("DSOUND51","Channel_Gain_R", Config_DSound51.GainR);
|
||
CfgWriteInt("DSOUND51","Channel_Gain_C", Config_DSound51.GainC);
|
||
CfgWriteInt("DSOUND51","Channel_Gain_LFE",Config_DSound51.GainLFE);
|
||
CfgWriteInt("DSOUND51","Channel_Gain_SL", Config_DSound51.GainSL);
|
||
CfgWriteInt("DSOUND51","Channel_Gain_SR", Config_DSound51.GainSR);
|
||
CfgWriteInt("DSOUND51","Channel_Center_In_LR", Config_DSound51.AddCLR);
|
||
CfgWriteInt("DSOUND51","LFE_Lowpass_Frequency", Config_DSound51.LowpassLFE);
|
||
|
||
CfgWriteStr("ASIO","Asio_Driver_Name",AsioDriver);
|
||
|
||
CfgWriteStr("DSP PLUGIN","Filename",dspPlugin);
|
||
CfgWriteInt("DSP PLUGIN","ModuleNum",dspPluginModule);
|
||
CfgWriteBool("DSP PLUGIN","Enabled",dspPluginEnabled);
|
||
|
||
CfgWriteBool("KEYS","Limiter_Toggle_Enabled",LimiterToggleEnabled);
|
||
CfgWriteInt ("KEYS","Limiter_Toggle",LimiterToggle);
|
||
}
|
||
|
||
static void EnableDebugMessages( HWND hWnd )
|
||
{
|
||
ENABLE_CONTROL(IDC_MSGSHOW, DebugEnabled);
|
||
ENABLE_CONTROL(IDC_MSGKEY, MsgToConsole());
|
||
ENABLE_CONTROL(IDC_MSGVOICE,MsgToConsole());
|
||
ENABLE_CONTROL(IDC_MSGDMA, MsgToConsole());
|
||
ENABLE_CONTROL(IDC_MSGADMA, MsgDMA());
|
||
ENABLE_CONTROL(IDC_DBG_OVERRUNS, MsgToConsole());
|
||
ENABLE_CONTROL(IDC_DBG_CACHE, MsgToConsole());
|
||
}
|
||
|
||
static void EnableDebugControls( HWND hWnd )
|
||
{
|
||
EnableDebugMessages( hWnd );
|
||
ENABLE_CONTROL(IDC_LOGREGS, DebugEnabled);
|
||
ENABLE_CONTROL(IDC_LOGDMA, DebugEnabled);
|
||
ENABLE_CONTROL(IDC_LOGWAVE, DebugEnabled);
|
||
ENABLE_CONTROL(IDC_DUMPCORE,DebugEnabled);
|
||
ENABLE_CONTROL(IDC_DUMPMEM, DebugEnabled);
|
||
ENABLE_CONTROL(IDC_DUMPREGS,DebugEnabled);
|
||
}
|
||
|
||
static int myWidth, myDebugWidth;
|
||
static int myHeight;
|
||
static bool debugShow = false;
|
||
|
||
BOOL CALLBACK ConfigProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
|
||
{
|
||
int wmId,wmEvent;
|
||
char temp[384]={0};
|
||
|
||
switch(uMsg)
|
||
{
|
||
|
||
case WM_PAINT:
|
||
return FALSE;
|
||
|
||
case WM_INITDIALOG:
|
||
|
||
// If debugging is enabled, show the debug box by default:
|
||
debugShow = DebugEnabled;
|
||
|
||
SendMessage(GetDlgItem(hWnd,IDC_SRATE),CB_RESETCONTENT,0,0);
|
||
SendMessage(GetDlgItem(hWnd,IDC_SRATE),CB_ADDSTRING,0,(LPARAM)"16000");
|
||
SendMessage(GetDlgItem(hWnd,IDC_SRATE),CB_ADDSTRING,0,(LPARAM)"22050");
|
||
SendMessage(GetDlgItem(hWnd,IDC_SRATE),CB_ADDSTRING,0,(LPARAM)"24000");
|
||
SendMessage(GetDlgItem(hWnd,IDC_SRATE),CB_ADDSTRING,0,(LPARAM)"32000");
|
||
SendMessage(GetDlgItem(hWnd,IDC_SRATE),CB_ADDSTRING,0,(LPARAM)"44100");
|
||
SendMessage(GetDlgItem(hWnd,IDC_SRATE),CB_ADDSTRING,0,(LPARAM)"48000");
|
||
|
||
sprintf_s(temp,48,"%d",SampleRate);
|
||
SetDlgItemText(hWnd,IDC_SRATE,temp);
|
||
|
||
SendMessage(GetDlgItem(hWnd,IDC_INTERPOLATE),CB_RESETCONTENT,0,0);
|
||
SendMessage(GetDlgItem(hWnd,IDC_INTERPOLATE),CB_ADDSTRING,0,(LPARAM)"0 - Nearest (none/fast)");
|
||
SendMessage(GetDlgItem(hWnd,IDC_INTERPOLATE),CB_ADDSTRING,0,(LPARAM)"1 - Linear (recommended)");
|
||
SendMessage(GetDlgItem(hWnd,IDC_INTERPOLATE),CB_ADDSTRING,0,(LPARAM)"2 - Cubic (better/slower)");
|
||
SendMessage(GetDlgItem(hWnd,IDC_INTERPOLATE),CB_SETCURSEL,Interpolation,0);
|
||
|
||
SendMessage(GetDlgItem(hWnd,IDC_OUTPUT),CB_RESETCONTENT,0,0);
|
||
|
||
{
|
||
int modidx = 0;
|
||
while( mods[modidx] != NULL )
|
||
{
|
||
sprintf_s( temp, 72, "%d - %s", modidx, mods[modidx]->GetLongName() );
|
||
SendMessage(GetDlgItem(hWnd,IDC_OUTPUT),CB_ADDSTRING,0,(LPARAM)temp);
|
||
++modidx;
|
||
}
|
||
SendMessage(GetDlgItem(hWnd,IDC_OUTPUT),CB_SETCURSEL,OutputModule,0);
|
||
}
|
||
|
||
//INIT_SLIDER(IDC_BUFFER,512,16384,4096,2048,512);
|
||
INIT_SLIDER( IDC_LATENCY_SLIDER, LATENCY_MIN, LATENCY_MAX, 100, 20, 5 );
|
||
|
||
SendMessage(GetDlgItem(hWnd,IDC_LATENCY_SLIDER),TBM_SETPOS,TRUE,SndOutLatencyMS);
|
||
sprintf_s(temp,80,"%d ms (avg)",SndOutLatencyMS);
|
||
SetWindowText(GetDlgItem(hWnd,IDC_LATENCY_LABEL),temp);
|
||
|
||
EnableDebugControls( hWnd );
|
||
|
||
// Debugging / Logging Flags:
|
||
SET_CHECK(IDC_EFFECTS, EffectsEnabled);
|
||
SET_CHECK(IDC_DEBUG, DebugEnabled);
|
||
SET_CHECK(IDC_MSGSHOW, _MsgToConsole);
|
||
SET_CHECK(IDC_MSGKEY, _MsgKeyOnOff);
|
||
SET_CHECK(IDC_MSGVOICE,_MsgVoiceOff);
|
||
SET_CHECK(IDC_MSGDMA, _MsgDMA);
|
||
SET_CHECK(IDC_MSGADMA, _MsgAutoDMA);
|
||
SET_CHECK(IDC_DBG_OVERRUNS, _MsgOverruns );
|
||
SET_CHECK(IDC_DBG_CACHE, _MsgCache );
|
||
SET_CHECK(IDC_LOGREGS, _AccessLog);
|
||
SET_CHECK(IDC_LOGDMA, _DMALog);
|
||
SET_CHECK(IDC_LOGWAVE, _WaveLog);
|
||
SET_CHECK(IDC_DUMPCORE,_CoresDump);
|
||
SET_CHECK(IDC_DUMPMEM, _MemDump);
|
||
SET_CHECK(IDC_DUMPREGS,_RegDump);
|
||
|
||
SET_CHECK(IDC_SPEEDLIMIT,LimitMode);
|
||
SET_CHECK(IDC_SPEEDLIMIT_RUNTIME_TOGGLE,LimiterToggleEnabled);
|
||
SET_CHECK(IDC_DSP_ENABLE,dspPluginEnabled);
|
||
SET_CHECK(IDC_TS_ENABLE,timeStretchEnabled);
|
||
|
||
VolumeBoostEnabled = ( VolumeShiftModifier > 0 ) ? true : false;
|
||
SET_CHECK(IDC_VOLBOOST, VolumeBoostEnabled );
|
||
|
||
break;
|
||
|
||
case WM_COMMAND:
|
||
wmId = LOWORD(wParam);
|
||
wmEvent = HIWORD(wParam);
|
||
// Parse the menu selections:
|
||
switch (wmId)
|
||
{
|
||
case IDOK:
|
||
GetDlgItemText(hWnd,IDC_SRATE,temp,20);
|
||
temp[19]=0;
|
||
SampleRate=atoi(temp);
|
||
|
||
SndOutLatencyMS = (int)SendMessage( GetDlgItem( hWnd, IDC_LATENCY_SLIDER ), TBM_GETPOS, 0, 0 );
|
||
|
||
if( SndOutLatencyMS > LATENCY_MAX ) SndOutLatencyMS = LATENCY_MAX;
|
||
if( SndOutLatencyMS < LATENCY_MIN ) SndOutLatencyMS = LATENCY_MIN;
|
||
|
||
Interpolation=(int)SendMessage(GetDlgItem(hWnd,IDC_INTERPOLATE),CB_GETCURSEL,0,0);
|
||
OutputModule=(int)SendMessage(GetDlgItem(hWnd,IDC_OUTPUT),CB_GETCURSEL,0,0);
|
||
|
||
WriteSettings();
|
||
EndDialog(hWnd,0);
|
||
break;
|
||
case IDCANCEL:
|
||
EndDialog(hWnd,0);
|
||
break;
|
||
|
||
case IDC_OUTCONF:
|
||
SndConfigure( hWnd,
|
||
(int)SendMessage(GetDlgItem(hWnd,IDC_OUTPUT),CB_GETCURSEL,0,0)
|
||
);
|
||
break;
|
||
|
||
HANDLE_CHECKNB( IDC_VOLBOOST, VolumeBoostEnabled );
|
||
VolumeShiftModifier = (VolumeBoostEnabled ? 1 : 0 );
|
||
SndOutVolumeShift = SndOutVolumeShiftBase - VolumeShiftModifier;
|
||
break;
|
||
|
||
HANDLE_CHECK(IDC_EFFECTS,EffectsEnabled);
|
||
HANDLE_CHECKNB(IDC_DEBUG,DebugEnabled);
|
||
EnableDebugControls( hWnd );
|
||
break;
|
||
HANDLE_CHECKNB(IDC_MSGSHOW,_MsgToConsole);
|
||
EnableDebugMessages( hWnd );
|
||
break;
|
||
HANDLE_CHECK(IDC_MSGKEY,_MsgKeyOnOff);
|
||
HANDLE_CHECK(IDC_MSGVOICE,_MsgVoiceOff);
|
||
HANDLE_CHECKNB(IDC_MSGDMA,_MsgDMA);
|
||
ENABLE_CONTROL(IDC_MSGADMA, MsgDMA());
|
||
break;
|
||
HANDLE_CHECK(IDC_MSGADMA,_MsgAutoDMA);
|
||
HANDLE_CHECK(IDC_DBG_OVERRUNS,_MsgOverruns);
|
||
HANDLE_CHECK(IDC_DBG_CACHE,_MsgCache);
|
||
HANDLE_CHECK(IDC_LOGREGS,_AccessLog);
|
||
HANDLE_CHECK(IDC_LOGDMA, _DMALog);
|
||
HANDLE_CHECK(IDC_LOGWAVE,_WaveLog);
|
||
HANDLE_CHECK(IDC_DUMPCORE,_CoresDump);
|
||
HANDLE_CHECK(IDC_DUMPMEM, _MemDump);
|
||
HANDLE_CHECK(IDC_DUMPREGS,_RegDump);
|
||
HANDLE_CHECK(IDC_DSP_ENABLE,dspPluginEnabled);
|
||
HANDLE_CHECK(IDC_TS_ENABLE,timeStretchEnabled);
|
||
HANDLE_CHECK(IDC_SPEEDLIMIT,LimitMode);
|
||
HANDLE_CHECK(IDC_SPEEDLIMIT_RUNTIME_TOGGLE,LimiterToggleEnabled);
|
||
default:
|
||
return FALSE;
|
||
}
|
||
break;
|
||
case WM_HSCROLL:
|
||
wmId = LOWORD(wParam);
|
||
wmEvent = HIWORD(wParam);
|
||
switch(wmId) {
|
||
//case TB_ENDTRACK:
|
||
//case TB_THUMBPOSITION:
|
||
case TB_LINEUP:
|
||
case TB_LINEDOWN:
|
||
case TB_PAGEUP:
|
||
case TB_PAGEDOWN:
|
||
wmEvent=(int)SendMessage((HWND)lParam,TBM_GETPOS,0,0);
|
||
case TB_THUMBTRACK:
|
||
if(wmEvent<LATENCY_MIN) wmEvent=LATENCY_MIN;
|
||
if(wmEvent>LATENCY_MAX) wmEvent=LATENCY_MAX;
|
||
SendMessage((HWND)lParam,TBM_SETPOS,TRUE,wmEvent);
|
||
sprintf_s(temp,80,"%d ms (avg)",wmEvent);
|
||
SetDlgItemText(hWnd,IDC_LATENCY_LABEL,temp);
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
break;
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
void configure()
|
||
{
|
||
INT_PTR ret;
|
||
ReadSettings();
|
||
ret=DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_CONFIG),GetActiveWindow(),(DLGPROC)ConfigProc,1);
|
||
if(ret==-1)
|
||
{
|
||
MessageBoxEx(GetActiveWindow(),"Error Opening the config dialog.","OMG ERROR!",MB_OK,0);
|
||
return;
|
||
}
|
||
ReadSettings();
|
||
}
|