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:
parent
e0c9ea5b6d
commit
c5d9b29aaa
5 changed files with 21 additions and 20 deletions
12
ChangeLog
12
ChangeLog
|
@ -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
|
||||||
|
|
|
@ -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") {
|
||||||
|
|
|
@ -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 +
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Reference in a new issue