Rawaudio dev#3653
Conversation
…s on audio quality
|
I'd prefer not to check for the Jamulus version number but rather based on capabilities - we don't have 4.0.0 out yet and it might break during the dev process. |
I wanted to reuse information already available as much as possible so I just added the code where there were version checks already implemented. (For sequence number and pan feature) |
|
Tested it and yes, the noise would be unacceptable. What is our fallback if max is selected but the server doesn't support it? |
I just noticed that if you connect to a server with Max selected you get the noise unless you switch audio quality again while connected. The server code is fine and doesn't need changes, I misplaced the check for my introduced bRawAudioSupported in the client code. I'll have a closer look |
dingodoppelt
left a comment
There was a problem hiding this comment.
I guess this is in a working state now and the only issue remaining is the infrequent unclean exits especially on macOS. As it might even be unrelated to this pull request and I don't have an idea what causes it, I'll set this PR to "ready for review" now.
| } | ||
|
|
||
| const int iOffset = iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt]; | ||
| // Recognise a raw audio packet by its size |
There was a problem hiding this comment.
As far as I understood these sentinel bytes come from the opus codec itself and are not deliberately set by Jamulus as a message ID of sorts. I'd have to overwrite actual audio bytes for that to work with my code. Or am I wrong here?
|
@dingodoppelt I've received reports of users on Mac and Windows that have small buffers enabled in their rawaudio clients being unable to hear anything or hear strange audio on rawaudio enabled servers that do not have small buffers enabled. They report when they disable that feature in the client they can hear audio fine. I don't have Mac or Windows to test, and I don't experience the issue in Linux. |
I've just checked this out locally, with a server on Raspberry Pi and a client on Mac, both built from the latest If I start the server with If I start the server without However, I have also just checked with the Opus quality settings: High, Normal and Low. In those cases, setting 2.67ms (64) with Small Buffers enabled, connected to a server running without From previous tests I've done in standard Jamulus, the "Small Network Buffers" checkbox does nothing when set to 5.33ms (128) or 10.67ms (256). If the checkbox is off, then 2.67ms (64) actually sends exactly the same as 5.33ms (128). It's only if the checkbox is on, that 2.67ms (64) sends smaller packets. |
|
Yes. Can confirm the distorted audio without -F. Also if you bump both buffers to 1 there seems to be a cyclic distortion. Likely some rounding or timer issue. But it happens on other builds too. |
Yes, it seems so. I've just done some tests with Wireshark capturing the traffic between a client and a server running without
I have saved the Wireshark captures, but not yet examined them. |
|
I asked VSCode CoPilot: Likely cause identified: a packet-send regression in server mix/encode on this branch. The server can require two sub-blocks per client frame when server runs without fastupdate (128-sample server frame) and a client is on small buffers (64-sample transport). That is set here: server.cpp:771. It is triggered specifically by non-fastupdate server mode (128-frame server path) with 64-frame clients. It supplied this patch @@
- if ( iCeltNumCodedBytes != static_cast<int> ( iClientFrameSizeSamples * vecNumAudioChannels[iChanCnt] * sizeof ( int16_t ) ) )
+ if ( iCeltNumCodedBytes != static_cast<int> ( iClientFrameSizeSamples * vecNumAudioChannels[iChanCnt] * sizeof ( int16_t ) ) )
{
// OPUS encoding
if ( pCurOpusEncoder != nullptr )
{
@@
for ( int iB = 0; iB < vecNumFrameSizeConvBlocks[iChanCnt]; iB++ )
{
const int iOffset = iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt];
iUnused = opus_custom_encode ( pCurOpusEncoder,
&vecsSendData[iOffset],
iClientFrameSizeSamples,
&vecvecbyCodedData[iChanCnt][0],
iCeltNumCodedBytes );
+
+ // send each encoded sub-block (important when vecNumFrameSizeConvBlocks == 2)
+ vecChannels[iCurChanID].PrepAndSendPacket ( &Socket, vecvecbyCodedData[iChanCnt], iCeltNumCodedBytes );
}
}
}
else
{
for ( int iB = 0; iB < vecNumFrameSizeConvBlocks[iChanCnt]; iB++ )
{
const int iOffset = iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt];
memcpy ( &vecvecbyCodedData[iChanCnt][0], &vecsSendData[iOffset], iCeltNumCodedBytes );
+
+ // send each raw sub-block (important when vecNumFrameSizeConvBlocks == 2)
+ vecChannels[iCurChanID].PrepAndSendPacket ( &Socket, vecvecbyCodedData[iChanCnt], iCeltNumCodedBytes );
}
}
- // send separate mix to current clients
- vecChannels[iCurChanID].PrepAndSendPacket ( &Socket, vecvecbyCodedData[iChanCnt], iCeltNumCodedBytes );My fault for saying put the PrepAndSendPacket outside the |
|
Wow, that's impressive! I haven't tried copilot yet. Although I can't see what is different between the two versions of the first line? I'll try the patch a little later and repeat my tests. |
…ent settings for small network buffers
|
I can confirm the issue being fixed with the last commit in which I applied the suggested patch. (actually a revert) |
|
Yes, I can confirm the problem with small buffers enabled connected to a server without Finally understood that the only difference between having |
|
Furthermore I can't reproduce the crash on closing anymore. On linux I was getting crashes very rarely in the first place but I could trigger it by connecting to a server with |

Add a new "raw" audio quality setting
This PR adds uncompressed audio ("raw") to the quality settings so there is no Opus compression along the way
Discussion in #3654
This feature improves latency as well. I gained 2ms by using uncompressed audio while having a better audio quality.
CHANGELOG: Add uncompressed audio transmission - dedicated to the memory of Hans Petter Selasky (1982 - 2023)
Does this change need documentation? What needs to be documented and how?
Corresponding PR in jamulussoftware/jamuluswebsite #1133
Checklist