alsasrc use-driver-timestamps (was: Selecting alsasrc slave-method: resample not implemented?)

Pavel Hofman pavel.hofman at ivitera.com
Wed Nov 2 07:24:35 UTC 2022


Dne 01. 11. 22 v 21:52 Michiel Konstapel via gstreamer-devel napsal(a):
> On Tuesday 01 November 2022 14:11:05 (+01:00), Nicolas Dufresne wrote:
> 
>  > Le mardi 01 novembre 2022 à 10:13 +0000, Michiel Konstapel via 
> gstreamer-devel a
>  > écrit :
>  > > Forgive me for ranting.... These undocumented and
>  > > unimplemented methods/properties make me worry: am I just looking 
> for ghosts?
>  > > Does this all Just Work for everyone and should I just leave things 
> at the
>  > > defaults and move on? Many elements expose properties that seem 
> like they
>  > > involve important tradeoffs to make given a specific use case, but 
> then give
>  > > no information on what the various options do and especially 
> *why/when* you
>  > > would want them. Although they seem important, they are hardly 
> mentioned on
>  > > the mailing list. Source diving sometimes turns up some code or 
> comments, or
>  > > sometimes it just turns out that the exposed knob doesn't even do 
> anything :-/
>  > > Does this mean I have ventured into an area where I'm not supposed 
> to be, or
>  > > is this legitimately missing functionality/documentation?
>  > >
>  > > Not saying that I don't hugely appreciate all the work that's gone into
>  > > gstreamer, and I love hacking on this stuff, but boy does it get 
> frustrating
>  > > at times!
>  >
>  > I believe commercial implementation, were this strongly matter will 
> change a HW
>  > PLL to adjust the HW clock to their system/network clock. This should 
> happen in
>  > combination of slave-method=none on the source and 
> slave-method=custom on the
>  > sink. Be aware that I have never implemented such an advanced 
> solution myself.
>  >
>  > The alternative would be dynamic software resampling, see 
> slave-method=resample
>  > in alsasink, but this has been broken for age, and we don't have 
> anyone working
>  > on it. Audio servers like PipeWire and PulseAudio might already 
> handle this
>  > transparently, that might explain why only alsasrc/sink users reports 
> this.
> 
> 
> Thanks Nicolas!
> 
> Since we're not playing back the audio locally but only streaming it 
> over the network, there are no audio sinks involved. We have multiple 
> sources streaming to a central mixer, so I think it's up to each 
> individual source to sync its audio samples to the NTP system time. We 
> are using wireless USB microphones 
> <https://rode.com/en/microphones/wireless/wirelessgoii> which don't 
> appear to have any controls for finetuning their sampling rates.

Actually while the HW clock pitch control is perfectly viable 
technically, I have never seen a HW audio device which implements it and 
provides control through the driver. In linux I know only about software 
devices with pitch control - alsa loopback and usb audio gadget. But I 
have not seen many things :-).

As a matter of fact my current project would have the technology for 
such a feature (having clock generated by an I2C-adjustable fractional 
divider down from 15GHz), but every non-integer division damages clock 
jitter.

> 
> Does someone on the list have any advice on how to approach this? Should 
> we be using pulsesrc instead of alsasrc? Are there any existing elements 
> that will do the software resampling? I 
> found https://gstreamer-devel.narkive.com/oUoa2zeg/asynchrounous-audio-sample-rate-conversion-with-gstreamer 
> but the thread ends just as it gets interesting ;-)

The best solution would be adding the adaptive resampling to gstreamer 
source/sink, of course :-)

All other solutions will involve other processes which adds to 
complexity and latency.

Do I understand correctly that your input rate is the HW rate, while the 
output rate is clocked by the internal system clock, for streaming over 
network?

Maybe a viable solution could be your USB mic -> snd-usb-audio -> 
alsaloop with adaptive resampling enabled -> snd-aloop -> gstreamer with 
a custom rate plugin. IIUC gstreamer already calculates the required 
resampling ratio, passing it as a parameter to the custom plugin. The 
custom rate plugin would adjust the capturing snd-aloop pitch (via its 
alsa control "Playback Pitch 1000000"), leaving the actual adaptive 
resampling to alsaloop placed before gstreamer.

But when coding that plugin, maybe taking inspiration from alsaloop 
https://github.com/alsa-project/alsa-utils/blob/3b1b6863e7720d870ee34412e08b563605246718/alsaloop/pcmjob.c#L1606 
and coding adaptive resampling directly in that plugin would make more 
sense, with the great benefit of making it finally available for 
everyone :-)

Good luck with your project,

Pavel.


More information about the gstreamer-devel mailing list