finished: support for 64 samples OPUS packets in the client (if a sound card buffer size larger or equal than 128 samples is chosen, the legacy 128 samples OPUS packets are used)

This commit is contained in:
Volker Fischer 2020-04-13 19:26:15 +02:00
parent e0c9ea5b6d
commit c5d9b29aaa
5 changed files with 21 additions and 20 deletions

View file

@ -1,20 +1,26 @@
3.4.8git
3.5.0git
* added support for 64 samples OPUS packets in the client (if a sound card buffer size
larger or equal than 128 samples is chosen, the legacy 128 samples OPUS packets are used)
* refresh server list if the Central Server address type is changed
* bug fix: the server welcome message may appear twice if the server list was double clicked
TODO client: larger sound card buffers are managed by conversion buffer, not in processintern for loop (note iSndCrdFrameSizeFactor!)
maybe let the use select all possible sound card buffer sizes, this should solve Ticket #53
TODO check for audio fade in time at the server with newest version -> is it still correct?
TODO mixer faders linear -> log gain is better: CalcFaderGain() -> x = -50:1:0; plot(x, (10 .^ (x / 10)))
TODO offer the Jamulus ASIO settingspanel in case of an ASIO ERROR to fix, e.g., incorrect sample rate (https://sourceforge.net/p/llcon/discussion/533517/thread/777663cf94/#035f)
TODO issue with Mac audio interface: https://sourceforge.net/p/llcon/discussion/software/thread/7c443f2ed9/#eeab
TODO let the user select all possible sound card buffer sizes, this should solve Ticket #53
TODO auto jitter buffer performance not good at 64 samples frame size -> to be checked again
TODO for different frame sizes (64/128) the start value of 6 for the jitter buffer might be too low

View file

@ -1,4 +1,4 @@
VERSION = 3.4.8git
VERSION = 3.5.0git
# use target name which does not use a captital letter at the beginning
contains(CONFIG, "noupcasename") {

View file

@ -1146,12 +1146,15 @@ fflush(pFileDelay);
int CClient::EstimatedOverallDelay ( const int iPingTimeMs )
{
const double dSystemBlockDurationMs = static_cast<double> ( iOPUSFrameSizeSamples ) /
SYSTEM_SAMPLE_RATE_HZ * 1000;
// If the jitter buffers are set effectively, i.e. they are exactly the
// size of the network jitter, then the delay of the buffer is the buffer
// length. Since that is usually not the case but the buffers are usually
// a bit larger than necessary, we introduce some factor for compensation.
// Consider the jitter buffer on the client and on the server side, too.
const double dTotalJitterBufferDelayMs = SYSTEM_BLOCK_DURATION_MS_FLOAT *
const double dTotalJitterBufferDelayMs = dSystemBlockDurationMs *
static_cast<double> ( GetSockBufNumFrames() +
GetServerSockBufNumFrames() ) * 0.7;
@ -1187,9 +1190,8 @@ int CClient::EstimatedOverallDelay ( const int iPingTimeMs )
const double dDelayToFillNetworkPacketsMs =
GetSystemMonoBlSize() * 1000 / SYSTEM_SAMPLE_RATE_HZ;
// CELT additional delay at small frame sizes is half a frame size
const double dAdditionalAudioCodecDelayMs =
SYSTEM_BLOCK_DURATION_MS_FLOAT / 2;
// OPUS additional delay at small frame sizes is half a frame size
const double dAdditionalAudioCodecDelayMs = dSystemBlockDurationMs / 2;
const double dTotalBufferDelayMs =
dDelayToFillNetworkPacketsMs +

View file

@ -163,7 +163,7 @@ CServerDlg::CServerDlg ( CServer* pNServP,
// set up list view for connected clients
lvwClients->setColumnWidth ( 0, 170 );
lvwClients->setColumnWidth ( 1, 130 );
lvwClients->setColumnWidth ( 1, 200 );
lvwClients->clear();
@ -175,6 +175,7 @@ lvwClients->setMinimumHeight ( 140 );
// insert items in reverse order because in Windows all of them are
// always visible -> put first item on the top
vecpListViewItems.Init ( MAX_NUM_CHANNELS );
for ( int i = MAX_NUM_CHANNELS - 1; i >= 0; i-- )
{
vecpListViewItems[i] = new QTreeWidgetItem ( lvwClients );
@ -488,12 +489,6 @@ void CServerDlg::OnTimer()
vecpListViewItems[i]->setText ( 2,
QString().setNum ( veciJitBufNumFrames[i] ) );
// out network block size
vecpListViewItems[i]->setText ( 3,
QString().setNum ( static_cast<double> (
veciNetwFrameSizeFact[i] * SYSTEM_BLOCK_DURATION_MS_FLOAT
), 'f', 2 ) );
vecpListViewItems[i]->setHidden ( false );
}
else

View file

@ -26,6 +26,9 @@
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="columnCount">
<number>3</number>
</property>
<column>
<property name="text">
<string>Client IP:Port</string>
@ -41,11 +44,6 @@
<string>Jitter Buffer Size</string>
</property>
</column>
<column>
<property name="text">
<string>Block Size Out/ms</string>
</property>
</column>
</widget>
</item>
<item>