📄 soundfx.cpp
字号:
EnablePlayUI( hDlg, TRUE );
}
HRESULT OnPlaySound( HWND hDlg )
{
HRESULT hr;
DWORD dwCreationFlags;
DWORD dwLooped;
DWORD i;
BOOL bLooped = ( IsDlgButtonChecked( hDlg, IDC_CHECK_LOOP ) == BST_CHECKED );
dwCreationFlags = DSBCAPS_CTRLFX;
g_lpFXManager->DisableAllFX( );
SAFE_DELETE( g_lpSound );
if( FAILED( hr = g_lpSoundManager->Create( &g_lpSound, g_tszFilename,
dwCreationFlags, GUID_NULL ) ) )
{
DXTRACE_ERR( TEXT("Create"), hr );
if( hr == DSERR_BUFFERTOOSMALL )
{
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Wave file is too short (less than 150ms) for effect processing.") );
}
else
{
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Could not create sound buffer.") );
}
return S_FALSE;
}
g_lpFXManager->Initialize( g_lpSound->GetBuffer( 0 ), FALSE );
for( i = IDC_CHECK_CHORUS; i <= IDC_CHECK_REVERB; i++ )
{
if( IsDlgButtonChecked( hDlg, i ) == BST_CHECKED )
g_lpFXManager->SetFXEnable( i - IDC_CHECK_CHORUS );
}
if( FAILED( hr = g_lpFXManager->ActivateFX( ) ) )
goto LFail;
if( FAILED( hr = g_lpFXManager->LoadCurrentFXParameters( ) ) )
goto LFail;
dwLooped = bLooped ? DSBPLAY_LOOPING : 0L;
if( FAILED( hr = g_lpSound->Play( 0, dwLooped ) ) )
return DXTRACE_ERR( TEXT("Play"), hr );
EnablePlayUI( hDlg, FALSE );
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound playing.") );
return S_OK;
LFail:
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Effects creation failed. Some effects may not support 8-bit wave files.") );
return S_OK;
}
VOID OnOpenSoundFile( HWND hDlg )
{
static TCHAR strFileName[MAX_PATH] = TEXT("");
static TCHAR strPath[MAX_PATH] = TEXT("");
OPENFILENAME ofn = { sizeof(OPENFILENAME), hDlg, NULL,
TEXT("Wave Files\0*.wav\0All Files\0*.*\0\0"), NULL,
0, 1, strFileName, MAX_PATH, NULL, 0, strPath,
TEXT("Open Sound File"),
OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0,
TEXT(".wav"), 0, NULL, NULL };
if( '\0' == strPath[0] )
{
if( GetWindowsDirectory( strPath, MAX_PATH ) != 0 )
{
if( strcmp( &strPath[strlen(strPath)], TEXT("\\") ) )
strcat( strPath, TEXT("\\") );
strcat( strPath, TEXT("MEDIA") );
}
}
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Loading file...") );
g_lpFXManager->DisableAllFX( );
if( TRUE != GetOpenFileName( &ofn ) )
{
SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("No file loaded.") );
return;
}
SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
if( FAILED( ValidateWaveFile( hDlg, strFileName ) ) )
{
SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
return;
}
EnablePlayUI( hDlg, TRUE );
strcpy( strPath, strFileName );
char* strLastSlash = strrchr( strPath, '\\' );
if( strLastSlash )
strLastSlash[0] = '\0';
}
VOID OnTimer( HWND hDlg )
{
if( IsWindowEnabled( GetDlgItem( hDlg, IDC_BUTTON_STOP ) ) )
{
if( g_lpSound && !g_lpSound->IsSoundPlaying() )
{
EnablePlayUI( hDlg, TRUE );
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound stopped.") );
}
}
}
VOID EnablePlayUI( HWND hDlg, BOOL bEnable )
{
if( bEnable )
{
EnableWindow( GetDlgItem( hDlg, IDC_CHECK_LOOP ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), TRUE );
EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
SetFocus( GetDlgItem( hDlg, IDC_BUTTON_PLAY ) );
}
else
{
EnableWindow( GetDlgItem( hDlg, IDC_CHECK_LOOP ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), TRUE );
SetFocus( GetDlgItem( hDlg, IDC_BUTTON_STOP ) );
}
for( DWORD i = IDC_CHECK_CHORUS; i <= IDC_CHECK_REVERB; i++ )
EnableWindow( GetDlgItem( hDlg, i ), bEnable );
}
VOID ResetParameterUI( HWND hwndDlg )
{
HWND hwndItem;
DWORD i;
for ( i = IDC_PARAM_NAME1; i <= IDC_PARAM_MAX6; i++ )
{
hwndItem = GetDlgItem( hwndDlg, i );
SendMessage( hwndItem, WM_SETTEXT, 0, ( LPARAM ) TEXT( "- - -" ) );
EnableWindow( hwndItem, FALSE );
}
for ( i = IDC_SLIDER1; i <= IDC_SLIDER6; i += 5 )
{
PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETRANGEMIN, FALSE, DEFAULT_SLIDER_MIN );
PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETRANGEMAX, FALSE, DEFAULT_SLIDER_MAX );
PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETLINESIZE, FALSE, DEFAULT_SLIDER_INC );
PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETPOS, TRUE, 0 );
}
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_TRIANGLE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SQUARE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SINE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_WAVEFORM ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_NEG_180 ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_NEG_90 ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_ZERO ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_90 ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_180 ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_PHASE ), FALSE );
}
VOID EnableSingleParameter( HWND hwndDlg, DWORD resID )
{
for ( DWORD i = resID; i < resID + 5; i++ )
EnableWindow( GetDlgItem( hwndDlg, i ), TRUE );
}
VOID PosSlider( HWND hwndDlg, DWORD dwSlider, FLOAT val, FLOAT min, FLOAT max,
FLOAT fSliderInc )
{
HWND hwndSlider = GetDlgItem( hwndDlg, dwSlider );
LONG lSliderInc = (LONG) ( (fSliderInc / (max - min)) * DEFAULT_SLIDER_MAX );
PostMessage( hwndSlider, TBM_SETLINESIZE, FALSE, lSliderInc );
FLOAT res = ( val - min ) / ( max - min );
if( res < 0.0f )
res = 0.0f;
else if( res > 1.0f )
res = 1.0f;
LONG pos = (LONG) ( res * DEFAULT_SLIDER_MAX );
PostMessage( hwndSlider, TBM_SETPOS, TRUE, pos );
}
VOID LoadSingleParameter( HWND hwndDlg, DWORD id, const TCHAR * tszName, FLOAT val,
FLOAT min, FLOAT max, FLOAT fSliderInc = 0.1f,
DWORD dwPrecision = 1 )
{
TCHAR tszstr[MAX_PATH];
EnableSingleParameter( hwndDlg, id );
SendMessage( GetDlgItem( hwndDlg, id ), WM_SETTEXT, 0, ( LPARAM ) tszName );
switch( dwPrecision )
{
case 0:
sprintf( tszstr, "%.0f", val );
SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
sprintf( tszstr, "%.0f", min );
SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
sprintf( tszstr, "%.0f", max );
SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
break;
case 1:
sprintf( tszstr, "%.1f", val );
SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
sprintf( tszstr, "%.1f", min );
SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
sprintf( tszstr, "%.1f", max );
SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
break;
default:
case 2:
sprintf( tszstr, "%.2f", val );
SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
sprintf( tszstr, "%.2f", min );
SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
sprintf( tszstr, "%.2f", max );
SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
break;
}
PosSlider( hwndDlg, id + 2, val, min, max, fSliderInc );
}
VOID SaveSingleParameter( HWND hwndDlg, DWORD id, FLOAT * val, FLOAT min, FLOAT max, DWORD dwPrecision = 1 )
{
TCHAR tszstr[MAX_PATH];
DWORD pos = ( DWORD ) SendMessage( GetDlgItem( hwndDlg, id + 2), TBM_GETPOS, 0, 0 );
FLOAT percent = ( FLOAT ) ( pos - DEFAULT_SLIDER_MIN ) / ( FLOAT ) ( DEFAULT_SLIDER_MAX - DEFAULT_SLIDER_MIN );
*val = percent * ( max - min ) + min;
switch( dwPrecision )
{
case 0:
sprintf( tszstr, "%.0f", *val );
break;
case 1:
sprintf( tszstr, "%.1f", *val );
break;
case 2:
default:
sprintf( tszstr, "%.2f", *val );
break;
}
SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -