From: Daniel Mack <zonque-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Alan Stern <stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org>
Cc: Clemens Ladisch <clemens-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>,
Takashi Iwai <tiwai-l3A5Bk7waGM@public.gmane.org>,
Eldad Zack <eldad-v6AqZgAe4C4dvzyIwGCCOg@public.gmane.org>,
USB list <linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org,
James Stone <jamesmstone-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: Re: [alsa-devel] Buffer size for ALSA USB PCM audio
Date: Mon, 09 Sep 2013 16:20:28 +0200 [thread overview]
Message-ID: <522DD92C.4020009@gmail.com> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1308281441090.1541-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
On 28.08.2013 20:46, Alan Stern wrote:
> On Wed, 28 Aug 2013, Clemens Ladisch wrote:
>
>> Sorry, what I said applies more to explicit sync endpoints. When using
>> implicit sync, a playback URB is submitted for each completed capture
>> URB, with the number of samples per packet identical to the
>> corresponding capture packet, so the parameters must be identical.
>
> Got it. Below is an updated patch.
>
> James, the problem you encountered was most likely a result of the
> faulty treatment of capture endpoints that Clemens pointed out. It was
> quite obvious in the usbmon traces that the unpatched driver used 8
> packets per URB whereas the patched driver used 22. This updated patch
> should fix that problem.
I gave this patch a try and I can confirm that it results in a
sigificant improvement for small sample buffers.
So feel free to add my
Tested-by: Daniel Mack <zonque-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Thanks,
Daniel
> Index: usb-3.11/sound/usb/usbaudio.h
> ===================================================================
> --- usb-3.11.orig/sound/usb/usbaudio.h
> +++ usb-3.11/sound/usb/usbaudio.h
> @@ -55,7 +55,6 @@ struct snd_usb_audio {
> struct list_head mixer_list; /* list of mixer interfaces */
>
> int setup; /* from the 'device_setup' module param */
> - int nrpacks; /* from the 'nrpacks' module param */
> bool autoclock; /* from the 'autoclock' module param */
>
> struct usb_host_interface *ctrl_intf; /* the audio control interface */
> Index: usb-3.11/sound/usb/card.c
> ===================================================================
> --- usb-3.11.orig/sound/usb/card.c
> +++ usb-3.11/sound/usb/card.c
> @@ -79,7 +79,6 @@ static bool enable[SNDRV_CARDS] = SNDRV_
> /* Vendor/product IDs for this card */
> static int vid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 };
> static int pid[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = -1 };
> -static int nrpacks = 8; /* max. number of packets per urb */
> static int device_setup[SNDRV_CARDS]; /* device parameter for this card */
> static bool ignore_ctl_error;
> static bool autoclock = true;
> @@ -94,8 +93,6 @@ module_param_array(vid, int, NULL, 0444)
> MODULE_PARM_DESC(vid, "Vendor ID for the USB audio device.");
> module_param_array(pid, int, NULL, 0444);
> MODULE_PARM_DESC(pid, "Product ID for the USB audio device.");
> -module_param(nrpacks, int, 0644);
> -MODULE_PARM_DESC(nrpacks, "Max. number of packets per URB.");
> module_param_array(device_setup, int, NULL, 0444);
> MODULE_PARM_DESC(device_setup, "Specific device setup (if needed).");
> module_param(ignore_ctl_error, bool, 0444);
> @@ -374,7 +371,6 @@ static int snd_usb_audio_create(struct u
> chip->dev = dev;
> chip->card = card;
> chip->setup = device_setup[idx];
> - chip->nrpacks = nrpacks;
> chip->autoclock = autoclock;
> chip->probing = 1;
>
> @@ -756,10 +752,6 @@ static struct usb_driver usb_audio_drive
>
> static int __init snd_usb_audio_init(void)
> {
> - if (nrpacks < 1 || nrpacks > MAX_PACKS) {
> - printk(KERN_WARNING "invalid nrpacks value.\n");
> - return -EINVAL;
> - }
> return usb_register(&usb_audio_driver);
> }
>
> Index: usb-3.11/sound/usb/endpoint.h
> ===================================================================
> --- usb-3.11.orig/sound/usb/endpoint.h
> +++ usb-3.11/sound/usb/endpoint.h
> @@ -12,6 +12,8 @@ int snd_usb_endpoint_set_params(struct s
> snd_pcm_format_t pcm_format,
> unsigned int channels,
> unsigned int period_bytes,
> + unsigned int period_frames,
> + unsigned int buffer_periods,
> unsigned int rate,
> struct audioformat *fmt,
> struct snd_usb_endpoint *sync_ep);
> Index: usb-3.11/sound/usb/card.h
> ===================================================================
> --- usb-3.11.orig/sound/usb/card.h
> +++ usb-3.11/sound/usb/card.h
> @@ -2,11 +2,11 @@
> #define __USBAUDIO_CARD_H
>
> #define MAX_NR_RATES 1024
> -#define MAX_PACKS 20
> +#define MAX_PACKS 6 /* per URB */
> #define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */
> -#define MAX_URBS 8
> +#define MAX_URBS 12
> #define SYNC_URBS 4 /* always four urbs for sync */
> -#define MAX_QUEUE 24 /* try not to exceed this queue length, in ms */
> +#define MAX_QUEUE 18 /* try not to exceed this queue length, in ms */
>
> struct audioformat {
> struct list_head list;
> @@ -87,6 +87,7 @@ struct snd_usb_endpoint {
> unsigned int phase; /* phase accumulator */
> unsigned int maxpacksize; /* max packet size in bytes */
> unsigned int maxframesize; /* max packet size in frames */
> + unsigned int max_urb_frames; /* max URB size in frames */
> unsigned int curpacksize; /* current packet size in bytes (for capture) */
> unsigned int curframesize; /* current packet size in frames (for capture) */
> unsigned int syncmaxsize; /* sync endpoint packet size */
> @@ -116,6 +117,8 @@ struct snd_usb_substream {
> unsigned int channels_max; /* max channels in the all audiofmts */
> unsigned int cur_rate; /* current rate (for hw_params callback) */
> unsigned int period_bytes; /* current period bytes (for hw_params callback) */
> + unsigned int period_frames; /* current frames per period */
> + unsigned int buffer_periods; /* current periods per buffer */
> unsigned int altset_idx; /* USB data format: index of alternate setting */
> unsigned int txfr_quirk:1; /* allow sub-frame alignment */
> unsigned int fmt_type; /* USB audio format type (1-3) */
> @@ -125,6 +128,7 @@ struct snd_usb_substream {
>
> unsigned int hwptr_done; /* processed byte position in the buffer */
> unsigned int transfer_done; /* processed frames since last period update */
> + unsigned int frame_limit; /* limits number of packets in URB */
>
> /* data and sync endpoints for this stream */
> unsigned int ep_num; /* the endpoint number */
> Index: usb-3.11/sound/usb/pcm.c
> ===================================================================
> --- usb-3.11.orig/sound/usb/pcm.c
> +++ usb-3.11/sound/usb/pcm.c
> @@ -562,6 +562,7 @@ static int configure_sync_endpoint(struc
> subs->pcm_format,
> subs->channels,
> subs->period_bytes,
> + 0, 0,
> subs->cur_rate,
> subs->cur_audiofmt,
> NULL);
> @@ -598,6 +599,7 @@ static int configure_sync_endpoint(struc
> subs->pcm_format,
> sync_fp->channels,
> sync_period_bytes,
> + 0, 0,
> subs->cur_rate,
> sync_fp,
> NULL);
> @@ -620,6 +622,8 @@ static int configure_endpoint(struct snd
> subs->pcm_format,
> subs->channels,
> subs->period_bytes,
> + subs->period_frames,
> + subs->buffer_periods,
> subs->cur_rate,
> subs->cur_audiofmt,
> subs->sync_endpoint);
> @@ -656,6 +660,8 @@ static int snd_usb_hw_params(struct snd_
>
> subs->pcm_format = params_format(hw_params);
> subs->period_bytes = params_period_bytes(hw_params);
> + subs->period_frames = params_period_size(hw_params);
> + subs->buffer_periods = params_periods(hw_params);
> subs->channels = params_channels(hw_params);
> subs->cur_rate = params_rate(hw_params);
>
> @@ -1330,6 +1336,7 @@ static void prepare_playback_urb(struct
> frames = 0;
> urb->number_of_packets = 0;
> spin_lock_irqsave(&subs->lock, flags);
> + subs->frame_limit += ep->max_urb_frames;
> for (i = 0; i < ctx->packets; i++) {
> if (ctx->packet_size[i])
> counts = ctx->packet_size[i];
> @@ -1344,6 +1351,7 @@ static void prepare_playback_urb(struct
> subs->transfer_done += counts;
> if (subs->transfer_done >= runtime->period_size) {
> subs->transfer_done -= runtime->period_size;
> + subs->frame_limit = 0;
> period_elapsed = 1;
> if (subs->fmt_type == UAC_FORMAT_TYPE_II) {
> if (subs->transfer_done > 0) {
> @@ -1366,8 +1374,10 @@ static void prepare_playback_urb(struct
> break;
> }
> }
> - if (period_elapsed &&
> - !snd_usb_endpoint_implicit_feedback_sink(subs->data_endpoint)) /* finish at the period boundary */
> + /* finish at the period boundary or after enough frames */
> + if ((period_elapsed ||
> + subs->transfer_done >= subs->frame_limit) &&
> + !snd_usb_endpoint_implicit_feedback_sink(ep))
> break;
> }
> bytes = frames * ep->stride;
> Index: usb-3.11/sound/usb/endpoint.c
> ===================================================================
> --- usb-3.11.orig/sound/usb/endpoint.c
> +++ usb-3.11/sound/usb/endpoint.c
> @@ -571,11 +571,14 @@ static int data_ep_set_params(struct snd
> snd_pcm_format_t pcm_format,
> unsigned int channels,
> unsigned int period_bytes,
> + unsigned int frames_per_period,
> + unsigned int periods_per_buffer,
> struct audioformat *fmt,
> struct snd_usb_endpoint *sync_ep)
> {
> - unsigned int maxsize, i, urb_packs, total_packs, packs_per_ms;
> - int is_playback = usb_pipeout(ep->pipe);
> + unsigned int maxsize, minsize, packs_per_ms, max_packs_per_urb;
> + unsigned int max_packs_per_period, urbs_per_period, urb_packs;
> + unsigned int max_urbs, i;
> int frame_bits = snd_pcm_format_physical_width(pcm_format) * channels;
>
> if (pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE && fmt->dsd_dop) {
> @@ -608,58 +611,67 @@ static int data_ep_set_params(struct snd
> else
> ep->curpacksize = maxsize;
>
> - if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL)
> + if (snd_usb_get_speed(ep->chip->dev) != USB_SPEED_FULL) {
> packs_per_ms = 8 >> ep->datainterval;
> - else
> - packs_per_ms = 1;
> -
> - if (is_playback && !snd_usb_endpoint_implicit_feedback_sink(ep)) {
> - urb_packs = max(ep->chip->nrpacks, 1);
> - urb_packs = min(urb_packs, (unsigned int) MAX_PACKS);
> + max_packs_per_urb = MAX_PACKS_HS;
> } else {
> - urb_packs = 1;
> + packs_per_ms = 1;
> + max_packs_per_urb = MAX_PACKS;
> }
> -
> - urb_packs *= packs_per_ms;
> -
> if (sync_ep && !snd_usb_endpoint_implicit_feedback_sink(ep))
> - urb_packs = min(urb_packs, 1U << sync_ep->syncinterval);
> + max_packs_per_urb = min(max_packs_per_urb,
> + 1U << sync_ep->syncinterval);
> + max_packs_per_urb = max(1u, max_packs_per_urb >> ep->datainterval);
> +
> + /*
> + * Capture endpoints need to use small URBs because there's no way
> + * to tell in advance where the next period will end, and we don't
> + * want the next URB to complete much after the period ends.
> + *
> + * Playback endpoints with implicit sync much use the same parameters
> + * as their corresponding capture endpoint.
> + */
> + if (usb_pipein(ep->pipe) ||
> + snd_usb_endpoint_implicit_feedback_sink(ep)) {
> +
> + /* make capture URBs <= 1 ms and smaller than a period */
> + urb_packs = min(max_packs_per_urb, packs_per_ms);
> + while (urb_packs > 1 && urb_packs * maxsize >= period_bytes)
> + urb_packs >>= 1;
> + ep->nurbs = MAX_URBS;
>
> - /* decide how many packets to be used */
> - if (is_playback && !snd_usb_endpoint_implicit_feedback_sink(ep)) {
> - unsigned int minsize, maxpacks;
> + /*
> + * Playback endpoints without implicit sync are adjusted so that
> + * a period fits as evenly as possible in the smallest number of
> + * URBs. The total number of URBs is adjusted to the size of the
> + * ALSA buffer, subject to the MAX_URBS and MAX_QUEUE limits.
> + */
> + } else {
> /* determine how small a packet can be */
> - minsize = (ep->freqn >> (16 - ep->datainterval))
> - * (frame_bits >> 3);
> + minsize = (ep->freqn >> (16 - ep->datainterval)) *
> + (frame_bits >> 3);
> /* with sync from device, assume it can be 12% lower */
> if (sync_ep)
> minsize -= minsize >> 3;
> minsize = max(minsize, 1u);
> - total_packs = (period_bytes + minsize - 1) / minsize;
> - /* we need at least two URBs for queueing */
> - if (total_packs < 2) {
> - total_packs = 2;
> - } else {
> - /* and we don't want too long a queue either */
> - maxpacks = max(MAX_QUEUE * packs_per_ms, urb_packs * 2);
> - total_packs = min(total_packs, maxpacks);
> - }
> - } else {
> - while (urb_packs > 1 && urb_packs * maxsize >= period_bytes)
> - urb_packs >>= 1;
> - total_packs = MAX_URBS * urb_packs;
> - }
>
> - ep->nurbs = (total_packs + urb_packs - 1) / urb_packs;
> - if (ep->nurbs > MAX_URBS) {
> - /* too much... */
> - ep->nurbs = MAX_URBS;
> - total_packs = MAX_URBS * urb_packs;
> - } else if (ep->nurbs < 2) {
> - /* too little - we need at least two packets
> - * to ensure contiguous playback/capture
> - */
> - ep->nurbs = 2;
> + /* how many packets will contain an entire ALSA period? */
> + max_packs_per_period = DIV_ROUND_UP(period_bytes, minsize);
> +
> + /* how many URBs will contain a period? */
> + urbs_per_period = DIV_ROUND_UP(max_packs_per_period,
> + max_packs_per_urb);
> + /* how many packets are needed in each URB? */
> + urb_packs = DIV_ROUND_UP(max_packs_per_period, urbs_per_period);
> +
> + /* limit the number of frames in a single URB */
> + ep->max_urb_frames = DIV_ROUND_UP(frames_per_period,
> + urbs_per_period);
> +
> + /* try to use enough URBs to contain an entire ALSA buffer */
> + max_urbs = min((unsigned) MAX_URBS,
> + MAX_QUEUE * packs_per_ms / urb_packs);
> + ep->nurbs = min(max_urbs, urbs_per_period * periods_per_buffer);
> }
>
> /* allocate and initialize data urbs */
> @@ -667,8 +679,7 @@ static int data_ep_set_params(struct snd
> struct snd_urb_ctx *u = &ep->urb[i];
> u->index = i;
> u->ep = ep;
> - u->packets = (i + 1) * total_packs / ep->nurbs
> - - i * total_packs / ep->nurbs;
> + u->packets = urb_packs;
> u->buffer_size = maxsize * u->packets;
>
> if (fmt->fmt_type == UAC_FORMAT_TYPE_II)
> @@ -745,6 +756,8 @@ out_of_memory:
> * @pcm_format: the audio fomat.
> * @channels: the number of audio channels.
> * @period_bytes: the number of bytes in one alsa period.
> + * @period_frames: the number of frames in one alsa period.
> + * @buffer_periods: the number of periods in one alsa buffer.
> * @rate: the frame rate.
> * @fmt: the USB audio format information
> * @sync_ep: the sync endpoint to use, if any
> @@ -757,6 +770,8 @@ int snd_usb_endpoint_set_params(struct s
> snd_pcm_format_t pcm_format,
> unsigned int channels,
> unsigned int period_bytes,
> + unsigned int period_frames,
> + unsigned int buffer_periods,
> unsigned int rate,
> struct audioformat *fmt,
> struct snd_usb_endpoint *sync_ep)
> @@ -790,7 +805,8 @@ int snd_usb_endpoint_set_params(struct s
> switch (ep->type) {
> case SND_USB_ENDPOINT_TYPE_DATA:
> err = data_ep_set_params(ep, pcm_format, channels,
> - period_bytes, fmt, sync_ep);
> + period_bytes, period_frames,
> + buffer_periods, fmt, sync_ep);
> break;
> case SND_USB_ENDPOINT_TYPE_SYNC:
> err = sync_ep_set_params(ep, fmt);
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2013-09-09 14:20 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-24 14:41 Buffer size for ALSA USB PCM audio Alan Stern
[not found] ` <Pine.LNX.4.44L0.1307241013190.1313-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-07-24 14:54 ` Takashi Iwai
[not found] ` <s5hsiz4knyf.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2013-07-24 15:22 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1307241108180.1313-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-07-24 15:26 ` Takashi Iwai
[not found] ` <s5hob9skmgs.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2013-07-24 15:43 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1307241138180.1313-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-07-25 8:24 ` Takashi Iwai
[not found] ` <s5hbo5rkpwm.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2013-07-25 14:50 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1307251043470.882-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-07-29 10:03 ` Takashi Iwai
[not found] ` <s5hvc3tfzt7.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2013-07-29 15:00 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1307291041410.1479-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-07-29 17:12 ` Clemens Ladisch
[not found] ` <51F6A262.6010800-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
2013-07-29 18:20 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1307291400450.1479-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-07-29 19:23 ` Daniel Mack
[not found] ` <51F6C123.7020407-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-07-29 19:38 ` Alan Stern
2013-07-30 6:43 ` [alsa-devel] " Takashi Iwai
[not found] ` <s5hob9k5z0b.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2013-08-01 17:11 ` Eldad Zack
2013-08-01 17:37 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1307311645190.1546-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-12 13:22 ` [alsa-devel] " Takashi Iwai
[not found] ` <s5h7gfryrgh.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2013-08-12 14:53 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308121036460.1489-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-12 15:04 ` Takashi Iwai
[not found] ` <s5hvc3bx85c.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2013-08-12 16:50 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308121218590.1489-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-13 21:06 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308131659320.897-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-13 21:34 ` Daniel Mack
[not found] ` <520AA657.5010704-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-08-14 20:50 ` Eldad Zack
2013-08-15 16:06 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308151136180.905-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-18 16:56 ` Clemens Ladisch
2013-08-14 18:34 ` Clemens Ladisch
[not found] ` <520BCDBC.2060507-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
2013-08-21 21:37 ` [alsa-devel] " Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308211654010.1297-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-26 18:37 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308261419100.886-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-27 6:32 ` James Stone
[not found] ` <CABRv+91ZGMHbHZFW0gYOL-zGP=HbmiJU51z-_C_2Jj+5ATisrA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-08-27 16:53 ` Alan Stern
2013-08-27 7:19 ` Clemens Ladisch
2013-08-27 8:01 ` Pavel Hofman
[not found] ` <521C5CC2.7030809-49v42ZqfXVBBDgjK7y7TUQ@public.gmane.org>
2013-08-27 8:11 ` [alsa-devel] " Clemens Ladisch
[not found] ` <521C5315.3030207-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
2013-08-27 16:50 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308271246130.1810-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-27 20:03 ` Clemens Ladisch
[not found] ` <521D060E.4-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
2013-08-27 20:11 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308271608430.940-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-28 6:41 ` Clemens Ladisch
[not found] ` <521D9BAE.2060508-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
2013-08-28 18:46 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308281441090.1541-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-29 8:10 ` James Stone
[not found] ` <CABRv+92cJPKVT9f2dyHJ_rg6sX3hP9Ct6QFas771fS79h7Eu2w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-08-29 15:00 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1308291059300.1170-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2013-08-29 17:45 ` James Stone
2013-08-29 18:42 ` Alan Stern
[not found] ` <CABRv+93oVW0rDEJnNeGyfqem2PM42b28-z9q+Ze8r7rky7szDA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-03 14:04 ` [alsa-devel] " Alan Stern
2013-09-22 21:50 ` Eldad Zack
2013-09-09 14:20 ` Daniel Mack [this message]
[not found] ` <522DD92C.4020009-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-09-09 15:36 ` Alan Stern
2013-08-13 21:54 ` Clemens Ladisch
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=522DD92C.4020009@gmail.com \
--to=zonque-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org \
--cc=clemens-P6GI/4k7KOmELgA04lAiVw@public.gmane.org \
--cc=eldad-v6AqZgAe4C4dvzyIwGCCOg@public.gmane.org \
--cc=jamesmstone-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org \
--cc=tiwai-l3A5Bk7waGM@public.gmane.org \
/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.