Hi Takashi,

This is a Bugfix (sporadic hangups solved), cosmetical treatment and 
feature-enhancement (Setting of PCM-Out Volume according to 
Mastervolume-Slider at device start).
Please commit.

tnx,
Karsten

Index: alsa-driver/usb/us428/usX2Yhwdep.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/us428/usX2Yhwdep.c,v
retrieving revision 1.2
diff -u -r1.2 usX2Yhwdep.c
--- alsa-driver/usb/us428/usX2Yhwdep.c	24 Sep 2003 16:45:10 -0000	1.2
+++ alsa-driver/usb/us428/usX2Yhwdep.c	23 Oct 2003 17:01:39 -0000
@@ -93,7 +93,7 @@
 		return -EBUSY;
 
 	/* if userspace tries to mmap beyond end of our buffer, fail */ 
-        if (size > ((PAGE_SIZE - 1 + sizeof(us428ctls_sharedmem_t)) / PAGE_SIZE) * PAGE_SIZE){
+        if (size > ((PAGE_SIZE - 1 + sizeof(us428ctls_sharedmem_t)) / PAGE_SIZE) * PAGE_SIZE) {
 		snd_printd( "%i > %i\n", size,sizeof(us428ctls_sharedmem_t)); 
                 return -EINVAL;
 	}
@@ -103,6 +103,7 @@
 		if(!(us428->us428ctls_sharedmem = snd_malloc_pages(sizeof(us428ctls_sharedmem_t), GFP_KERNEL)))
 			return -ENOMEM;
 		memset(us428->us428ctls_sharedmem, -1, sizeof(us428ctls_sharedmem_t));
+		us428->us428ctls_sharedmem->CtlSnapShotLast = -2;
 	}
 	area->vm_ops = &us428ctls_vm_ops;
 #ifdef VM_RESERVED
@@ -174,11 +175,11 @@
 		i;
 	us428->Seq04 = 0;
 
