All of lore.kernel.org
 help / color / mirror / Atom feed
* snd_pcm_wait()  More details required.
@ 2004-03-21 14:49 James Courtier-Dutton
  2004-03-22  9:56 ` Jaroslav Kysela
  2004-03-22 10:10 ` Clemens Ladisch
  0 siblings, 2 replies; 10+ messages in thread
From: James Courtier-Dutton @ 2004-03-21 14:49 UTC (permalink / raw)
  To: ALSA development

I need more details on exactly what snd_pcm_wait() is supposed to do.
The documentation on the www.alsa-project.org gives: -
Wait for a PCM to become ready.

Parameters:
     pcm  	PCM handle
     timeout  	maximum time in milliseconds to wait

Returns:
     a positive value on success otherwise a negative error code (-EPIPE 
for the xrun and -ESTRPIPE for the suspended status, others for general 
errors)

Return values:
     0  	timeout occurred
     1  	PCM stream is ready for I/O



So, when is a PCM ready?
If a PCM is already in SND_PCM_STATE_RUNNING, when is snd_pcm_wait() 
supposed to return ?

I have discovered a problem with xine when using it. I have done a work 
around in xine so that dmix now works in xine. I think that my 
assumptions regarding snd_pcm_wait() might have been wrong, so I want to 
  get accurate details from yourselves.
It also might be a good idea to update the documentation for 
snd_pcm_wait() with more details.

Cheers
James


-------------------------------------------------------
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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-21 14:49 snd_pcm_wait() More details required James Courtier-Dutton
@ 2004-03-22  9:56 ` Jaroslav Kysela
  2004-03-22 17:31   ` James Courtier-Dutton
  2004-03-22 10:10 ` Clemens Ladisch
  1 sibling, 1 reply; 10+ messages in thread
From: Jaroslav Kysela @ 2004-03-22  9:56 UTC (permalink / raw)
  To: James Courtier-Dutton; +Cc: ALSA development

yOn Sun, 21 Mar 2004, James Courtier-Dutton wrote:

> I need more details on exactly what snd_pcm_wait() is supposed to do.
> The documentation on the www.alsa-project.org gives: -
> Wait for a PCM to become ready.
> 
> Parameters:
>      pcm  	PCM handle
>      timeout  	maximum time in milliseconds to wait
> 
> Returns:
>      a positive value on success otherwise a negative error code (-EPIPE 
> for the xrun and -ESTRPIPE for the suspended status, others for general 
> errors)
> 
> Return values:
>      0  	timeout occurred
>      1  	PCM stream is ready for I/O
> 
> 
> 
> So, when is a PCM ready?
> If a PCM is already in SND_PCM_STATE_RUNNING, when is snd_pcm_wait() 
> supposed to return ?

When avail >= avail_min.

> I have discovered a problem with xine when using it. I have done a work 
> around in xine so that dmix now works in xine. I think that my 
> assumptions regarding snd_pcm_wait() might have been wrong, so I want to 
>   get accurate details from yourselves.
> It also might be a good idea to update the documentation for 
> snd_pcm_wait() with more details.

We had a bug in the resample plugin which causes that snd_pcm_wait() 
function was broken. Try alsa-lib from CVS.

						Jaroslav

-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs


-------------------------------------------------------
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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-22 10:10 ` Clemens Ladisch
@ 2004-03-22 10:09   ` Jaroslav Kysela
  0 siblings, 0 replies; 10+ messages in thread
From: Jaroslav Kysela @ 2004-03-22 10:09 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: James Courtier-Dutton, ALSA development

On Mon, 22 Mar 2004, Clemens Ladisch wrote:

> > I have discovered a problem with xine when using it. I have done a work
> > around in xine so that dmix now works in xine. I think that my
> > assumptions regarding snd_pcm_wait() might have been wrong, so I want to
> > get accurate details from yourselves.
> 
> I think the implementation of dmix is broken in this regard.  If I
> read the code correctly, snd_pcm_direct_poll_revents() returns
> POLLIN/OUT even if the pcm is empty.
> 
> Jaroslav, shouldn't this function reset the events variable when empty
> is set?

No, in case when no timer events are available, the revents should be 
zero from the kernel space, so we don't need to explicitly clear this 
variable.

						Jaroslav

-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs


-------------------------------------------------------
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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-21 14:49 snd_pcm_wait() More details required James Courtier-Dutton
  2004-03-22  9:56 ` Jaroslav Kysela
