[alsa-devel] device underruns

Takashi Iwai tiwai at suse.de
Mon Apr 27 12:12:14 CEST 2009


At Mon, 27 Apr 2009 12:05:02 +0200,
Daniel Mack wrote:
> 
> On Sun, Apr 26, 2009 at 01:18:52PM +0200, Takashi Iwai wrote:
> > > The posting below didn't get any response yet, but the problem persists.
> > > Any hints, anyone?
> > 
> > The ALSA PCM core just relies upon two things from the lowlevel driver:
> > 
> > 1. The lowlevel driver calls snd_pcm_period_elapsed() at each time
> >    when the set-up period size has been processed by the hardware.
> > 2. The pointer callback reports the sane position as the current
> >    position; not below the previous position and not above the next
> >    period boundary.
> > 
> > Especially pulseaudio is very sensitive about these two things,
> > because it always asks the driver the current position.  Thus, if your
> > driver doesn't fulfill the above conditions, it won't work properly.
> 
> Oh well. Stupid me. I think I fixed it, and wonder why it didn't break
> more things. Could you apply the patch below?

If you provide a proper changelog and your sign-off ;)


thanks,

Takashi

> 
> Thanks,
> Daniel
> 
> diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c
> index 3f45c0f..b13ce76 100644
> --- a/sound/usb/caiaq/audio.c
> +++ b/sound/usb/caiaq/audio.c
> @@ -195,11 +195,14 @@ static int snd_usb_caiaq_pcm_prepare(struct snd_pcm_substream *substream)
>  
>  	debug("%s(%p)\n", __func__, substream);
>  	
> -	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
> +	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
> +		dev->period_out_count[index] = BYTES_PER_SAMPLE + 1;
>  		dev->audio_out_buf_pos[index] = BYTES_PER_SAMPLE + 1;
> -	else
> +	} else {
> +		dev->period_in_count[index] = BYTES_PER_SAMPLE;
>  		dev->audio_in_buf_pos[index] = BYTES_PER_SAMPLE;
> -	
> +	}
> +
>  	if (dev->streaming)
>  		return 0;
>  	
> @@ -300,8 +303,7 @@ static void check_for_elapsed_periods(struct snd_usb_caiaqdev *dev,
>  		if (!sub)
>  			continue;
>  
> -		pb = frames_to_bytes(sub->runtime, 
> -				     sub->runtime->period_size);
> +		pb = snd_pcm_lib_period_bytes(sub);
>  		cnt = (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
>  					&dev->period_out_count[stream] :
>  					&dev->period_in_count[stream];
> diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c
> index 6d51770..515de1c 100644
> --- a/sound/usb/caiaq/device.c
> +++ b/sound/usb/caiaq/device.c
> @@ -35,7 +35,7 @@
>  #include "input.h"
>  
>  MODULE_AUTHOR("Daniel Mack <daniel at caiaq.de>");
> -MODULE_DESCRIPTION("caiaq USB audio, version 1.3.13");
> +MODULE_DESCRIPTION("caiaq USB audio, version 1.3.14");
>  MODULE_LICENSE("GPL");
>  MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2},"
>  			 "{Native Instruments, RigKontrol3},"
> 


More information about the Alsa-devel mailing list