-	if (NULL == (us428->AS04.buffer = kmalloc(URB_DataLen_AsyncSeq*URBS_AsyncSeq, GFP_KERNEL))){
+	if (NULL == (us428->AS04.buffer = kmalloc(URB_DataLen_AsyncSeq*URBS_AsyncSeq, GFP_KERNEL))) {
 		err = -ENOMEM;
 	}else
-		for (i = 0; i < URBS_AsyncSeq; ++i){
-			if (NULL == (us428->AS04.urb[i] = usb_alloc_urb(0, GFP_KERNEL))){
+		for (i = 0; i < URBS_AsyncSeq; ++i) {
+			if (NULL == (us428->AS04.urb[i] = usb_alloc_urb(0, GFP_KERNEL))) {
 				err = -ENOMEM;
 				break;
 			}
@@ -219,7 +220,7 @@
 	int err;
 
 	do {
-		if ((err = snd_us428_create_usbmidi(card)) < 0){
+		if ((err = snd_us428_create_usbmidi(card)) < 0) {
 			snd_printk("snd_us428_create_alsa_devices: snd_us428_create_usbmidi error %i \n", err);
 			break;
 		}
@@ -238,7 +239,7 @@
 	if (! (us428->In04urb = usb_alloc_urb(0, GFP_KERNEL)))
 		return -ENOMEM;
 
-	if (! (us428->In04Buf = kmalloc(21, GFP_KERNEL))){
+	if (! (us428->In04Buf = kmalloc(21, GFP_KERNEL))) {
 		usb_free_urb(us428->In04urb);
 		return -ENOMEM;
 	}
@@ -276,15 +277,15 @@
 	}
 	if (!err  &&  1 == dsp->index)
 		do {
-			if ((err = snd_us428_AsyncSeq04_init((us428dev_t*)hw->private_data))){
+			if ((err = snd_us428_AsyncSeq04_init((us428dev_t*)hw->private_data))) {
 				snd_printk("snd_us428_AsyncSeq04_init error \n");
 				break;
 			}
-			if ((err = snd_us428_In04_init((us428dev_t*)hw->private_data))){
+			if ((err = snd_us428_In04_init((us428dev_t*)hw->private_data))) {
 				snd_printk("snd_us428_In04_init error \n");
 				break;
 			}
-			if ((err = snd_us428_create_alsa_devices(hw->card))){
+			if ((err = snd_us428_create_alsa_devices(hw->card))) {
 				snd_printk("snd_us428_create_alsa_devices error %i \n", err);
 				snd_card_free(hw->card);
 				break;
Index: alsa-driver/usb/us428/usbus428.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/us428/usbus428.c,v
retrieving revision 1.5
diff -u -r1.5 usbus428.c
--- alsa-driver/usb/us428/usbus428.c	6 Oct 2003 13:15:17 -0000	1.5
+++ alsa-driver/usb/us428/usbus428.c	23 Oct 2003 17:01:39 -0000
@@ -75,7 +75,7 @@
 
 
 MODULE_AUTHOR("Karsten Wiese <[EMAIL PROTECTED]>");
-MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.1");
+MODULE_DESCRIPTION("TASCAM "NAME_ALLCAPS" Version 0.2");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
 MODULE_DEVICES("{{TASCAM(0x1604), "NAME_ALLCAPS"(0x8001) }}");
@@ -131,22 +131,29 @@
 	
 	us428->In04IntCalls++;
 
-	if (urb->status){
+	if (urb->status) {
 		snd_printk( "Interrupt Pipe 4 came back with status=%i\n", urb->status);
 		return;
 	}
 
-        {
-		int diff = -1, i;
 	//	printk("%i:0x%02X ", 8, (int)((unsigned char*)us428->In04Buf)[8]); Master volume shows 0 here if fader is at max during boot ?!?
-		for (i = 0; i < 21; i++) {
-			if (us428->In04Last[i] != ((char*)us428->In04Buf)[i]) {
-				if (diff < 0)
-					diff = i;
-				us428->In04Last[i] = ((char*)us428->In04Buf)[i];
+	if (us428ctls) {
+		int diff = -1;
+		if (-2 == us428ctls->CtlSnapShotLast) {
+			diff = 0;
+			memcpy(us428->In04Last, us428->In04Buf, sizeof(us428->In04Last));
+			us428ctls->CtlSnapShotLast = -1;
+		} else {
+			int i;
+			for (i = 0; i < 21; i++) {
+				if (us428->In04Last[i] != ((char*)us428->In04Buf)[i]) {
+					if (diff < 0)
+						diff = i;
+					us428->In04Last[i] = ((char*)us428->In04Buf)[i];
+				}
 			}
 		}
-		if (diff >= 0  &&  us428ctls) {
+		if (0 <= diff) {
 			int n = us428ctls->CtlSnapShotLast + 1;
 			if (n >= N_us428_ctl_BUFS  ||  n < 0)
 				n = 0;
@@ -186,7 +193,7 @@
 			}
 		}
 
-	if (err){
+	if (err) {
 		snd_printk("In04Int() usb_submit_urb err=%i\n", err);
 	}
 }
Index: alsa-driver/usb/us428/usbus428audio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/us428/usbus428audio.c,v
retrieving revision 1.5
diff -u -r1.5 usbus428audio.c
--- alsa-driver/usb/us428/usbus428audio.c	6 Oct 2003 13:28:07 -0000	1.5
+++ alsa-driver/usb/us428/usbus428audio.c	23 Oct 2003 17:01:41 -0000
@@ -123,7 +123,7 @@
 
 	urb->dev = subs->stream->us428->chip.dev; /* we need to set this at each time */
 	spin_lock_irqsave(&subs->lock, flags);
-	for (pack = 0; pack < NRPACKS; pack++){
+	for (pack = 0; pack < NRPACKS; pack++) {
 		urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack;
 		urb->iso_frame_desc[pack].length = subs->maxpacksize;
 	}
@@ -157,14 +157,13 @@
 	int 		i, len, lens = 0, hwptr_done = subs->hwptr_done;
 	us428dev_t*	us428 = subs->stream->us428;
 
-	for (i = 0; i < NRPACKS; i++){
-		cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset;
-		if (urb->iso_frame_desc[i].status){ /* active? hmm, skip this */
+	for (i = 0; i < NRPACKS; i++) {
+		cp = (unsigned char*)urb->transfer_buffer + urb->iso_frame_desc[i].offset;
+		if (urb->iso_frame_desc[i].status) { /* active? hmm, skip this */
 			snd_printd("activ frame status %i\n", urb->iso_frame_desc[i].status);
 			return urb->iso_frame_desc[i].status;
 		}
 		len = urb->iso_frame_desc[i].actual_length / us428->stride;
-		//printk("%03i ",  urb->iso_frame_desc[i].actual_length);
 		{
 			unsigned long x = subs->freqm;
 			x *= (1 << 11) - 1;
@@ -173,24 +172,21 @@
 			x /= (1 << 11);
 			subs->freqm = x ;
 		}
-
-		if (! len){
+		if (! len) {
 			snd_printk("0 == len ERROR!\n");
 			continue;
 		}
-
 		/* update the current pointer */
-		if (urb->pipe == subs->datapipe[0]){
-			int j = subs->start_frame == urb->start_frame ? 1 : 0;//FIXME ???
-
+		if (urb->pipe == subs->datapipe[0]) {
+			int j = subs->start_frame == urb->start_frame ? 1 : 0;//FIXME : j should propably never become 1
 			us428->pipe0Aframes[j][i] = len;
-			if (j){
+			if (j) {
 				us428->play_urb_waiting[1] = us428->play_urb_waiting[0];
 				us428->play_urb_waiting[0] = NULL;
 				snd_printd("%i\n", i);
 			}
 			subs->retired_frame[0] = urb->start_frame;
-		}else{
+		} else {
 			subs->retired_frame[1] = urb->start_frame;
 			if (runtime->channels != 4)
 				break;
@@ -202,7 +198,7 @@
 		/* copy a data chunk */
 		if ((hwptr_done + len) > runtime->buffer_size) {
 			int cnt = runtime->buffer_size - hwptr_done;
-			if (runtime->channels != 4){
+			if (runtime->channels != 4) {
 				int blen = cnt * us428->stride;
 				memcpy(runtime->dma_area + hwptr_done * us428->stride, cp, blen);
 				memcpy(runtime->dma_area, cp + blen, len * us428->stride - blen);
@@ -212,7 +208,7 @@
 				framecpy_4c(p_dma_area, (int*)cp + cnt, len - cnt);
 			}
 		} else {
-			if (runtime->channels != 4){
+			if (runtime->channels != 4) {
 				memcpy(runtime->dma_area + hwptr_done * us428->stride, cp, len * us428->stride);
 			}else{
 				int* p_dma_area = (int*)runtime->dma_area + (urb->pipe == subs->datapipe[0] ? 0 : 1);
@@ -223,9 +219,7 @@
 		if ((hwptr_done += len) >= runtime->buffer_size)
 			hwptr_done -= runtime->buffer_size;
 	}
-	if ((runtime->channels == 4 
-	     && subs->retired_frame[0] != subs->retired_frame[1])
-	    || ! subs->running)
+	if ((runtime->channels == 4 && subs->retired_frame[0] != subs->retired_frame[1]) || ! subs->running)
 		return 0;
 
 	spin_lock_irqsave(&subs->lock, flags);
@@ -261,14 +255,15 @@
 
 	urb->dev = us428->chip.dev; /* we need to set this at each time */
 	spin_lock_irqsave(&subs->lock, flags);
-	subs->freqm = subs->stream->substream[ SNDRV_PCM_STREAM_CAPTURE].freqm;
+	subs->freqm = subs->stream->substream[SNDRV_PCM_STREAM_CAPTURE].freqm;
 	count = 0;
 	for (pack = 0; pack < NRPACKS; pack++) {
 		/* calculate the size of a packet */
 		count += (counts = us428->pipe0Aframes[0][pack]);
 
-		if (counts < 43 || counts > 50){
-			snd_printk("%i\n", counts);
+		if (counts < 43 || counts > 50) {
+			snd_printk("should not be here with counts=%i\n", counts);
+			spin_unlock_irqrestore(&subs->lock, flags);
 			return -1;
 		}
 
@@ -355,7 +350,7 @@
 	int err;
 
 
-	if (urb->status){
+	if (urb->status) {
 		snd_printk("play urb->status = %i\n", urb->status);
 		urb->status = 0;
 		return;
@@ -376,7 +371,7 @@
 static void snd_us428_urb_play_complete(purb_t urb, struct pt_regs *regs)
 {
 	snd_us428_substream_t *subs = (snd_us428_substream_t*)urb->context;
-	if (! subs->stream->us428->pipe0Aframes[0][0]){
+	if (! subs->stream->us428->pipe0Aframes[0][0]) {
 		// wait for no of frames info from capture pipe
 		snd_printd("playurb has to wait?!\n");
 		subs->stream->us428->play_urb_waiting[0] = urb;
@@ -394,12 +389,11 @@
 	snd_pcm_runtime_t* runtime = NULL;
 	int err;
 
-	if (urb->status){
+	if (urb->status) {
 		snd_printk( "snd_us428_urb_capt_complete(): urb->status = %i\n", urb->status);
 		urb->status = 0;
 		return;
 	}
-
 	if (pcm_captsubs && snd_pcm_running(pcm_captsubs))
 		runtime = pcm_captsubs->runtime;
 	if (NULL == runtime){
@@ -408,30 +402,24 @@
 		if (pcm_playsubs && snd_pcm_running(pcm_playsubs))
 			runtime = pcm_playsubs->runtime;
 	}
-		
-	if (NULL == runtime){
+	if (NULL == runtime) {
 		snd_printd("NULL == runtime\n");
 		return;
 	}
-
 	if (captsubs->bussing && snd_us428_urb_capt_retire(captsubs, runtime, urb))
 		return;
-
  	if (! captsubs->bussing) /* can be stopped during retire callback */
 		return;
-
-	if (	(err = snd_us428_urb_capt_prepare(captsubs, runtime, urb)) < 0
-		||	(err = snd_us428_urb_submit(captsubs, urb)) < 0
-		) {
+	if ((err = snd_us428_urb_capt_prepare(captsubs, runtime, urb)) < 0 ||
+	    (err = snd_us428_urb_submit(captsubs, urb)) < 0) {
 		snd_printd(KERN_ERR "cannot submit urb (err = %d)\n", err);
 		if (pcm_captsubs)
 			snd_pcm_stop(pcm_captsubs, SNDRV_PCM_STATE_XRUN);
 		return;
 	}
-
-	{
-		if (captsubs->stream->us428->play_urb_waiting[0])
-			_snd_us428_urb_play_complete(captsubs->stream->us428->play_urb_waiting[0]);
+	if (urb->pipe == captsubs->datapipe[0] && 
+	    captsubs->stream->us428->play_urb_waiting[0]) {
+		_snd_us428_urb_play_complete(captsubs->stream->us428->play_urb_waiting[0]);
 		captsubs->stream->us428->play_urb_waiting[0] = captsubs->stream->us428->play_urb_waiting[1];
 		captsubs->stream->us428->play_urb_waiting[1] = NULL;
 	}
@@ -444,15 +432,15 @@
 {
 	int i, alive, ep;
 
-	if (subs == (subs->stream->substream + SNDRV_PCM_STREAM_PLAYBACK)){
+	if (subs == (subs->stream->substream + SNDRV_PCM_STREAM_PLAYBACK)) {
 		snd_us428_substream_t *capsubs = subs->stream->substream + SNDRV_PCM_STREAM_CAPTURE;
 		subs->running = subs->bussing = 0;
 		if (capsubs->bussing  &&  ! capsubs->running)
 			capsubs->bussing = 0;
-	}else
-		if (0x08 == subs->endpoint[0]){
+	} else
+		if (0x08 == subs->endpoint[0]) {
 			snd_us428_substream_t *playsubs = subs->stream->substream + SNDRV_PCM_STREAM_PLAYBACK;
-			if (playsubs->running){
+			if (playsubs->running) {
 				subs->running = 0;
 				return 0;
 			}
@@ -464,7 +452,7 @@
 	for (ep = 0; ep < subs->endpoints; ep++)
 		for (i = 0; i < NRURBS; i++) {
 			if (subs->dataurb[ep][i] &&
-			    subs->dataurb[ep][i]->status == -EINPROGRESS){
+			    subs->dataurb[ep][i]->status == -EINPROGRESS) {
 				alive++;
 			}
 		}
@@ -476,7 +464,7 @@
 {
 	int i, err, ep;
 
-	for (ep = 0; ep < subs->endpoints; ep++){
+	for (ep = 0; ep < subs->endpoints; ep++) {
 		subs->retired_frame[ep] = -1;
 		for (i = 0; i < NRURBS; i++) {
 			if (0 == ep)
@@ -489,7 +477,7 @@
 				snd_printk (KERN_ERR "cannot submit datapipe for urb %d %d, err = %d\n", ep, i, err);
 				return -EPIPE;
 			}
-			if (0 == ep){
+			if (0 == ep) {
 				subs->dataurb[0][i]->transfer_flags = 0;
 				subs->start_frame = subs->dataurb[0][i]->start_frame;
 			}
@@ -508,7 +496,7 @@
 {
 	int i;
 
-	if (! subs->bussing){
+	if (! subs->bussing) {
 		int ep;
 
 		for (ep = 0; ep < subs->endpoints; ep++)
@@ -524,7 +512,7 @@
 
 	subs->running = 1;
 
-	if (! subs->bussing){
+	if (! subs->bussing) {
 		if (snd_us428_urb_start(subs))
 			goto __error;
 	}
@@ -561,7 +549,7 @@
 
 	{
 		snd_us428_substream_t *capsubs = subs->stream->substream + SNDRV_PCM_STREAM_CAPTURE;
-		if (! capsubs->bussing){
+		if (! capsubs->bussing) {
 			int ep;
 			snd_printd("starting capture pipes for playpipe\n");
 			snd_us428_set_format(capsubs, runtime);
@@ -700,7 +688,7 @@
 		for (i = 0; i < NRURBS; i++)
 			release_urb_ctx(subs->dataurb[ep] + i, subs == (subs->stream->substream + SNDRV_PCM_STREAM_CAPTURE));
 
-	if (subs->tmpbuf){
+	if (subs->tmpbuf) {
 		kfree(subs->tmpbuf);
 		subs->tmpbuf = 0;
 	}
@@ -911,7 +899,7 @@
 				break;
 			}
 			for (i = 0; i < NOOF_SETRATE_URBS; ++i) {
-				if (NULL == (us->urb[i] = usb_alloc_urb(0, GFP_KERNEL))){
+				if (NULL == (us->urb[i] = usb_alloc_urb(0, GFP_KERNEL))) {
 					err = -ENOMEM;
 					break;
 				}
@@ -953,7 +941,7 @@
 
 		if (us) {
 			us->submitted =	2*NOOF_SETRATE_URBS;
-			for (i = 0; i < NOOF_SETRATE_URBS; ++i){
+			for (i = 0; i < NOOF_SETRATE_URBS; ++i) {
 				usb_unlink_urb(us->urb[i]);
 				usb_free_urb(us->urb[i]);
 			}
@@ -1145,11 +1133,11 @@
 
 	dev = stream->us428->chip.dev;
 
-	if (SNDRV_PCM_STREAM_PLAYBACK == dir){
+	if (SNDRV_PCM_STREAM_PLAYBACK == dir) {
 		subs->endpoint[0] = 0x0A;
 		subs->endpoint[1] = 0;
 		subs->endpoints = 1;
-	}else{
+	} else {
 		subs->endpoint[0] = 0x08;
 		subs->endpoint[1] = 0x0A;
 		subs->endpoints = 2;

Reply via email to