@ 2004-03-22 10:10 ` Clemens Ladisch
  2004-03-22 10:09   ` Jaroslav Kysela
  1 sibling, 1 reply; 10+ messages in thread
From: Clemens Ladisch @ 2004-03-22 10:10 UTC (permalink / raw)
  To: James Courtier-Dutton; +Cc: ALSA development, Jaroslav Kysela

James Courtier-Dutton wrote:
> I need more details on exactly what snd_pcm_wait() is supposed to do.
> The documentation on the www.alsa-project.org gives: -
> Wait for a PCM to become ready.
> ...
> So, when is a PCM ready?

When you can read/write some data without blocking, i.e.,
avail >= avail_min.

> I have discovered a problem with xine when using it. I have done a work
> around in xine so that dmix now works in xine. I think that my
> assumptions regarding snd_pcm_wait() might have been wrong, so I want to
> get accurate details from yourselves.

I think the implementation of dmix is broken in this regard.  If I
read the code correctly, snd_pcm_direct_poll_revents() returns
POLLIN/OUT even if the pcm is empty.

Jaroslav, shouldn't this function reset the events variable when empty
is set?


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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-22  9:56 ` Jaroslav Kysela
@ 2004-03-22 17:31   ` James Courtier-Dutton
  2004-03-22 17:51     ` Jaroslav Kysela
  0 siblings, 1 reply; 10+ messages in thread
From: James Courtier-Dutton @ 2004-03-22 17:31 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: ALSA development

Jaroslav Kysela wrote:
>>
>>So, when is a PCM ready?
>>If a PCM is already in SND_PCM_STATE_RUNNING, when is snd_pcm_wait() 
>>supposed to return ?
> 
> 
> When avail >= avail_min.

1) Does this depend on period size in any way?
For example, if period size is 6000 frames, and I set avail_min to 2000 
frames, will snd_pcm_wait() return when avail=2000 or avail=6000 ?
Another example, if persiod size is 1500, and I set avail_min to 2000, 
will snd_pcm_wait() return when avail=200 or avail=3000 (2*1500)?

2) Is snd_pcm_wait() a call that uses little or no CPU time, much like a 
poll?

3) It appears from the docs that I can set avail_min at any time, even 
in SND_PCM_STATE_RUNNING.
commands to set it would be: -
snd_pcm_sw_params_current(this->audio_fd, swparams);
snd_pcm_sw_params_set_avail_min(this->audio_fd, swparams, 
new_avail_min_size);
snd_pcm_sw_params(this->audio_fd, swparams);

or is there a better way to do it while in SND_PCM_STATE_RUNNING ?

4) If snd_pcm_wait() is waiting, and with another thread we change the 
avail_min value, will the snd_pcm_wait() use the new value, or is the 
new value only used on the next call to snd_pcm_wait()

> 
> 
>>I have discovered a problem with xine when using it. I have done a work 
>>around in xine so that dmix now works in xine. I think that my 
>>assumptions regarding snd_pcm_wait() might have been wrong, so I want to 
>>  get accurate details from yourselves.
>>It also might be a good idea to update the documentation for 
>>snd_pcm_wait() with more details.
> 
> 
> We had a bug in the resample plugin which causes that snd_pcm_wait() 
> function was broken. Try alsa-lib from CVS.

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.

> 
> 						Jaroslav
> 



-------------------------------------------------------
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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-22 17:31   ` James Courtier-Dutton
@ 2004-03-22 17:51     ` Jaroslav Kysela
  2004-03-23 12:33       ` Clemens Ladisch
  0 siblings, 1 reply; 10+ messages in thread
From: Jaroslav Kysela @ 2004-03-22 17:51 UTC (permalink / raw)
  To: James Courtier-Dutton; +Cc: ALSA development

On Mon, 22 Mar 2004, James Courtier-Dutton wrote:

> Jaroslav Kysela wrote:
> >>
> >>So, when is a PCM ready?
> >>If a PCM is already in SND_PCM_STATE_RUNNING, when is snd_pcm_wait() 
> >>supposed to return ?
> > 
> > 
> > When avail >= avail_min.
> 
> 1) Does this depend on period size in any way?
> For example, if period size is 6000 frames, and I set avail_min to 2000 
> frames, will snd_pcm_wait() return when avail=2000 or avail=6000 ?
> Another example, if persiod size is 1500, and I set avail_min to 2000, 
> will snd_pcm_wait() return when avail=200 or avail=3000 (2*1500)?

