Audio bursts when using Conference Bridge

DR
Dominik Ridjic
Thu, May 2, 2019 2:15 PM

Hi,

We are using PJSIP for many years now both within Android and iOS
applications (currently version 2.8) and notice with one of our customers
an issue due to the "bursty" nature of the Conference Bridge whenever we
send audio over his media gateway (which goes to the PSTN network).
With Wireshark we could determine that both apps send multiple packets of
the audio stream out at around roughly 130-150ms, then apparently buffer
and send the buffered audio out again 130-150ms.
This presents a problem to us because this customer cannot change his media
gateway settings (like Jitter buffer) due to all the other applications
running on it being affected by it.

When we use the Audio Switch Board instead the app will send out packets at
exactly every 20ms, sadly we cannot use this due to requiring conference
call capabilities. What I've gathered from this PJSIP logs I've captured is
(the log line "conference.c  put_frame" was inserted by myself, the others
are from PJSIP):

15:19:07.769  conference.c !put_frame
15:19:07.789  conference.c  put_frame
15:19:07.808  conference.c  put_frame
15:19:07.828  conference.c  put_frame
15:19:07.848  conference.c  put_frame
15:19:07.861  conference.c !- clock -
15:19:07.861  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.861  conference.c    resample, input count=160
15:19:07.861  conference.c    rx buffer size is now 3040
15:19:07.862  conference.c  - clock -
15:19:07.862  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.862  conference.c    resample, input count=160
15:19:07.862  conference.c    rx buffer size is now 2880
15:19:07.863  conference.c  - clock -
15:19:07.863  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.863  conference.c    resample, input count=160
15:19:07.864  conference.c    rx buffer size is now 2720
15:19:07.864  conference.c  - clock -
15:19:07.864  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.864  conference.c    resample, input count=160
15:19:07.865  conference.c    rx buffer size is now 2560
15:19:07.866  conference.c  - clock -
15:19:07.866  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.866  conference.c    resample, input count=160
15:19:07.866  conference.c    rx buffer size is now 2400
15:19:07.868  conference.c !put_frame
15:19:07.888  conference.c  put_frame
15:19:07.908  conference.c  put_frame
15:19:07.928  conference.c  put_frame
15:19:07.948  conference.c  put_frame
15:19:07.960  conference.c !- clock -
15:19:07.961  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.961  conference.c    resample, input count=160
15:19:07.962  conference.c    rx buffer size is now 2240
15:19:07.963  conference.c  - clock -
15:19:07.963  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.963  conference.c    resample, input count=160
15:19:07.963  conference.c    rx buffer size is now 2080
15:19:07.964  conference.c  - clock -
15:19:07.964  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.964  conference.c    resample, input count=160
15:19:07.964  conference.c    rx buffer size is now 1920
15:19:07.965  conference.c  - clock -
15:19:07.965  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.965  conference.c    resample, input count=160
15:19:07.966  conference.c    rx buffer size is now 1760
15:19:07.966  conference.c  - clock -
15:19:07.966  conference.c  read_port sip:00436504037030@sipwise.com:
count=640
15:19:07.966  conference.c    resample, input count=160
15:19:07.967  conference.c    rx buffer size is now 1600
15:19:07.969  conference.c !put_frame
15:19:07.990  conference.c  put_frame
15:19:08.009  conference.c  put_frame
15:19:08.028  conference.c  put_frame
15:19:08.049  conference.c  put_frame
15:19:08.061  conference.c !- clock -

The mic does feed the Conference Bridge which then forwards it to the
Adaptive Delay Buffer -> Circular Delay Buffer frames every 20ms as would
be expected. But some clock driving the whole thing in the background will
only send and empty these buffers (including the one from incoming audio)
almost exactly every 100ms.
Is there a way to reduce this to maybe 50 or 60ms because I suppose this is
being done for a reason (ensuring good audio quality or for CPU performance
reasons)
I'm thankful if you can help us out here.

