alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
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 03/12] ALSA: line6: Support assymetrical in/out configurations
Date: Sun, 18 Sep 2016 20:59:23 +0200	[thread overview]
Message-ID: <1474225172-32081-4-git-send-email-dev@andree.sk> (raw)
In-Reply-To: <1474225172-32081-1-git-send-email-dev@andree.sk>

Splits max_packet_size to max_packet_size_in/out (e.g. for
different channel counts).

Signed-off-by: Andrej Krutak <dev@andree.sk>
---
 sound/usb/line6/capture.c  | 10 +++++-----
 sound/usb/line6/pcm.c      | 33 +++++++++++++++++++--------------
 sound/usb/line6/pcm.h      |  5 +++--
 sound/usb/line6/playback.c |  2 +-
 4 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/sound/usb/line6/capture.c b/sound/usb/line6/capture.c
index 44e9a8c..73cea26 100644
--- a/sound/usb/line6/capture.c
+++ b/sound/usb/line6/capture.c
@@ -44,13 +44,13 @@ static int submit_audio_in_urb(struct snd_line6_pcm *line6pcm)
 		struct usb_iso_packet_descriptor *fin =
 		    &urb_in->iso_frame_desc[i];
 		fin->offset = urb_size;
-		fin->length = line6pcm->max_packet_size;
-		urb_size += line6pcm->max_packet_size;
+		fin->length = line6pcm->max_packet_size_in;
+		urb_size += line6pcm->max_packet_size_in;
 	}
 
 	urb_in->transfer_buffer =
 	    line6pcm->in.buffer +
-	    index * LINE6_ISO_PACKETS * line6pcm->max_packet_size;
+	    index * LINE6_ISO_PACKETS * line6pcm->max_packet_size_in;
 	urb_in->transfer_buffer_length = urb_size;
 	urb_in->context = line6pcm;
 
@@ -173,10 +173,10 @@ static void audio_in_callback(struct urb *urb)
 		fbuf = urb->transfer_buffer + fin->offset;
 		fsize = fin->actual_length;
 
-		if (fsize > line6pcm->max_packet_size) {
+		if (fsize > line6pcm->max_packet_size_in) {
 			dev_err(line6pcm->line6->ifcdev,
 				"driver and/or device bug: packet too large (%d > %d)\n",
-				fsize, line6pcm->max_packet_size);
+				fsize, line6pcm->max_packet_size_in);
 		}
 
 		length += fsize;
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c
index 6c9b7cf..31b68fa 100644
--- a/sound/usb/line6/pcm.c
+++ b/sound/usb/line6/pcm.c
@@ -146,16 +146,20 @@ get_stream(struct snd_line6_pcm *line6pcm, int direction)
 }
 
 /* allocate a buffer if not opened yet;
- * call this in line6pcm.state_change mutex
+ * call this in line6pcm.state_mutex
  */
 static int line6_buffer_acquire(struct snd_line6_pcm *line6pcm,
-				struct line6_pcm_stream *pstr, int type)
+				struct line6_pcm_stream *pstr, int direction, int type)
 {
+	const int pkt_size =
+		(direction == SNDRV_PCM_STREAM_PLAYBACK) ?
+			line6pcm->max_packet_size_out :
+			line6pcm->max_packet_size_in;
+
 	/* Invoked multiple times in a row so allocate once only */
 	if (!test_and_set_bit(type, &pstr->opened) && !pstr->buffer) {
 		pstr->buffer = kmalloc(line6pcm->line6->iso_buffers *
-                                      LINE6_ISO_PACKETS *
-                                      line6pcm->max_packet_size, GFP_KERNEL);
+		                       LINE6_ISO_PACKETS * pkt_size, GFP_KERNEL);
 		if (!pstr->buffer)
 			return -ENOMEM;
 	}
