Jaroslav Kysela wrote:

> On Mon, 22 Mar 2004, James Courtier-Dutton wrote:
>
> > My current tests were not using the resampler. i.e. app using 48k, sound
> > card using 48k. I will try some tests that would use the resampler.
>
> Then I need more info how I can reproduce the bug.

The following test program shows strange behaviour:

// ---------- bite off here ----------------------------------------
#include <alsa/asoundlib.h>

#define CHECK(command) do { \
        err = (command); \
        if (err < 0) { \
                printf("%s failed: %s\n", #command, snd_strerror(err)); \
                return 1; \
        } \
        } while (0)

int main(int argc, char *argv[])
{
        snd_pcm_t *pcm;
        snd_pcm_hw_params_t *hw_params;
        snd_pcm_sw_params_t *sw_params;
        int err;
        static char silence[12000 * 2 * 2];

        if (argc < 2) return 1;
        CHECK(snd_pcm_open(&pcm, argv[1], SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK));
        snd_pcm_hw_params_alloca(&hw_params);
        CHECK(snd_pcm_hw_params_any(pcm, hw_params));
        CHECK(snd_pcm_hw_params_set_access(pcm, hw_params, 
SND_PCM_ACCESS_RW_INTERLEAVED));
        CHECK(snd_pcm_hw_params_set_format(pcm, hw_params, SND_PCM_FORMAT_S16));
        CHECK(snd_pcm_hw_params_set_channels(pcm, hw_params, 2));
        CHECK(snd_pcm_hw_params_set_rate(pcm, hw_params, 48000, 0));
        CHECK(snd_pcm_hw_params_set_buffer_size(pcm, hw_params, 12000));
        CHECK(snd_pcm_hw_params_set_period_size(pcm, hw_params, 6000, 0));
        CHECK(snd_pcm_hw_params(pcm, hw_params));
        snd_pcm_sw_params_alloca(&sw_params);
        CHECK(snd_pcm_sw_params_current(pcm, sw_params));
        CHECK(snd_pcm_sw_params_set_start_threshold(pcm, sw_params, 12000));
        CHECK(snd_pcm_sw_params_set_avail_min(pcm, sw_params, 6000));
        CHECK(snd_pcm_sw_params(pcm, sw_params));
        for (;;) {
                CHECK(snd_pcm_wait(pcm, 2000));
                if (err == 0)
                        printf("timeout!\n");
                err = snd_pcm_writei(pcm, silence, 12000);
                if (err >= 0)
                        printf("%d frames written\n", err);
                else if (err == -EAGAIN)
                        printf("pcm not ready!\n");
                else
                        CHECK(err);
        }
}
// ---------- bite off here ----------------------------------------

With an AC'97 device:

$ ./waittest hw:0
12000 frames written
6000 frames written
6000 frames written
6000 frames written
6000 frames written
...

$ ./waittest dmix:hw:0
timeout!
12000 frames written
pcm is not ready!
6000 frames written
6000 frames written
6000 frames written
6000 frames written
...

When running with dmix, the first call to snd_pcm_wait() times out
although the pcm is ready (it seems the hardware pcm is still stopped
and doesn't generate interrupts), and the second call to
snd_pcm_wait() returns 1 although the pcm is not yet ready.


Regards,
Clemens




-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to