static void *qpa_thread_in (void *arg)

{

    PAVoiceIn *pa = arg;

    HWVoiceIn *hw = &pa->hw;

    int threshold;



    threshold = conf.divisor ? hw->samples / conf.divisor : 0;



    if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {

        return NULL;

    }



    for (;;) {

        int incr, to_grab, wpos;



        for (;;) {

            if (pa->done) {

                goto exit;

            }



            if (pa->dead > threshold) {

                break;

            }



            if (audio_pt_wait (&pa->pt, AUDIO_FUNC)) {

                goto exit;

            }

        }



        incr = to_grab = pa->dead;

        wpos = hw->wpos;



        if (audio_pt_unlock (&pa->pt, AUDIO_FUNC)) {

            return NULL;

        }



        while (to_grab) {

            int error;

            int chunk = audio_MIN (to_grab, hw->samples - wpos);

            void *buf = advance (pa->pcm_buf, wpos);



            if (pa_simple_read (pa->s, buf,

                                chunk << hw->info.shift, &error) < 0) {

                qpa_logerr (error, "pa_simple_read failed\n");

                return NULL;

            }



            hw->conv (hw->conv_buf + wpos, buf, chunk);

            wpos = (wpos + chunk) % hw->samples;

            to_grab -= chunk;

        }



        if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {

            return NULL;

        }



        pa->wpos = wpos;

        pa->dead -= incr;

        pa->incr += incr;

    }



 exit:

    audio_pt_unlock (&pa->pt, AUDIO_FUNC);

    return NULL;

}

static void *qpa_thread_in (void *arg)

{

    PAVoiceIn *pa = arg;

    HWVoiceIn *hw = &pa->hw;

    int threshold;



    threshold = conf.divisor ? hw->samples / conf.divisor : 0;



    if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {

        return NULL;

    }



    for (;;) {

        int incr, to_grab, wpos;



        for (;;) {

            if (pa->done) {

                goto exit;

            }



            if (pa->dead > threshold) {

                break;

            }



            if (audio_pt_wait (&pa->pt, AUDIO_FUNC)) {

                goto exit;

            }

        }



        incr = to_grab = pa->dead;

        wpos = hw->wpos;



        if (audio_pt_unlock (&pa->pt, AUDIO_FUNC)) {

            return NULL;

        }



        while (to_grab) {

            int error;

            int chunk = audio_MIN (to_grab, hw->samples - wpos);

            void *buf = advance (pa->pcm_buf, wpos);



            if (pa_simple_read (pa->s, buf,

                                chunk << hw->info.shift, &error) < 0) {

                qpa_logerr (error, "pa_simple_read failed\n");

                return NULL;

            }



            hw->conv (hw->conv_buf + wpos, buf, chunk);

            wpos = (wpos + chunk) % hw->samples;

            to_grab -= chunk;

        }



        if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {

            return NULL;

        }



        pa->wpos = wpos;

        pa->dead -= incr;

        pa->incr += incr;

    }



 exit:

    audio_pt_unlock (&pa->pt, AUDIO_FUNC);

    return NULL;

}

static void *FUNC_0 (void *VAR_0)

{

    PAVoiceIn *pa = VAR_0;

    HWVoiceIn *hw = &pa->hw;

    int VAR_1;



    VAR_1 = conf.divisor ? hw->samples / conf.divisor : 0;



    if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {

        return NULL;

    }



    for (;;) {

        int VAR_2, VAR_3, VAR_4;



        for (;;) {

            if (pa->done) {

                goto exit;

            }



            if (pa->dead > VAR_1) {

                break;

            }



            if (audio_pt_wait (&pa->pt, AUDIO_FUNC)) {

                goto exit;

            }

        }



        VAR_2 = VAR_3 = pa->dead;

        VAR_4 = hw->VAR_4;



        if (audio_pt_unlock (&pa->pt, AUDIO_FUNC)) {

            return NULL;

        }



        while (VAR_3) {

            int VAR_5;

            int VAR_6 = audio_MIN (VAR_3, hw->samples - VAR_4);

            void *VAR_7 = advance (pa->pcm_buf, VAR_4);



            if (pa_simple_read (pa->s, VAR_7,

                                VAR_6 << hw->info.shift, &VAR_5) < 0) {

                qpa_logerr (VAR_5, "pa_simple_read failed\n");

                return NULL;

            }



            hw->conv (hw->conv_buf + VAR_4, VAR_7, VAR_6);

            VAR_4 = (VAR_4 + VAR_6) % hw->samples;

            VAR_3 -= VAR_6;

        }



        if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {

            return NULL;

        }



        pa->VAR_4 = VAR_4;

        pa->dead -= VAR_2;

        pa->VAR_2 += VAR_2;

    }



 exit:

    audio_pt_unlock (&pa->pt, AUDIO_FUNC);

    return NULL;

}

static void *FUNC_0 (void *VAR_0)
{ PAVoiceIn *pa = VAR_0; HWVoiceIn *hw = &pa->hw; int VAR_1; VAR_1 = conf.divisor ? hw->samples / conf.divisor : 0; if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) { return NULL; } for (;;) { int VAR_2, VAR_3, VAR_4; for (;;) { if (pa->done) { goto exit; } if (pa->dead > VAR_1) { break; } if (audio_pt_wait (&pa->pt, AUDIO_FUNC)) { goto exit; } } VAR_2 = VAR_3 = pa->dead; VAR_4 = hw->VAR_4; if (audio_pt_unlock (&pa->pt, AUDIO_FUNC)) { return NULL; } while (VAR_3) { int VAR_5; int VAR_6 = audio_MIN (VAR_3, hw->samples - VAR_4); void *VAR_7 = advance (pa->pcm_buf, VAR_4); if (pa_simple_read (pa->s, VAR_7,
VAR_6 << hw->info.shift, &VAR_5) < 0) { qpa_logerr (VAR_5, "pa_simple_read failed\n"); return NULL; } hw->conv (hw->conv_buf + VAR_4, VAR_7, VAR_6); VAR_4 = (VAR_4 + VAR_6) % hw->samples; VAR_3 -= VAR_6; } if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) { return NULL; } pa->VAR_4 = VAR_4; pa->dead -= VAR_2; pa->VAR_2 += VAR_2; } exit:
audio_pt_unlock (&pa->pt, AUDIO_FUNC); return NULL; }