Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Mack <daniel@caiaq.de>
To: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org
Subject: Re: device underruns
Date: Mon, 27 Apr 2009 12:05:02 +0200	[thread overview]
Message-ID: <20090427100502.GC8196@buzzloop.caiaq.de> (raw)
In-Reply-To: <s5hk557wtlv.wl%tiwai@suse.de>

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?

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@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},"

  reply	other threads:[~2009-04-27 10:05 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-31 14:46 device underruns Daniel Mack
2009-04-25 12:23 ` Daniel Mack
2009-04-26 11:18   ` Takashi Iwai
2009-04-27 10:05     ` Daniel Mack [this message]
2009-04-27 10:12       ` Takashi Iwai
2009-04-27 10:18         ` Daniel Mack
2009-04-27 10:36           ` Takashi Iwai
2009-04-27 14:28             ` Daniel Mack
2009-04-27 14:34               ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090427100502.GC8196@buzzloop.caiaq.de \
    --to=daniel@caiaq.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox