From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org
Subject: Re: [PATCH 1/2] ALSA: usb-audio: ignore delay calculation for capture stream
Date: Mon, 10 Dec 2012 15:33:56 -0600 [thread overview]
Message-ID: <50C65544.7060003@linux.intel.com> (raw)
In-Reply-To: <s5hr4ngh1u1.wl%tiwai@suse.de>
[-- Attachment #1: Type: text/plain, Size: 628 bytes --]
>> Shouldn't we add support for delay on the capture path instead? We could
>> use the same frame counter to report the delay and resync when the urb
>> is retired.
>
> Sure, it must be possible like that way.
> Wouldn't you like to volunteer? ;)
here's a suggestion. Since we don't submit multiple URBs as in the
playback case, we can only track the delay using the frame counter for a
single URB, and we reset the counters when the URB is retired.
Did a couple of tests, seems to work ok.
I couldn't figure out if the related patches are already in git, I
didn't find them. Takashi, did you merge them already?
-Pierre
[-- Attachment #2: usb_delay.patch --]
[-- Type: text/x-patch, Size: 1578 bytes --]
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index c659310..65dc53e 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -59,7 +59,12 @@ snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,
/* Approximation based on number of samples per USB frame (ms),
some truncation for 44.1 but the estimate is good enough */
- est_delay = subs->last_delay - (frame_diff * rate / 1000);
+ est_delay = frame_diff * rate / 1000;
+ if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK)
+ est_delay = subs->last_delay - est_delay;
+ else
+ est_delay = subs->last_delay + est_delay;
+
if (est_delay < 0)
est_delay = 0;
return est_delay;
@@ -1147,6 +1152,10 @@ static void retire_capture_urb(struct snd_usb_substream *subs,
int i, period_elapsed = 0;
unsigned long flags;
unsigned char *cp;
+ int current_frame_number;
+
+ /* read frame number here, update pointer in critical section */
+ current_frame_number = usb_get_current_frame_number(subs->dev);
stride = runtime->frame_bits >> 3;
@@ -1180,6 +1189,13 @@ static void retire_capture_urb(struct snd_usb_substream *subs,
subs->transfer_done -= runtime->period_size;
period_elapsed = 1;
}
+ /* capture delay is by construction limited to one URB, reset delays here */
+ runtime->delay = subs->last_delay = 0;
+
+ /* realign last_frame_number */
+ subs->last_frame_number = current_frame_number;
+ subs->last_frame_number &= 0xFF; /* keep 8 LSBs */
+
spin_unlock_irqrestore(&subs->lock, flags);
/* copy a data chunk */
if (oldptr + bytes > runtime->buffer_size * stride) {
[-- Attachment #3: Type: text/plain, Size: 0 bytes --]
next prev parent reply other threads:[~2012-12-10 21:33 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-23 15:21 [PATCH 0/2] Fix usb-audio delay calculation Takashi Iwai
2012-11-23 15:21 ` [PATCH 1/2] ALSA: usb-audio: ignore delay calculation for capture stream Takashi Iwai
2012-11-26 14:24 ` Pierre-Louis Bossart
2012-11-26 14:32 ` Takashi Iwai
2012-11-26 21:05 ` Pierre-Louis Bossart
2012-12-10 21:33 ` Pierre-Louis Bossart [this message]
2012-12-12 11:26 ` Takashi Iwai
2012-11-23 15:21 ` [PATCH 2/2] ALSA: usb-audio: fix delay account during pause 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=50C65544.7060003@linux.intel.com \
--to=pierre-louis.bossart@linux.intel.com \
--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 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.