Pointers are updated in the interrupt or when you call snd_pcm_hwsync()
or snd_pcm_delay().

> 2) Is snd_pcm_wait() a call that uses little or no CPU time, much like a 
> poll?

snd_pcm_wait() uses poll().

> 3) It appears from the docs that I can set avail_min at any time, even 
> in SND_PCM_STATE_RUNNING.
> commands to set it would be: -
> snd_pcm_sw_params_current(this->audio_fd, swparams);
> snd_pcm_sw_params_set_avail_min(this->audio_fd, swparams, 
> new_avail_min_size);
> snd_pcm_sw_params(this->audio_fd, swparams);
> 
> or is there a better way to do it while in SND_PCM_STATE_RUNNING ?

No, you may cache the sw_params structure.

> 4) If snd_pcm_wait() is waiting, and with another thread we change the 
> avail_min value, will the snd_pcm_wait() use the new value, or is the 
> new value only used on the next call to snd_pcm_wait()

The threshold will be used immediately.

> 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.

						Jaroslav

-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs


-------------------------------------------------------
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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-22 17:51     ` Jaroslav Kysela
@ 2004-03-23 12:33       ` Clemens Ladisch
  2004-03-23 13:40         ` Jaroslav Kysela
  0 siblings, 1 reply; 10+ messages in thread
From: Clemens Ladisch @ 2004-03-23 12:33 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: James Courtier-Dutton, ALSA development

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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-23 12:33       ` Clemens Ladisch
@ 2004-03-23 13:40         ` Jaroslav Kysela
  2004-03-24  7:58           ` Clemens Ladisch
  0 siblings, 1 reply; 10+ messages in thread
From: Jaroslav Kysela @ 2004-03-23 13:40 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: James Courtier-Dutton, ALSA development

On Tue, 23 Mar 2004, Clemens Ladisch wrote:

> 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:

Thanks. It's fixed in CVS now.

						Jaroslav

-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs


-------------------------------------------------------
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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-23 13:40         ` Jaroslav Kysela
@ 2004-03-24  7:58           ` Clemens Ladisch
  2004-03-24  8:59             ` Jaroslav Kysela
  0 siblings, 1 reply; 10+ messages in thread
From: Clemens Ladisch @ 2004-03-24  7:58 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: James Courtier-Dutton, ALSA development

Jaroslav Kysela wrote:
> On Tue, 23 Mar 2004, Clemens Ladisch wrote:
> > The following test program shows strange behaviour:
>
> Thanks. It's fixed in CVS now.

The second problem persists, i.e., snd_pcm_wait() returns although the
pcm isn't actually ready:

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


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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: snd_pcm_wait()  More details required.
  2004-03-24  7:58           ` Clemens Ladisch
@ 2004-03-24  8:59             ` Jaroslav Kysela
  0 siblings, 0 replies; 10+ messages in thread
From: Jaroslav Kysela @ 2004-03-24  8:59 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: James Courtier-Dutton, ALSA development

On Wed, 24 Mar 2004, Clemens Ladisch wrote:

> Jaroslav Kysela wrote:
> > On Tue, 23 Mar 2004, Clemens Ladisch wrote:
> > > The following test program shows strange behaviour:
> >
> > Thanks. It's fixed in CVS now.
> 
> The second problem persists, i.e., snd_pcm_wait() returns although the
> pcm isn't actually ready:
> 
> $ ./waittest dmix:hw:0
> 12000 frames written
> pcm is not ready!
> 6000 frames written

Fixed again. I was not able reproduce this problem with some hardware.

						Jaroslav

-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs


-------------------------------------------------------
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

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2004-03-24  9:01 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-21 14:49 snd_pcm_wait() More details required James Courtier-Dutton
2004-03-22  9:56 ` Jaroslav Kysela
2004-03-22 17:31   ` James Courtier-Dutton
2004-03-22 17:51     ` Jaroslav Kysela
2004-03-23 12:33       ` Clemens Ladisch
2004-03-23 13:40         ` Jaroslav Kysela
2004-03-24  7:58           ` Clemens Ladisch
2004-03-24  8:59             ` Jaroslav Kysela
2004-03-22 10:10 ` Clemens Ladisch
2004-03-22 10:09   ` Jaroslav Kysela

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.