@@ -163,12 +167,11 @@ static int line6_buffer_acquire(struct snd_line6_pcm *line6pcm,
 }
 
 /* free a buffer if all streams are closed;
- * call this in line6pcm.state_change mutex
+ * call this in line6pcm.state_mutex
  */
 static void line6_buffer_release(struct snd_line6_pcm *line6pcm,
 				 struct line6_pcm_stream *pstr, int type)
 {
-
 	clear_bit(type, &pstr->opened);
 	if (!pstr->opened) {
 		line6_wait_clear_audio_urbs(line6pcm, pstr);
@@ -195,6 +198,7 @@ static int line6_stream_start(struct snd_line6_pcm *line6pcm, int direction,
 		else
 			ret = line6_submit_audio_in_all_urbs(line6pcm);
 	}
+
 	if (ret < 0)
 		clear_bit(type, &pstr->running);
 	spin_unlock_irqrestore(&pstr->lock, flags);
@@ -290,7 +294,7 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int type)
 	mutex_lock(&line6pcm->state_mutex);
 	for (dir = 0; dir < 2; dir++) {
 		pstr = get_stream(line6pcm, dir);
-		ret = line6_buffer_acquire(line6pcm, pstr, type);
+		ret = line6_buffer_acquire(line6pcm, pstr, dir, type);
 		if (ret < 0)
 			goto error;
 		if (!pstr->running)
@@ -335,7 +339,8 @@ int snd_line6_hw_params(struct snd_pcm_substream *substream,
 	struct line6_pcm_stream *pstr = get_stream(line6pcm, substream->stream);
 
 	mutex_lock(&line6pcm->state_mutex);
-	ret = line6_buffer_acquire(line6pcm, pstr, LINE6_STREAM_PCM);
+	ret = line6_buffer_acquire(line6pcm, pstr, substream->stream,
+	                           LINE6_STREAM_PCM);
 	if (ret < 0)
 		goto error;
 
@@ -530,12 +535,12 @@ int line6_init_pcm(struct usb_line6 *line6,
 	line6pcm->volume_monitor = 255;
 	line6pcm->line6 = line6;
 
-	/* Read and write buffers are sized identically, so choose minimum */
-	line6pcm->max_packet_size = min(
-			usb_maxpacket(line6->usbdev,
-				usb_rcvisocpipe(line6->usbdev, ep_read), 0),
-			usb_maxpacket(line6->usbdev,
-				usb_sndisocpipe(line6->usbdev, ep_write), 1));
+	line6pcm->max_packet_size_in =
+		usb_maxpacket(line6->usbdev,
+			usb_rcvisocpipe(line6->usbdev, ep_read), 0);
+	line6pcm->max_packet_size_out =
+		usb_maxpacket(line6->usbdev,
+			usb_sndisocpipe(line6->usbdev, ep_write), 1);
 
 	spin_lock_init(&line6pcm->out.lock);
 	spin_lock_init(&line6pcm->in.lock);
diff --git a/sound/usb/line6/pcm.h b/sound/usb/line6/pcm.h
index 38bf4df..f408d15 100644
--- a/sound/usb/line6/pcm.h
+++ b/sound/usb/line6/pcm.h
@@ -155,11 +155,12 @@ struct snd_line6_pcm {
 	/* Previously captured frame (for software monitoring) */
 	unsigned char *prev_fbuf;
 
-	/* Size of previously captured frame (for software monitoring) */
+	/* Size of previously captured frame (for software monitoring/sync) */
 	int prev_fsize;
 
 	/* Maximum size of USB packet */
-	int max_packet_size;
+	int max_packet_size_in;
+	int max_packet_size_out;
 
 	/* PCM playback volume (left and right) */
 	int volume_playback[2];
diff --git a/sound/usb/line6/playback.c b/sound/usb/line6/playback.c
index d53aad1..7b2644f 100644
--- a/sound/usb/line6/playback.c
+++ b/sound/usb/line6/playback.c
@@ -195,7 +195,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
 	urb_frames = urb_size / bytes_per_frame;
 	urb_out->transfer_buffer =
 	    line6pcm->out.buffer +
-	    index * LINE6_ISO_PACKETS * line6pcm->max_packet_size;
+	    index * LINE6_ISO_PACKETS * line6pcm->max_packet_size_out;
 	urb_out->transfer_buffer_length = urb_size;
 	urb_out->context = line6pcm;
 
-- 
1.9.1

  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   ` [PATCH v4 01/12] ALSA: line6: Enable different number of URBs for frame transfers Andrej Krutak
2016-09-18 18:59   ` [PATCH v4 02/12] ALSA: line6: Add high-speed USB support Andrej Krutak
2016-09-18 18:59   ` Andrej Krutak [this message]
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-4-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).