[alsa-devel] how to handle buffer underrun in a softsynth
Henning Thielemann
alsa at henning-thielemann.de
Tue Nov 29 09:39:08 CET 2011
On Mon, 28 Nov 2011, Clemens Ladisch wrote:
> Henning Thielemann wrote:
>> I have written a software synthesizer in Haskell that fetches MIDI events
>> from ALSA sequencer and plays the rendered signal via ALSA pcm. However it
>> cannot cope correctly with buffer underruns.
>> ...
>> Now when I detect a buffer underrun on writing a block to an ALSA pcm
>> sink, I like to know the time gap in order to adjust the timestamps of the
>> incoming MIDI events.
>
> The sample clock is usually not synchronized with any other clock, so
> you won't be able to get a very exact measurement.
That's something I worry about, too. However I must somehow map timestamps
of ALSA sequencer events to sample counts in order to let notes start
within a sample block. JACK claims to synchronize everything and it runs
on top of ALSA - how does it manage synchronization between MIDI and PCM?
> However, there is a different way to approach this problem: just disable
> underruns. :) Set the stop_threshold to the same value as the boundary,
> and ALSA will no longer stop the device when an underrun happens.¹ This
> means that you'll have to write some data more quickly than normally to
> catch up², but the overall timing of the samples will not be affected.
Ok, I am still uncertain whether this solves my problem. I think about how
I can decrease processor load if I detect a buffer underrun. My idea was
the following: Say, I have a blocksize of 10ms and got some events A, B,
C, ... from the ALSA sequencer:
1ms: A, 7ms: B, 13ms: C, 19ms: D, 25ms: E, 31ms: F
Now, when I encounter a buffer underrun, I want instead to render
according to:
1ms: A, 7ms: B, 10ms: C, 10ms: D, 15ms: E, 21ms: F
and play a 10ms pause at timestamp 10ms. That is I do not want to drop
events (this might introduce inconsistencies) but I could save rendering a
block and this way catch up with the emission of sample blocks.
How can I detect a buffer underrun when I disabled underrun detection?
Regards,
Henning
More information about the Alsa-devel
mailing list