Hi Jaroslav,

this fixes 24Bit 4Channel capturing.
Please commit.

Thanks,
Karsten
Index: usbusx2y.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2y.c,v
retrieving revision 1.4
diff -u -r1.4 usbusx2y.c
--- usbusx2y.c	2 Dec 2003 10:15:02 -0000	1.4
+++ usbusx2y.c	30 Dec 2003 13:21:03 -0000
@@ -1,6 +1,10 @@
 /*
  * usbus428.c - ALSA USB US-428 Driver
  *
+2003-12-30 Karsten Wiese
+	Version 0.4.1:
+	Fix 24Bit 4Channel capturing for the us428.
+
 2003-11-27 Karsten Wiese, Martin Langer
 	Version 0.4:
 	us122 support.
@@ -85,7 +89,7 @@
 
 
 MODULE_AUTHOR("Karsten Wiese <[EMAIL PROTECTED]>");
-MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.4");
+MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.4.1");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
 MODULE_DEVICES("{{TASCAM(0x1604), "NAME_ALLCAPS"(0x8001)(0x8007) }}");
Index: usbusx2yaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usx2y/usbusx2yaudio.c,v
retrieving revision 1.4
diff -u -r1.4 usbusx2yaudio.c
--- usbusx2yaudio.c	5 Dec 2003 08:06:19 -0000	1.4
+++ usbusx2yaudio.c	30 Dec 2003 13:21:05 -0000
@@ -141,13 +141,22 @@
  * copy the data from each desctiptor to the pcm buffer, and
  * update the current position.
  */
-static void framecpy_4c(int* p_dma_area, int* cp, int cnt)
+static void framecpy_4c_16(unsigned char *p_dma_area, unsigned char *cp, int cnt)
 {
 	do{
-		*p_dma_area = *cp;
-		p_dma_area += 2;
-		cp++;
-	}while (--cnt);
+		*(int *)p_dma_area = *(int *)cp;
+		p_dma_area += 8;
+		cp += 4;
+	} while (--cnt);
+}
+
+static void framecpy_4c_24(unsigned char *p_dma_area, unsigned char *cp, int cnt)
+{
+	do{
+		memcpy(p_dma_area, cp, 6);
+		p_dma_area +=  12;
+		cp += 6;
+	} while (--cnt);
 }
 
 static int snd_usX2Y_urb_capt_retire(snd_usX2Y_substream_t *subs,
@@ -158,6 +167,10 @@
 	unsigned char	*cp;
 	int 		i, len, lens = 0, hwptr_done = subs->hwptr_done;
 	usX2Ydev_t	*usX2Y = subs->stream->usX2Y;
+	void (*fourc_cpy)(unsigned char* p_dma_area, unsigned char* cp, int cnt) = 0;
+
+	if (runtime->channels == 4)
+		fourc_cpy = usX2Y->stride == 4 ? framecpy_4c_16 : framecpy_4c_24;
 
 	for (i = 0; i < NRPACKS; i++) {
 		cp = (unsigned char*)urb->transfer_buffer + urb->iso_frame_desc[i].offset;
@@ -200,21 +213,21 @@
 		/* copy a data chunk */
 		if ((hwptr_done + len) > runtime->buffer_size) {
 			int cnt = runtime->buffer_size - hwptr_done;
-			if (runtime->channels != 4) {
+			if (fourc_cpy) {
+				unsigned char *p_dma_area = runtime->dma_area + (urb->pipe == subs->datapipe[0] ? 0 : usX2Y->stride);
+				fourc_cpy(p_dma_area + hwptr_done * usX2Y->stride * 2, cp, cnt);
+				fourc_cpy(p_dma_area, cp + cnt * usX2Y->stride, len - cnt);
+			} else {
 				int blen = cnt * usX2Y->stride;
 				memcpy(runtime->dma_area + hwptr_done * usX2Y->stride, cp, blen);
 				memcpy(runtime->dma_area, cp + blen, len * usX2Y->stride - blen);
-			} else {
-				int* p_dma_area = (int*)runtime->dma_area + (urb->pipe == subs->datapipe[0] ? 0 : 1);
-				framecpy_4c(p_dma_area + hwptr_done * 2, (int*)cp, cnt);
-				framecpy_4c(p_dma_area, (int*)cp + cnt, len - cnt);
 			}
 		} else {
-			if (runtime->channels != 4) {
-				memcpy(runtime->dma_area + hwptr_done * usX2Y->stride, cp, len * usX2Y->stride);
+			if (fourc_cpy) {
+				unsigned char *p_dma_area = runtime->dma_area + (urb->pipe == subs->datapipe[0] ? 0 : usX2Y->stride);
+				fourc_cpy(p_dma_area + hwptr_done * usX2Y->stride * 2, cp, len);
 			} else {
-				int* p_dma_area = (int*)runtime->dma_area + (urb->pipe == subs->datapipe[0] ? 0 : 1);
-				framecpy_4c(p_dma_area + hwptr_done * 2, (int*)cp, len);
+				memcpy(runtime->dma_area + hwptr_done * usX2Y->stride, cp, len * usX2Y->stride);
 			}
 		}
 		lens += len;
@@ -290,7 +303,8 @@
 	} else {
 		/* set the buffer pointer */
 		urb->transfer_buffer = runtime->dma_area + subs->hwptr * usX2Y->stride;
-		subs->hwptr += count;
+		if ((subs->hwptr += count) >= runtime->buffer_size)
+			subs->hwptr -= runtime->buffer_size;			
 	}
 	spin_unlock_irqrestore(&subs->lock, flags);
 	urb->transfer_buffer_length = count * usX2Y->stride;

Reply via email to