Also I'm sorry if this is the wrong place to ask, we have bought a
Commercial (or alternative) license for you for many years now (the company
being Sipwise), but I didn't find a form for commercial support.

Best Regards,
Dominik Ridjic

Hi, We are using PJSIP for many years now both within Android and iOS applications (currently version 2.8) and notice with one of our customers an issue due to the "bursty" nature of the Conference Bridge whenever we send audio over his media gateway (which goes to the PSTN network). With Wireshark we could determine that both apps send multiple packets of the audio stream out at around roughly 130-150ms, then apparently buffer and send the buffered audio out again 130-150ms. This presents a problem to us because this customer cannot change his media gateway settings (like Jitter buffer) due to all the other applications running on it being affected by it. When we use the Audio Switch Board instead the app will send out packets at exactly every 20ms, sadly we cannot use this due to requiring conference call capabilities. What I've gathered from this PJSIP logs I've captured is (the log line "conference.c put_frame" was inserted by myself, the others are from PJSIP): 15:19:07.769 conference.c !put_frame 15:19:07.789 conference.c put_frame 15:19:07.808 conference.c put_frame 15:19:07.828 conference.c put_frame 15:19:07.848 conference.c put_frame 15:19:07.861 conference.c !- clock - 15:19:07.861 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.861 conference.c resample, input count=160 15:19:07.861 conference.c rx buffer size is now 3040 15:19:07.862 conference.c - clock - 15:19:07.862 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.862 conference.c resample, input count=160 15:19:07.862 conference.c rx buffer size is now 2880 15:19:07.863 conference.c - clock - 15:19:07.863 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.863 conference.c resample, input count=160 15:19:07.864 conference.c rx buffer size is now 2720 15:19:07.864 conference.c - clock - 15:19:07.864 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.864 conference.c resample, input count=160 15:19:07.865 conference.c rx buffer size is now 2560 15:19:07.866 conference.c - clock - 15:19:07.866 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.866 conference.c resample, input count=160 15:19:07.866 conference.c rx buffer size is now 2400 15:19:07.868 conference.c !put_frame 15:19:07.888 conference.c put_frame 15:19:07.908 conference.c put_frame 15:19:07.928 conference.c put_frame 15:19:07.948 conference.c put_frame 15:19:07.960 conference.c !- clock - 15:19:07.961 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.961 conference.c resample, input count=160 15:19:07.962 conference.c rx buffer size is now 2240 15:19:07.963 conference.c - clock - 15:19:07.963 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.963 conference.c resample, input count=160 15:19:07.963 conference.c rx buffer size is now 2080 15:19:07.964 conference.c - clock - 15:19:07.964 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.964 conference.c resample, input count=160 15:19:07.964 conference.c rx buffer size is now 1920 15:19:07.965 conference.c - clock - 15:19:07.965 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.965 conference.c resample, input count=160 15:19:07.966 conference.c rx buffer size is now 1760 15:19:07.966 conference.c - clock - 15:19:07.966 conference.c read_port sip:00436504037030@sipwise.com: count=640 15:19:07.966 conference.c resample, input count=160 15:19:07.967 conference.c rx buffer size is now 1600 15:19:07.969 conference.c !put_frame 15:19:07.990 conference.c put_frame 15:19:08.009 conference.c put_frame 15:19:08.028 conference.c put_frame 15:19:08.049 conference.c put_frame 15:19:08.061 conference.c !- clock - The mic does feed the Conference Bridge which then forwards it to the Adaptive Delay Buffer -> Circular Delay Buffer frames every 20ms as would be expected. But some clock driving the whole thing in the background will only send and empty these buffers (including the one from incoming audio) almost exactly every 100ms. Is there a way to reduce this to maybe 50 or 60ms because I suppose this is being done for a reason (ensuring good audio quality or for CPU performance reasons) I'm thankful if you can help us out here. Also I'm sorry if this is the wrong place to ask, we have bought a Commercial (or alternative) license for you for many years now (the company being Sipwise), but I didn't find a form for commercial support. Best Regards, Dominik Ridjic