From: Andrej Krutak <dev@andree.sk>
To: tiwai@suse.com, perex@perex.cz, stefanha@gmail.com,
grabner@icg.tugraz.at, alsa-devel@alsa-project.org
Cc: Andrej Krutak <dev@andree.sk>
Subject: [PATCH v4 01/12] ALSA: line6: Enable different number of URBs for frame transfers
Date: Sun, 18 Sep 2016 20:59:21 +0200 [thread overview]
Message-ID: <1474225172-32081-2-git-send-email-dev@andree.sk> (raw)
In-Reply-To: <1474225172-32081-1-git-send-email-dev@andree.sk>
This basically changes LINE6_ISO_BUFFERS constant to a configurable
iso_buffers property.
Signed-off-by: Andrej Krutak <dev@andree.sk>
---
sound/usb/line6/capture.c | 17 +++++++++++------
sound/usb/line6/driver.c | 1 +
sound/usb/line6/driver.h | 2 ++
sound/usb/line6/pcm.c | 23 +++++++++++++++--------
sound/usb/line6/pcm.h | 2 +-
sound/usb/line6/playback.c | 19 ++++++++++++-------
6 files changed, 42 insertions(+), 22 deletions(-)
diff --git a/sound/usb/line6/capture.c b/sound/usb/line6/capture.c
index f518fbb..e20a6bd 100644
--- a/sound/usb/line6/capture.c
+++ b/sound/usb/line6/capture.c
@@ -29,10 +29,10 @@ static int submit_audio_in_urb(struct snd_line6_pcm *line6pcm)
int ret;
struct urb *urb_in;
- index =
- find_first_zero_bit(&line6pcm->in.active_urbs, LINE6_ISO_BUFFERS);
+ index = find_first_zero_bit(&line6pcm->in.active_urbs,
+ line6pcm->line6->iso_buffers);
- if (index < 0 || index >= LINE6_ISO_BUFFERS) {
+ if (index < 0 || index >= line6pcm->line6->iso_buffers) {
dev_err(line6pcm->line6->ifcdev, "no free URB found\n");
return -EINVAL;
}
@@ -73,7 +73,7 @@ int line6_submit_audio_in_all_urbs(struct snd_line6_pcm *line6pcm)
{
int ret = 0, i;
- for (i = 0; i < LINE6_ISO_BUFFERS; ++i) {
+ for (i = 0; i < line6pcm->line6->iso_buffers; ++i) {
ret = submit_audio_in_urb(line6pcm);
if (ret < 0)
break;
@@ -154,7 +154,7 @@ static void audio_in_callback(struct urb *urb)
line6pcm->in.last_frame = urb->start_frame;
/* find index of URB */
- for (index = 0; index < LINE6_ISO_BUFFERS; ++index)
+ for (index = 0; index < line6pcm->line6->iso_buffers; ++index)
if (urb == line6pcm->in.urbs[index])
break;
@@ -247,8 +247,13 @@ int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm)
struct usb_line6 *line6 = line6pcm->line6;
int i;
+ line6pcm->in.urbs = kzalloc(
+ sizeof(struct urb *) * line6->iso_buffers, GFP_KERNEL);
+ if (line6pcm->in.urbs == NULL)
+ return -ENOMEM;
+
/* create audio URBs and fill in constant values: */
- for (i = 0; i < LINE6_ISO_BUFFERS; ++i) {
+ for (i = 0; i < line6->iso_buffers; ++i) {
struct urb *urb;
/* URB for audio in: */
diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index 81b7da8..527c408 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -467,6 +467,7 @@ static void line6_get_interval(struct usb_line6 *line6)
unsigned epnum = usb_pipeendpoint(pipe);
ep = usbdev->ep_in[epnum];
+ line6->iso_buffers = LINE6_ISO_BUFFERS;
if (ep) {
line6->interval = ep->desc.bInterval;
line6->max_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
diff --git a/sound/usb/line6/driver.h b/sound/usb/line6/driver.h
index 7da643e..43dd1d0 100644
--- a/sound/usb/line6/driver.h
+++ b/sound/usb/line6/driver.h
@@ -111,6 +111,8 @@ struct usb_line6 {
/* Interval (ms) */
int interval;
+ /* Number of isochronous URBs used for frame transfers */
+ int iso_buffers;
/* Maximum size of USB packet */
int max_packet_size;
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c
index 41aa335..6c9b7cf 100644
--- a/sound/usb/line6/pcm.c
+++ b/sound/usb/line6/pcm.c
@@ -104,7 +104,7 @@ static void line6_unlink_audio_urbs(struct snd_line6_pcm *line6pcm,
{
int i;
- for (i = 0; i < LINE6_ISO_BUFFERS; i++) {
+ for (i = 0; i < line6pcm->line6->iso_buffers; i++) {
if (test_bit(i, &pcms->active_urbs)) {
if (!test_and_set_bit(i, &pcms->unlink_urbs))
usb_unlink_urb(pcms->urbs[i]);
@@ -124,7 +124,7 @@ static void line6_wait_clear_audio_urbs(struct snd_line6_pcm *line6pcm,
do {
alive = 0;
- for (i = 0; i < LINE6_ISO_BUFFERS; i++) {
+ for (i = 0; i < line6pcm->line6->iso_buffers; i++) {
if (test_bit(i, &pcms->active_urbs))
alive++;
}
@@ -153,8 +153,9 @@ static int line6_buffer_acquire(struct snd_line6_pcm *line6pcm,
{
/* Invoked multiple times in a row so allocate once only */
if (!test_and_set_bit(type, &pstr->opened) && !pstr->buffer) {
- pstr->buffer = kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
- line6pcm->max_packet_size, GFP_KERNEL);
+ pstr->buffer = kmalloc(line6pcm->line6->iso_buffers *
+ LINE6_ISO_PACKETS *
+ line6pcm->max_packet_size, GFP_KERNEL);
if (!pstr->buffer)
return -ENOMEM;
}
@@ -434,24 +435,30 @@ static struct snd_kcontrol_new line6_controls[] = {
/*
Cleanup the PCM device.
*/
-static void cleanup_urbs(struct line6_pcm_stream *pcms)
+static void cleanup_urbs(struct line6_pcm_stream *pcms, int iso_buffers)
{
int i;
- for (i = 0; i < LINE6_ISO_BUFFERS; i++) {
+ /* Most likely impossible in current code... */
+ if (pcms->urbs == NULL)
+ return;
+
+ for (i = 0; i < iso_buffers; i++) {
if (pcms->urbs[i]) {
usb_kill_urb(pcms->urbs[i]);
usb_free_urb(pcms->urbs[i]);
}
}
+ kfree(pcms->urbs);
+ pcms->urbs = NULL;
}
static void line6_cleanup_pcm(struct snd_pcm *pcm)
{
struct snd_line6_pcm *line6pcm = snd_pcm_chip(pcm);
- cleanup_urbs(&line6pcm->out);
- cleanup_urbs(&line6pcm->in);
+ cleanup_urbs(&line6pcm->out, line6pcm->line6->iso_buffers);
+ cleanup_urbs(&line6pcm->in, line6pcm->line6->iso_buffers);
kfree(line6pcm);
}
diff --git a/sound/usb/line6/pcm.h b/sound/usb/line6/pcm.h
index 508410a..e983880 100644
--- a/sound/usb/line6/pcm.h
+++ b/sound/usb/line6/pcm.h
@@ -90,7 +90,7 @@ struct line6_pcm_properties {
struct line6_pcm_stream {
/* allocated URBs */
- struct urb *urbs[LINE6_ISO_BUFFERS];
+ struct urb **urbs;
/* Temporary buffer;
* Since the packet size is not known in advance, this buffer is
diff --git a/sound/usb/line6/playback.c b/sound/usb/line6/playback.c
index 97ed593..7a52806 100644
--- a/sound/usb/line6/playback.c
+++ b/sound/usb/line6/playback.c
@@ -154,10 +154,10 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
(USB_INTERVALS_PER_SECOND / LINE6_ISO_INTERVAL);
struct urb *urb_out;
- index =
- find_first_zero_bit(&line6pcm->out.active_urbs, LINE6_ISO_BUFFERS);
+ index = find_first_zero_bit(&line6pcm->out.active_urbs,
+ line6pcm->line6->iso_buffers);
- if (index < 0 || index >= LINE6_ISO_BUFFERS) {
+ if (index < 0 || index >= line6pcm->line6->iso_buffers) {
dev_err(line6pcm->line6->ifcdev, "no free URB found\n");
return -EINVAL;
}
@@ -286,7 +286,7 @@ int line6_submit_audio_out_all_urbs(struct snd_line6_pcm *line6pcm)
{
int ret = 0, i;
- for (i = 0; i < LINE6_ISO_BUFFERS; ++i) {
+ for (i = 0; i < line6pcm->line6->iso_buffers; ++i) {
ret = submit_audio_out_urb(line6pcm);
if (ret < 0)
break;
@@ -313,11 +313,11 @@ static void audio_out_callback(struct urb *urb)
line6pcm->out.last_frame = urb->start_frame;
/* find index of URB */
- for (index = 0; index < LINE6_ISO_BUFFERS; index++)
+ for (index = 0; index < line6pcm->line6->iso_buffers; index++)
if (urb == line6pcm->out.urbs[index])
break;
- if (index >= LINE6_ISO_BUFFERS)
+ if (index >= line6pcm->line6->iso_buffers)
return; /* URB has been unlinked asynchronously */
for (i = 0; i < LINE6_ISO_PACKETS; i++)
@@ -401,8 +401,13 @@ int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm)
struct usb_line6 *line6 = line6pcm->line6;
int i;
+ line6pcm->out.urbs = kzalloc(
+ sizeof(struct urb *) * line6->iso_buffers, GFP_KERNEL);
+ if (line6pcm->out.urbs == NULL)
+ return -ENOMEM;
+
/* create audio URBs and fill in constant values: */
- for (i = 0; i < LINE6_ISO_BUFFERS; ++i) {
+ for (i = 0; i < line6->iso_buffers; ++i) {
struct urb *urb;
/* URB for audio out: */
--
1.9.1
next prev parent reply other threads:[~2016-09-18 19:00 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-11 19:02 [PATCH 00/15] Line6 POD X3/X3Live suport Andrej Krutak
2016-08-11 19:02 ` [PATCH 01/15] ALSA: line6: Make driver configuration more generic Andrej Krutak
2016-08-12 8:24 ` Takashi Iwai
2016-08-11 19:02 ` [PATCH 02/15] ALSA: line6: Add LINE6_CAP_IN_NEEDS_OUT, a void playback stream during capture Andrej Krutak
2016-08-11 19:02 ` [PATCH 03/15] ALSA: line6: Distinguish device init (ctrl EP) and MIDI data transfer (int EP) Andrej Krutak
2016-08-11 19:02 ` [PATCH 04/15] ALSA: line6: Add support for POD X3 Andrej Krutak
2016-08-11 19:02 ` [PATCH 05/15] ALSA: line6: Use device_create_file instead of snd_card_add_dev_attr Andrej Krutak
2016-08-12 8:26 ` Takashi Iwai
2016-08-11 19:02 ` [PATCH 06/15] ALSA: line6: Allow bulk endpoints instead of interrupt endpoints Andrej Krutak
2016-08-11 19:02 ` [PATCH 07/15] ALSA: line6: Allow processing of raw incoming messages Andrej Krutak
2016-08-11 19:02 ` [PATCH 08/15] ALSA: line6: Cleanup initialization Andrej Krutak
2016-08-11 19:02 ` [PATCH 09/15] ALSA: line6: Add hwdep interface to access the POD control messages Andrej Krutak
2016-08-12 8:44 ` Takashi Iwai
2016-08-12 11:10 ` Andrej Kruták
2016-08-12 12:03 ` Takashi Iwai
2016-08-12 12:15 ` Andrej Kruták
2016-08-12 12:30 ` Takashi Iwai
2016-08-12 16:43 ` Andrej Kruták
2016-08-12 20:01 ` Takashi Iwai
2016-08-14 7:59 ` Andrej Kruták
2016-08-11 19:02 ` [PATCH 10/15] ALSA: line6: Add proper locks for hwdep open/release/read Andrej Krutak
2016-08-12 8:44 ` Takashi Iwai
2016-08-11 19:02 ` [PATCH 11/15] ALSA: line6: Only free buffer if it is set Andrej Krutak
2016-08-12 8:45 ` Takashi Iwai
2016-08-11 19:02 ` [PATCH 12/15] ALSA: line6: Give up on the lock while URBs are released Andrej Krutak
2016-08-12 8:45 ` Takashi Iwai
2016-08-12 11:14 ` Andrej Kruták
2016-08-12 12:04 ` Takashi Iwai
2016-08-11 19:02 ` [PATCH 13/15] ALSA: line6: Add support for POD X3 Live (only USB ID differs from POD X3) Andrej Krutak
2016-08-11 19:02 ` [PATCH 14/15] ALSA: line6: Give up hwdep spinlock temporarily during read operation Andrej Krutak
2016-08-12 8:46 ` Takashi Iwai
2016-08-11 19:02 ` [PATCH 15/15] ALSA: line6: Remove double line6_pcm_release() after failed acquire Andrej Krutak
2016-08-12 8:46 ` Takashi Iwai
2016-08-12 8:14 ` [PATCH 00/15] Line6 POD X3/X3Live suport Takashi Iwai
2016-08-12 10:31 ` Andrej Kruták
2016-08-18 22:20 ` [PATCH v2 0/9] " Andrej Krutak
2016-08-18 22:20 ` [PATCH v2 1/9] ALSA: line6: Make driver configuration more generic Andrej Krutak
2016-08-24 14:50 ` Takashi Iwai
2016-08-18 22:20 ` [PATCH v2 2/9] ALSA: line6: Add LINE6_CAP_IN_NEEDS_OUT, a void playback stream during capture Andrej Krutak
2016-08-24 14:53 ` Takashi Iwai
2016-08-18 22:20 ` [PATCH v2 3/9] ALSA: line6: Distinguish device init (ctrl EP) and MIDI data transfer (int EP) Andrej Krutak
2016-08-24 14:56 ` Takashi Iwai
2016-08-18 22:20 ` [PATCH v2 4/9] ALSA: line6: Add support for POD X3 Andrej Krutak
2016-08-18 22:20 ` [PATCH v2 5/9] ALSA: line6: Add support for POD X3 Live (only USB ID differs from POD X3) Andrej Krutak
2016-08-18 22:20 ` [PATCH v2 6/9] ALSA: line6: Allow bulk endpoints instead of interrupt endpoints Andrej Krutak
2016-08-24 15:02 ` Takashi Iwai
2016-08-18 22:20 ` [PATCH v2 7/9] ALSA: line6: Allow processing of raw incoming messages Andrej Krutak
2016-08-24 15:05 ` Takashi Iwai
2016-08-30 14:35 ` Andrej Kruták
2016-08-18 22:20 ` [PATCH v2 8/9] ALSA: line6: Cleanup initialization Andrej Krutak
2016-08-24 15:06 ` Takashi Iwai
2016-08-18 22:20 ` [PATCH v2 9/9] ALSA: line6: Add hwdep interface to access the POD control messages Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 00/12] Line6 POD X3/X3Live suport Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 01/12] ALSA: line6: Enable different number of URBs for frame transfers Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 02/12] ALSA: line6: Add high-speed USB support Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 03/12] ALSA: line6: Support assymetrical in/out configurations Andrej Krutak
2016-09-16 18:34 ` kbuild test robot
2016-09-16 9:12 ` [PATCH v3 04/12] ALSA: line6: Allow different channel numbers for in/out Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 05/12] ALSA: line6: Add LINE6_CAP_IN_NEEDS_OUT, a void playback stream during capture Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 06/12] ALSA: line6: Distinguish device init (ctrl EP) and MIDI data transfer (int EP) Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 07/12] ALSA: line6: Allow processing of raw incoming messages Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 08/12] ALSA: line6: Add support for POD X3 Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 09/12] ALSA: line6: Add support for POD X3 Live (only USB ID differs from POD X3) Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 10/12] ALSA: line6: Only determine control port properties if needed Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 11/12] ALSA: line6: Cleanup podhd initialization Andrej Krutak
2016-09-16 9:12 ` [PATCH v3 12/12] ALSA: line6: Add hwdep interface to access the POD control messages Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 00/12] Line6 POD X3/X3Live suport Andrej Krutak
2016-09-18 18:59 ` Andrej Krutak [this message]
2016-09-18 18:59 ` [PATCH v4 02/12] ALSA: line6: Add high-speed USB support Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 03/12] ALSA: line6: Support assymetrical in/out configurations Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 04/12] ALSA: line6: Allow different channel numbers for in/out Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 05/12] ALSA: line6: Add LINE6_CAP_IN_NEEDS_OUT, a void playback stream during capture Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 06/12] ALSA: line6: Distinguish device init (ctrl EP) and MIDI data transfer (int EP) Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 07/12] ALSA: line6: Allow processing of raw incoming messages Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 08/12] ALSA: line6: Add support for POD X3 Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 09/12] ALSA: line6: Add support for POD X3 Live (only USB ID differs from POD X3) Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 10/12] ALSA: line6: Only determine control port properties if needed Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 11/12] ALSA: line6: Cleanup podhd initialization Andrej Krutak
2016-09-18 18:59 ` [PATCH v4 12/12] ALSA: line6: Add hwdep interface to access the POD control messages Andrej Krutak
2016-09-19 21:06 ` Takashi Iwai
2016-09-19 21:07 ` [PATCH v4 00/12] Line6 POD X3/X3Live suport 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=1474225172-32081-2-git-send-email-dev@andree.sk \
--to=dev@andree.sk \
--cc=alsa-devel@alsa-project.org \
--cc=grabner@icg.tugraz.at \
--cc=perex@perex.cz \
--cc=stefanha@gmail.com \
--cc=tiwai@suse.com \
/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;
as well as URLs for NNTP newsgroup(s).