Changelog¶
Version 0.4.0 (Jun 14, 2024)¶
Features¶
finish RTCP & XR support (gh-14, gh-674)
handle all reports from RFC 3550 and some XR reports
implement 2-way RTCP reports exchange
route packets to sessions according to SSRC and CNAME
support RTT calculation based on RTCP XR packets
improve packet validation
support packet padding
support RTCP multicast
support latency tuning and clock drift compensation on sender instead of receiver (gh-675)
implement backend for WAV files without external dependencies, useful in contrained environments (gh-576)
implement libsndfile backend for audio files (gh-246)
C API¶
rework latency configuration, introduce concept of latency tuner, available on both sender and receiver (by default enabled on receiver and disabled on sender)
replace
roc_clock_sync_backend
withroc_latency_tuner_backend
replace
roc_clock_sync_profile
withroc_latency_tuner_profile
rework metrics API (gh-681)
replace
roc_session_metrics
withroc_connection_metrics
rework
roc_sender_metrics
androc_receiver_metrics
; connection metrics are now available on both sender and receiverfunctions for querying metrics (
roc_sender_query()
,roc_receiver_query()
,roc_sender_encoder_query()
,roc_receiver_decoder_query()
) are reworked and simplifiedniq_latency
is removed from API
support 2-way control packet exchange in codecs API (
roc_sender_encoder
androc_receiver_decoder
)rename
roc_sender_encoder_push()
toroc_sender_encoder_push_frame()
rename
roc_sender_encoder_pop()
toroc_sender_encoder_pop_packet()
add
roc_sender_encoder_push_feedback_packet()
rename
roc_receiver_decoder_push()
toroc_receiver_decoder_push_packet()
rename
roc_receiver_decoder_pop()
toroc_receiver_decoder_pop_frame()
add
roc_receiver_decoder_pop_feedback_packet()
rename
roc_version_get()
toroc_version_load()
Command-line tools¶
rework latency configuration:
rename
--sess-latency
to--target-latency
replace
--clock-backend
with--latency-backend
replace
--clock-profile
with--latency-profile
rename options:
--packet-length
to--packet-len
--packet-limit
to--max-packet-size
--frame-length
to--frame-len
--frame-limit
to--max-frame-size
support floats for sizes and durations (gh-654)
support
NO_COLOR
andFORCE_COLOR
environment variables (gh-564)
Bug fixes¶
fix routing of FEC packets in encoder/decoder API (
roc_sender_encoder
androc_receiver_decoder
)fix segfault when roc-send input device omitted (gh-728)
fix work when
no_playback_timeout
is lower thantarget_latency
(gh-657)fix “unexpected already cancelled task” panic
properly handle allocation errors in
HeapArena
Portability¶
add Ubuntu 24.04 to CI (gh-634)
add macOS 14 (arm64) to CI
add OpenWrt with uCLibc and musl (MIPS32) to CI
fix build on Debian GNU/Hurd
improve handling of unknown unix-like platforms in scons
Dependencies¶
new optional dependency: libsndfile, used in CLI tools (gh-246)
Internals¶
Build system¶
fix
--build-3rdparty
on macOS 14fix static library on macOS (
libroc.a
); ensure that all object files have unique namesfix macos linker warnings about
-lc++
fix build with macports installed; don’t implicitly use brew if pkg-config is not from brew
fix openssl search
workaround for brew + pkg-config + openssl error on macOS
fix building old pulseaudio on clang 17
Tests¶
improve tests for capture timestamps (CTS)
improve RTCP tests (in
roc_rtcp
,roc_pipeline
, andpublic_api
)improve pipeline tests
add tests for metrics
Documentation¶
document audio backends
document sponsored work
Version 0.3.0 (Nov 22, 2023)¶
Features¶
support lower latencies, up to 7ms in our tests
add new clock synchronization profile (
responsive
) suitable for lower latenciesmajor improvements in C API (network-less API, metrics API, many small improvements)
more flexible packet encoding configuration (currently available only via C API):
more channel layouts: mono, stereo, multitrack (up to 1024 channels)
custom smaple rate
improve scaling precision of
speex
resamplerimplement new
speexdec
resampler, combining SpeexDSP for base rate conversion and decimation for clock drift compensation, which has better scaling precision thanspeex
and is very cheap when base rates are equal
C API¶
implement new encoder / decoder API (
roc_sender_encoder
androc_receiver_decoder
), which is network-less version of sender / receiver API (encoder produces packets, decoder consumes packets, and user is responsible for delivering packets)implement initial metrics API:
add
roc_session_metrics
,roc_receiver_metrics
, androc_sender_metrics
structs (currently they supportniq_latency
ande2e_latency
)add
roc_sender_query()
,roc_receiver_query()
,roc_sender_encoder_query()
,roc_receiver_decoder_query()
to query metrics
improvements in slot support:
support deleting slots on fly using
roc_sender_unlink()
androc_receiver_unlink()
refine error handling rules: if error happens during slot configuration, slot is marked broken and excluded from pipeline, but needs manual removal by user
slot identifiers are now arbitrary
long long
numbers (not necessary continuous)
simplify receiver configuration:
replace
max_latency_overrun
+max_latency_underrun
with one parameterlatency_tolerance
rename
broken_playback_timeout
tochoppy_playback_timeout
remove
breakage_detection_window
(automatically derive it fromchoppy_playback_timeout
)
simplify interface configuration:
introduce
roc_interface_config
struct, which holds all per-interface optionsreplace
roc_sender_set_outgoing_address()
androc_sender_set_reuseaddr()
withroc_sender_configure()
(which usesroc_interface_config
)replace
roc_receiver_set_multicast_group()
androc_receiver_set_reuseaddr()
withroc_receiver_configure()
(which usesroc_interface_config
)
rework encoding configuration:
rename
roc_frame_encoding
enum toroc_format
(in API, “encoding” now means format + rate + channels, which is now true for both frame encoding and packet encoding)add
roc_media_encoding
struct which defines format + rate + channelsuse
roc_media_encoding
instead offrame_encoding
+frame_sample_rate
+frame_channels
inroc_sender_config
androc_receiver_config
rename
roc_channel_set
toroc_channel_layout
remove
packet_sample_rate
andpacket_channels
(these parameters are now derived frompacket_encoding
)if
packet_encoding
is not set, automatically choose one that matchesframe_encoding
(among built-in and registered packet encodings)
support channel layouts:
ROC_CHANNEL_LAYOUT_MONO
ROC_CHANNEL_LAYOUT_STEREO
ROC_CHANNEL_LAYOUT_MULTITRACK
- up to 1024 channels without special meaning
support packet encodings:
ROC_PACKET_ENCODING_AVP_L16_MONO
ROC_PACKET_ENCODING_AVP_L16_STEREO
support registering custom packet encodings using
roc_context_register_encoding()
add
roc_clock_sync_backend
parameter, with two values:ROC_CLOCK_SYNC_BACKEND_DISABLE
- do not adjust receiver clockROC_CLOCK_SYNC_BACKEND_NIQ
- adjust receiver clock based on network incoming queue size (current behavior)
add
roc_clock_sync_profile
parameter with three values:ROC_CLOCK_SYNC_PROFILE_GRADUAL
- adjust clock smoothly (old behavior, good for high jitter and high latency)ROC_CLOCK_SYNC_PROFILE_RESPONSIVE
- adjust clock smoothly (good for low jitter and low latency)ROC_CLOCK_SYNC_PROFILE_DEFAULT
- select profile automatically based ontarget_latency
rename
ROC_CLOCK_EXTERNAL
/ROC_CLOCK_INTERNAL
toROC_CLOCK_SOURCE_EXTERNAL
/ROC_CLOCK_SOURCE_INTERNAL
add
ROC_RESAMPLER_BACKEND_SPEEXDEC
backendadd
ROC_VERSION
andROC_VERSION_CODE()
Command-line tools¶
replace
--min-latency
+--max-latency
with--latency-tolerance
remove
--no-resampling
(use--clock-backend=disable
instead)add
--clock-backend
and--clock-profile
rename
--np-timeout
to--no-play-timeout
replace
--bp-timeout
+--bp-window
with--choppy-play-timeout
rename
--beeping
to--beep
rename
roc-conv
tool toroc-copy
list supported endpoint schemes in
--print-supported
Bug fixes¶
fix NTP 2036 year problem
fix latency reported in logs
Internals¶
change default packet length from
7ms
to2.5ms
get rid of hard-coded frame length in pipeline components (now they work with any requested frame length), which allows to handle latencies lower than default frame length
support capture timestamps (CTS) in packets and frames (based on RTCP + NTP) and forward them through the pipeline, needed for end-to-end latency calculation
start work on calculation of end-to-end latency (overall delay from sender to receiver, including I/O and network)
start work for automatic mapping between different channel layouts and orders (including mono, stereo, surround, and multitrack layouts)
start work for reporting and forwarding error codes through the pipeline
implement fast lock-free PRNG
optimize task processing: process pipeline tasks in-place when they’re scheduled from I/O thread, to avoid unnecessary delays
improve memory protection:
always employ memory poisoning in arenas and pools
implement buffer overflow protection using canary guards in arenas and pools
implement ownership checks in arenas and pools
module
roc_peer
renamed toroc_node
(because it now has non-peer nodes)
Build system¶
add
--compiler-launcher
scons option (may be used forccache
)correctly handle
--enable-debug-3rdparty
for all dependencies
Documentation¶
improve C API doxygen comments
fix pulseaudio C API examples
numerous improvements and updates in sphinx documentation
Version 0.2.6 (Nov 05, 2023)¶
Packaging¶
build debian packages on debian:bullseye
in debian packages, statically link all dependencies except
libc
,libasound
,libpulse
ensure that packages are installable on debian:oldstable, debian:stable, ubuntu:20.04, ubuntu:22.04, ubuntu:latest
Version 0.2.5 (Jul 28, 2023)¶
Bug fixes¶
fix byte order conversion
Build system¶
fix compiler type detection when compiler is specified via
CC
orCXX
variableexport symbols of dependencies built by
--build-3rdparty
when building static library (libroc.a
), to avoid linker errors when using it
Version 0.2.4 (May 13, 2023)¶
C API¶
always set
file
andline
inroc_log_message
Command-line tools¶
support PulseAudio sources in
roc-send
support
--io-latency
option inroc-send
Bug fixes¶
fix potential race
fix byte order detection on Android
do not write to log from shared library destructor
stop using user-provided log handler after entering shared library destructor
Internals¶
improve logging
refactor scons scripts
Build system¶
fix
--build-3rdparty=sox
whensndio
is installedfix
--build-3rdparty=google-benchmark
when there ispython3
, but nopython
in PATHfix OpenSSL platform detection in
--build-3rdparty=openssl
when not cross-compilingset Android API level to
21
add
--macos-platform
and--macos-arch
scons optionsby default, set
--macos-platform
to current OS, to avoid linker warnings about incompatible macOS deployment targetssupport building macOS universal binaries by providing multiple values for
--macos-arch
propagate Android platform, macOS platform, and macOS architectures to
--build--3rdparty
unexport all symbols except
roc_*
fromlibroc.so
andlibroc.a
on Linux, andlibroc.dylib
on macOSresolve
pkg-config
absolute path
Documentation¶
minor updates
Version 0.2.3 (Mar 09, 2023)¶
C API¶
add
roc_receiver_set_reuseaddr
androc_sender_set_reuseaddr
Command-line tools¶
add
--reuseaddr
toroc-recv
androc-send
Bug fixes¶
fix formatting of endpoint URI with zero port
fix usage of multicast with RTCP in
roc-recv
Build system¶
add new dependency OpenSSL
fix work with SCons 4.5
exclude sox and libpulse from .pc file for libroc
Packaging¶
add debian packages and publish them on github
add rpm packages spec
Documentation¶
minor updates
Version 0.2.2 (Feb 27, 2023)¶
C API¶
rename
roc_get_version
toroc_version_get
Bug fixes¶
fix crash in
roc_log_set_handler
when argument is NULL
Build system¶
fix build on recent Android NDK
install
.pc
file to<libdir>/pkgconfig
instead ofPKG_CONFIG_PATH
add support for
DESTDIR
strip symbols in release build
Documentation¶
minor updates
Version 0.2.1 (Dec 26, 2022)¶
Build system¶
install to
/usr
by default (except macOS)
Documentation¶
minor updates
Version 0.2.0 (Dec 19, 2022)¶
Features¶
support multicast
support broadcast
support speex resampler and make it default
support slots (connect sender to multiple receivers and vice versa)
initial support for RTCP
C API¶
return error codes from
roc_context_open
,roc_receiver_open
,roc_sender_open
introduce
roc_endpoint
to identify endpoints using URIrename
roc_fec_code
toroc_fec_encoding
add
roc_resampler_backend
add
roc_clock_source
add
roc_version
and friends
Command-line tools¶
use URIs to identify audio devices and endpoints
add
--backup
option toroc-recv
replace
--frame-size
with--frame-length
and--frame-limit
remove
--resampler-interp
and--resampler-window
Bug fixes¶
fix race in PRNG
fix race in mutex and semaphore on macOS
fix potential deadlock in network code
Portability¶
Linux / aarch64 build fixes
Android build fixes
macOS build fixes
FreeBSD build fixes
support generic Unix target
continuous integration for more Linux distros
continuous integration for Android
testing on Raspberry Pi 4
Internals¶
add
roc_peer
moduleadd
roc_ctl
modulesupport for asynchronous tasks in
roc_pipeline
,roc_netio
,roc_ctl
lock-free task queues
optimizations to avoid unnecessary context switches
improvements in memory pools
improvements in logger
self-profiling
start work on SDP support
preparations for RTSP support
rework project structure
lots of small improvements
Build system¶
add
--enable-static
and--disable-shared
add
--disable-soversion
optioncompatibility with recent SCons versions
compatibility with different Python versions
improve toolchain detection
generate
.pc
file for pkg-configfix build with recent PulseAudio
fix build with recent libunwind
fixes for building third-parties
Tests¶
add benchmarks
lots of small updates
Documentation¶
document Android bulding and testing
lots of small updates
Version 0.1.5 (Apr 05, 2020)¶
Portability¶
fix building on Manjaro Linux
fix building on Yocto Linux
add openSUSE to continuous integration and user cookbook
drop Xcode 7.3 from continuous integration, add Xcode 11.3
Build system¶
correctly handle arguments in environment variables like CXX/CC/LD/etc (for Yocto Linux)
correctly handle spaces in environment variables (for Yocto Linux)
fix environment overrides checks
fix building of the host tools when cross-compiling
fix warnings on Clang 11
fix sphinx invocation
explicitly disable Orc when building PulseAudio using –build-3rdparty
explicitly enable -pthread or -lpthread for libsndfile (for Manjaro Linux)
user CMake instead of autotools when building libuv for Android using
--build-3rdparty
switch to libuv 1.35.0 by default in
--build-3rdparty
check for unknown names in
--build-3rdparty
Version 0.1.4 (Feb 06, 2020)¶
Internals¶
fix logging
Build system¶
make
/usr/local
prefix default everywhere except Linuxmake default compiler consistent with CXX var
fix handling of RAGEL, GENGETOPT, DOXYGEN, SPHINX_BUILD, and BREATHE_APIDOC vars
fix SoX download URL (again)
fix CPU count calculation
Documentation¶
update PulseAudio version numbers in “User cookbook”
update CONTRIBUTING and “Coding guidelines”
update maintainers and contributors list
Version 0.1.3 (Oct 21, 2019)¶
Command-line tools¶
add
--list-drivers
optionadd git commit hash to version info
Internals¶
print backtrace on Linux and macOS using libunwind instead of glibc backtrace module
print backtrace on Android using bionic backtrace module
colored logging
Build system¶
add libunwind optional dependency (enabled by default)
add ragel required dependency
rename “uv” to “libuv” in
--build-3rdparty
don’t hide symbols in debug builds
strip symbols in release builds
fix building on recent Python versions
fix SoX download URL
fix PulseAudio version parsing
automatically apply memfd patch when building PulseAudio
automatically fix libasound includes when building PulseAudio
Version 0.1.2 (Aug 14, 2019)¶
Bug fixes¶
fix handling of inconsistent port protocols / FEC schemes
fix IPv6 support
fix incorrect usage of SO_REUSEADDR
fix panic on bind error
fix race in port removing code
fix packet flushing mechanism
fix backtrace printing on release builds
Portability¶
fix building on musl libc
continuous integration for Alpine Linux
Internals¶
rework audio codecs interfaces (preparations for Opus and read-aheads support)
minor refactoring in FEC support
improve logging
Build system¶
allow to configure installation directories
auto-detect system library directory and PulseAudio module directory
Documentation¶
extend “Forward Erasure Correction codes” page
add new pages: “Usage”, “Publications”, “Licensing”, “Contacts”, “Authors”
replace “Guidelines” page with “Contribution Guidelines”, “Coding guidelines”, and “Version control”
Version 0.1.1 (Jun 18, 2019)¶
Bug fixes¶
fix memory corruption in OpenFEC / LDPC-Staircase (fix available in our fork)
fix false positives in stream breakage detection
Portability¶
start working on Android port; Roc PulseAudio modules are now available in Termux unstable repo
continuous integration for Android / arm64 (minimal build)
docker image for aarch64-linux-android toolchain
Build system¶
fix multiple build issues on macOS
fix multiple build issues with cross-compilation and Android build
fix issues with building third-parties
fix issues with compilation db generation
set library soname/install_name and install proper symlinks
improve configuration options
improve system type detection and system tools search
improve scripts portability
better handling of build environment variables
Tests¶
fix resampler AWGN tests
add travis job to run tests under valgrind
Version 0.1.0 (May 28, 2019)¶
Features¶
streaming CD-quality audio using RTP (PCM 16-bit stereo)
maintaining pre-configured target latency
restoring lost packets using FECFRAME with Reed-Solomon and LDPC-Staircase FEC schemes
converting between the sender and receiver clock domains using resampler
converting between the network and input/output sample rates
configurable resampler profiles for different CPU and quality requirements
mixing simultaneous streams from multiple senders on the receiver
binding receiver to multiple ports with different protocols
interleaving packets to increase the chances of successful loss recovery
detecting and restarting broken streams
C API¶
initial version of transport API (roc_sender, roc_receiver)
Command-line tools¶
initial version of command-line tools (roc-send, roc-recv, roc-conv)
Portability¶
GNU/Linux support
macOS support
continuous integration for Ubuntu, Debian, Fedora, CentOS, Arch Linux, macOS
continuous integration for x86_64, ARMv6, ARMv7, ARMv8
toolchain docker images for arm-bcm2708hardfp-linux-gnueabi, arm-linux-gnueabihf, aarch64-linux-gnu
testing on Raspberry Pi 3 Model B, Raspberry Pi Zero W, Orange Pi Lite 2