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 * 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 * 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!) TODO check for audio fade in time at the server with newest version -> is it still correct?
maybe let the use select all possible sound card buffer sizes, this should solve Ticket #53
TODO mixer faders linear -> log gain is better: CalcFaderGain() -> x = -50:1:0; plot(x, (10 .^ (x / 10))) 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 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 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 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 # use target name which does not use a captital letter at the beginning
contains(CONFIG, "noupcasename") { contains(CONFIG, "noupcasename") {

View file

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

View file

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

View file

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