210 | | Ticket #393 (release 0.7.1) added a new media setting {{{pjsua_media_config.audio_frame_ptime}}}, or in older PJSUA-LIB, this setting is hard-coded in {{{PTIME}}} macro in {{{pjsua_media.c}}}. This setting specifies the length of audio frame in milliseconds, to be set to both the sound device and to the conference bridge. |
211 | | |
212 | | The previous default value is 20 milliseconds, while the default value is now set to 10 milliseconds. Changing this value from 20 to 10 milliseconds will reduce sound device latency by about 100 milliseconds and end-to-end audio latency by about 200 milliseconds. |
| 210 | Older pjsip:: |
| 211 | Ticket #393 (release 0.7.1) added a new media setting {{{pjsua_media_config.audio_frame_ptime}}}, or in older PJSUA-LIB, this setting is hard-coded in {{{PTIME}}} macro in {{{pjsua_media.c}}}. This setting specifies the length of audio frame in milliseconds, to be set to both the sound device and to the conference bridge. |
| 212 | |
| 213 | The previous default value is 20 milliseconds, while the default value is now set to 10 milliseconds. Changing this value from 20 to 10 milliseconds will reduce sound device latency by about 100 milliseconds and end-to-end audio latency by about 200 milliseconds. |
| 214 | |
| 215 | pjsip version 0.9 and later:: |
| 216 | The default value is now 20ms, and changing this to 10ms will only reduce latency slightly. |
216 | | The {{{PJMEDIA_SOUND_BUFFER_COUNT}}} in {{{pjmedia/config.h}}} specifies the number of audio frames in the conference bridge buffer. Larger number is better for sound stability and to accommodate sound devices that are unable to send frames in timely manner, however it would probably cause more audio delay. |
217 | | |
218 | | The default value was 16, and this has been changed to 6 by ticket #394 (release 0.7.1). |
| 220 | Older pjsip: :: |
| 221 | The {{{PJMEDIA_SOUND_BUFFER_COUNT}}} in {{{pjmedia/config.h}}} specifies the number of audio frames in the conference bridge buffer. Larger number is better for sound stability and to accommodate sound devices that are unable to send frames in timely manner, however it would probably cause more audio delay. |
| 222 | |
| 223 | The default value was 16, and this has been changed to 6 by ticket #394 (release 0.7.1). |
| 224 | |
| 225 | pjsip version 0.9 and later: :: |
| 226 | PJSIP now uses adaptive delay buffer to automatically learn the amount of buffers required to handle the burst. The semantic of PJMEDIA_SOUND_BUFFER_COUNT has been changed, and rather now it means the maximum amount of buffering that will be handled by the delay buffer. Lowering the value will not affect latency, and may cause unnecessary WSOLA processing (to discard the excessive frames because the buffer is full) and may even produce audio impairments, hence it's no longer recommended. |
| 227 | |
222 | | On Windows with !PortAudio backend (the default sound driver backend), with the default setting !DirectSound does have lower latency than WMME, but !DirectSound has more erratic timing. This bad timing causes additional delay in the processing of packets in the jitter buffer; there can be up to 150ms delay between packet arrival time and the time when the frame is actually picked up from the jitter buffer, regardless of jitter buffer setting. |
223 | | |
224 | | Release 0.7.1 has been tuned to provide better latency, with providing these settings: |
225 | | - ticket #384 gives the ability for application to choose !DirectSound over WMME. Default is no |
226 | | - ticket #395 adds a configuration to control the maximum buffer latency for WMME, with default value is 60 (milliseconds). For similar setting for !DirectSound, application needs to set {{{PA_MIN_LATENCY_MSEC}}} environment variable. |
227 | | |
228 | | With default WMME backend and 60 milliseconds buffering, application should have much better latency than with using !DirectSound. |
| 231 | Older pjsip: :: |
| 232 | On Windows with !PortAudio backend (the default sound driver backend), with the default setting !DirectSound does have lower latency than WMME, but !DirectSound has more erratic timing. This bad timing causes additional delay in the processing of packets in the jitter buffer; there can be up to 150ms delay between packet arrival time and the time when the frame is actually picked up from the jitter buffer, regardless of jitter buffer setting. |
| 233 | |
| 234 | Release 0.7.1 has been tuned to provide better latency, with providing these settings: |
| 235 | - ticket #384 gives the ability for application to choose !DirectSound over WMME. Default is no |
| 236 | - ticket #395 adds a configuration to control the maximum buffer latency for WMME, with default value is 60 (milliseconds). For similar setting for !DirectSound, application needs to set {{{PA_MIN_LATENCY_MSEC}}} environment variable. |
| 237 | |
| 238 | With default WMME backend and 60 milliseconds buffering, application should have much better latency than with using !DirectSound. |
| 239 | |
| 240 | pjsip version 0.9 and later: :: |
| 241 | The maximum buffer latency setting above has been deprecated, and instead we introduced two pjmedia settings to control the sound device buffer size/latency value: {{{PJMEDIA_SND_DEFAULT_REC_LATENCY}}} and {{{PJMEDIA_SND_DEFAULT_PLAY_LATENCY}}}. The default values for both settings are 100 ms. Application can also change the latency at run-time by calling {{{pjmedia_snd_set_latency()}}} '''before''' opening the sound device. |
| 242 | |
| 243 | Setting the latency to lower value will affect the audio stability (it will make it more sensitive to CPU disruptions), so choose the value carefully. |
| 244 | |
232 | | The jitter buffer parameters are specified in {{{pjsua_media_config}}}, with the relevant fields are: |
233 | | - '''jb_min_pre''' - Jitter buffer minimum prefetch delay in msec. With the default settings, it will use the hard-coded value in {{{stream.c}}}, that is '''60''' ms. |
234 | | - '''jb_max_pre''' - Jitter buffer maximum prefetch delay in msec. With the default settings, it will use the hard-coded value in {{{stream.c}}}, that is '''240''' ms. |
235 | | - '''jb_max''' - Set maximum delay that can be accomodated by the jitter buffer msec. The default value is also hard-coded in {{{stream.c}}}, that is '''360''' ms. |
| 248 | Older pjsip: :: |
| 249 | The jitter buffer parameters are specified in {{{pjsua_media_config}}}, with the relevant fields are: |
| 250 | - '''jb_min_pre''' - Jitter buffer minimum prefetch delay in msec. With the default settings, it will use the hard-coded value in {{{stream.c}}}, that is '''60''' ms. |
| 251 | - '''jb_max_pre''' - Jitter buffer maximum prefetch delay in msec. With the default settings, it will use the hard-coded value in {{{stream.c}}}, that is '''240''' ms. |
| 252 | - '''jb_max''' - Set maximum delay that can be accomodated by the jitter buffer msec. The default value is also hard-coded in {{{stream.c}}}, that is '''360''' ms. |
| 253 | |
| 254 | pjsip version 0.9 and later: :: |
| 255 | The jitter buffer implementation has been modified and it should reduce latency significantly. |
| 256 | |
255 | | ''pjsua'' does not play any ring tones when the call gets 180/Ringing, since it's just a simple application for demonstration purpose. When you're building your own application, you can add this feature yourself. You can play a ringing tone by using the tone generator as described above (but connecting the tone generator to the sound device instead of to the call), or you can play your own WAV file instead. |
| 276 | older pjsip: :: |
| 277 | ''pjsua'' does not play any ring tones when the call gets 180/Ringing, since it's just a simple application for demonstration purpose. When you're building your own application, you can add this feature yourself. You can play a ringing tone by using the tone generator as described above (but connecting the tone generator to the sound device instead of to the call), or you can play your own WAV file instead. |
| 278 | |
| 279 | pjsip version 0.9 and later: :: |
| 280 | pjsua now supports generating local ringback tones! |