[LAD] Adding a c timer to Kluppe

Niels Mayer nielsmayer at gmail.com
Tue Apr 20 17:43:30 UTC 2010


I don't know anything about the kluppe code, but are the underlying
libraries you're using re-entrant? My brief perusal
of your code raised red-flags due to use of signal(2) and alarm(2).
Execution ends up jumping around asynchronously&&indeterminately, in audio
code or threads that probably should never have that happen. For example.
lets say you had a piece of code that needed to execute within a certain
amount of time in order to generate a data-stream w/o interruption --
lowlevel code that never expected to be jumped out of to take care of some
random "application level" business that it shouldn't need to concern itself
over.

This probably requires an event-driven architecture, where everything is
driven by IO. Looked at that way, a timer timing out is just another thing
to select(2)  on; as long as your code doesn't block on I/O, you never need
to worry about reentrancy.

Niels
http://nielsmayer.com

On Tue, Apr 20, 2010 at 6:12 AM, Patrick Shirkey <pshirkey at boosthardware.com
> wrote:

> Hi,
>
> I'm trying to add a threaded timer to kluppes looperdata.c
> looperdata_calc_sample_stereo function so that I can add a delayed
> restart to the loop process.
>
> Can anyone tell me why the "while" statement in the following code locks
> up the audio stream for the loop it is being run on? I end up with a
> buzz throughout the delay period instead of a nice quiet delay period.
>
>
>
> #include <stdlib.h>
> #include <signal.h>
> #include <stdio.h>
>
> /* This flag controls termination of the main loop.  */
> volatile sig_atomic_t isdelay_countdown = 1;
>
> /* The signal handler just clears the flag and re-enables itself.  */
> void catch_alarm (int sig){
>   isdelay_countdown = 0;
>   signal (sig, catch_alarm);
> }
>
>
>
>     vol = data->vol;
>
>                 if(data->playbackdelay > 0){
>
>                     /* Establish a handler for SIGALRM signals.  */
>                     signal (SIGALRM, catch_alarm);
>
>                      isdelay_countdown = 1;
>
>                       /* Call alarm to countdown length of
> playbackdelay  */
>                       alarm ((int)data->playbackdelay);
>
>                       /* Check the flag once in a while to see when to
> quit.  */
>                       while(isdelay_countdown){
>                         looperdata_set_vol(data,0);
>                         data->isplaying = 0;
>                      }
>
>
>                 }
>
> /* return to start of loop */
>
>                     looperdata_set_vol(data,vol);
>                     data->isplaying = 1;
>                     data->playindex += data->loopstart - data->loopend;
>
>
>
>
> --
> Patrick Shirkey
> Boost Hardware Ltd
>
> _______________________________________________
> Linux-audio-dev mailing list
> Linux-audio-dev at lists.linuxaudio.org
> http://lists.linuxaudio.org/listinfo/linux-audio-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linuxaudio.org/pipermail/linux-audio-dev/attachments/20100420/3855c861/attachment.html>


More information about the Linux-audio-dev mailing list