From 78684feaf76391ccdc1ec0f0c47296164c54e190 Mon Sep 17 00:00:00 2001 From: Volker Fischer Date: Sat, 1 Nov 2008 11:48:17 +0000 Subject: [PATCH] more ASIO interface changes (e.g. warning if ASIO buffer is too big, etc) --- src/clientsettingsdlg.cpp | 25 ++++++++++---- src/clientsettingsdlg.h | 3 ++ src/clientsettingsdlgbase.ui | 64 ++++++++++++++++-------------------- windows/sound.cpp | 60 ++++++++++++++++++++++----------- windows/sound.h | 1 + 5 files changed, 92 insertions(+), 61 deletions(-) diff --git a/src/clientsettingsdlg.cpp b/src/clientsettingsdlg.cpp index 5852541d..8f9bb609 100755 --- a/src/clientsettingsdlg.cpp +++ b/src/clientsettingsdlg.cpp @@ -71,9 +71,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, #else SliderSndBufIn->setRange ( 2, AUD_SLIDER_LENGTH ); #endif - const int iCurNumInBuf = pClient->GetSndInterface()->GetInNumBuf(); - SliderSndBufIn->setValue ( iCurNumInBuf ); - TextSndBufIn->setText ( "In: " + QString().setNum ( iCurNumInBuf ) ); + UpdateSndBufInSlider ( pClient->GetSndInterface()->GetInNumBuf() ); // sound buffer out #ifdef _WIN32 @@ -81,9 +79,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, #else SliderSndBufOut->setRange ( 2, AUD_SLIDER_LENGTH ); #endif - const int iCurNumOutBuf = pClient->GetSndInterface()->GetOutNumBuf(); - SliderSndBufOut->setValue ( iCurNumOutBuf ); - TextSndBufOut->setText ( "Out: " + QString().setNum ( iCurNumOutBuf ) ); + UpdateSndBufOutSlider ( pClient->GetSndInterface()->GetOutNumBuf() ); // network buffer SliderNetBuf->setRange ( 0, MAX_NET_BUF_SIZE_NUM_BL ); @@ -188,6 +184,18 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, TimerStatus.start ( DISPLAY_UPDATE_TIME ); } +void CClientSettingsDlg::UpdateSndBufInSlider ( const int iCurNumInBuf ) +{ + SliderSndBufIn->setValue ( iCurNumInBuf ); + TextSndBufIn->setText ( "In: " + QString().setNum ( iCurNumInBuf ) ); +} + +void CClientSettingsDlg::UpdateSndBufOutSlider ( const int iCurNumOutBuf ) +{ + SliderSndBufOut->setValue ( iCurNumOutBuf ); + TextSndBufOut->setText ( "Out: " + QString().setNum ( iCurNumOutBuf ) ); +} + void CClientSettingsDlg::showEvent ( QShowEvent* showEvent ) { // only activate ping timer if window is actually shown @@ -255,6 +263,7 @@ void CClientSettingsDlg::OnSoundCrdSelection ( int iSndDevIdx ) // recover old selection cbSoundcard->setCurrentIndex ( pClient->GetSndInterface()->GetDev() ); } + UpdateDisplay(); } void CClientSettingsDlg::OnOpenChatOnNewMessageStateChanged ( int value ) @@ -338,6 +347,10 @@ void CClientSettingsDlg::OnPingTimeResult ( int iPingTime ) void CClientSettingsDlg::UpdateDisplay() { + // update slider controls (settings might have been changed by sound interface) + UpdateSndBufInSlider ( pClient->GetSndInterface()->GetInNumBuf() ); + UpdateSndBufOutSlider ( pClient->GetSndInterface()->GetOutNumBuf() ); + if ( !pClient->IsRunning() ) { // clear text labels with client parameters diff --git a/src/clientsettingsdlg.h b/src/clientsettingsdlg.h index a41ef2cc..a8cc5a56 100755 --- a/src/clientsettingsdlg.h +++ b/src/clientsettingsdlg.h @@ -72,6 +72,9 @@ protected: virtual void showEvent ( QShowEvent* showEvent ); virtual void hideEvent ( QHideEvent* hideEvent ); + void UpdateSndBufInSlider ( const int iCurNumInBuf ); + void UpdateSndBufOutSlider ( const int iCurNumOutBuf ); + public slots: void OnTimerStatus() { UpdateDisplay(); } void OnTimerPing(); diff --git a/src/clientsettingsdlgbase.ui b/src/clientsettingsdlgbase.ui index 9fd6efb8..c98358af 100755 --- a/src/clientsettingsdlgbase.ui +++ b/src/clientsettingsdlgbase.ui @@ -5,8 +5,8 @@ 0 0 - 552 - 340 + 544 + 306 @@ -724,31 +724,27 @@ - - - - - Soundcard - - - - - - - - 0 - 0 - - - - - 153 - 0 - - - - - + + + Soundcard + + + + + + + + 0 + 0 + + + + + 153 + 0 + + + @@ -781,15 +777,11 @@ - - - - - Open chat on new message - - - - + + + Open chat on new message + + diff --git a/windows/sound.cpp b/windows/sound.cpp index 68ea0876..929dba00 100755 --- a/windows/sound.cpp +++ b/windows/sound.cpp @@ -66,6 +66,7 @@ short* psPlayBuffer; int iBufferPosPlay; bool bPlayBufferUnderrun; +int iMinNumSndBuf; int iCurNumSndBufIn; int iCurNumSndBufOut; int iNewNumSndBufIn; @@ -164,16 +165,14 @@ bool CSound::Read ( CVector& psData ) void CSound::SetInNumBuf ( int iNewNum ) { // check new parameter - if ( ( iNewNum >= MAX_SND_BUF_IN ) || ( iNewNum < 1 ) ) + if ( ( iNewNum < MAX_SND_BUF_IN ) && ( iNewNum >= iMinNumSndBuf ) ) { - iNewNum = NUM_SOUND_BUFFERS_IN; - } - - // change only if parameter is different - if ( iNewNum != iCurNumSndBufIn ) - { - iNewNumSndBufIn = iNewNum; - bChangParamIn = true; + // change only if parameter is different + if ( iNewNum != iNewNumSndBufIn ) + { + iNewNumSndBufIn = iNewNum; + bChangParamIn = true; + } } } @@ -232,16 +231,14 @@ bool CSound::Write ( CVector& psData ) void CSound::SetOutNumBuf ( int iNewNum ) { // check new parameter - if ( ( iNewNum >= MAX_SND_BUF_OUT ) || ( iNewNum < 1 ) ) + if ( ( iNewNum < MAX_SND_BUF_OUT ) && ( iNewNum >= iMinNumSndBuf ) ) { - iNewNum = NUM_SOUND_BUFFERS_OUT; - } - - // change only if parameter is different - if ( iNewNum != iCurNumSndBufOut ) - { - iNewNumSndBufOut = iNewNum; - bChangParamOut = true; + // change only if parameter is different + if ( iNewNum != iNewNumSndBufOut ) + { + iNewNumSndBufOut = iNewNum; + bChangParamOut = true; + } } } @@ -480,6 +477,31 @@ std::string CSound::PrepareDriver() } } + // calculate the minimum required number of soundcard buffers + iMinNumSndBuf = static_cast ( + ceil ( static_cast ( iASIOBufferSizeMono ) / iBufferSizeMono ) ); + + Q_ASSERT ( iMinNumSndBuf < MAX_SND_BUF_IN ); + Q_ASSERT ( iMinNumSndBuf < MAX_SND_BUF_OUT ); + + // correct number of sound card buffers if required + iCurNumSndBufIn = max ( iMinNumSndBuf, iCurNumSndBufIn ); + iCurNumSndBufOut = max ( iMinNumSndBuf, iCurNumSndBufOut ); + iNewNumSndBufIn = iCurNumSndBufIn; + iNewNumSndBufOut = iCurNumSndBufOut; + + // display warning in case the ASIO buffer is too big + if ( iMinNumSndBuf > 6 ) + { + QMessageBox::critical ( 0, APP_NAME, + QString ( "The ASIO buffer size of the selected audio driver is ") + + QString().number ( iASIOBufferSizeMono ) + + QString ( " samples which is too large. Please try to modify " + "the ASIO buffer size value in your ASIO driver settings (most ASIO " + "drivers like ASIO4All or kx allow to change the ASIO buffer size). " + "Recommended settings are 96 or 128 samples." ), "Ok", 0 ); + } + // prepare input channels for ( i = 0; i < NUM_IN_OUT_CHANNELS; i++ ) { @@ -536,7 +558,6 @@ void CSound::InitRecordingAndPlayback() ASIOMutex.lock(); // get mutex lock { - // Our buffer management ----------------------------------------------- // store new buffer number values iCurNumSndBufIn = iNewNumSndBufIn; iCurNumSndBufOut = iNewNumSndBufOut; @@ -608,6 +629,7 @@ CSound::CSound ( const int iNewBufferSizeStereo ) iCurNumSndBufIn = NUM_SOUND_BUFFERS_IN; iNewNumSndBufOut = NUM_SOUND_BUFFERS_OUT; iCurNumSndBufOut = NUM_SOUND_BUFFERS_OUT; + iMinNumSndBuf = 1; // should be initialized because an error can occur during init m_ASIOEvent = NULL; diff --git a/windows/sound.h b/windows/sound.h index 57685429..6b2ba4d1 100755 --- a/windows/sound.h +++ b/windows/sound.h @@ -29,6 +29,7 @@ #include #include #include +#include #include "../src/util.h" #include "../src/global.h"