Update of /cvsroot/alsa/alsa-driver/drivers/vx
In directory sc8-pr-cvs1:/tmp/cvs-serv19735

Modified Files:
        vx_pcm.c 
Log Message:
- fixed the hang-up of capture on vxpocket.
- allow to change the IBL size arbitrarily.
- fixed comments.



Index: vx_pcm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/drivers/vx/vx_pcm.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- vx_pcm.c    11 Mar 2003 18:56:37 -0000      1.8
+++ vx_pcm.c    17 Mar 2003 09:07:07 -0000      1.9
@@ -5,7 +5,7 @@
  *
  * PCM part
  *
- * Copyright (c) 2002 by Takashi Iwai <[EMAIL PROTECTED]>
+ * Copyright (c) 2002,2003 by Takashi Iwai <[EMAIL PROTECTED]>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -20,6 +20,11 @@
  *   You should have received a copy of the GNU General Public License
  *   along with this program; if not, write to the Free Software
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ *
+ * TODO
+ *  - linked trigger for full-duplex mode.
+ *  - scheduled action on the stream.
  */
 
 #include <sound/driver.h>
@@ -45,44 +50,50 @@
        return vmalloc_to_page(pageptr);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18)
+#define vmalloc_32(x) vmalloc_nocheck(x)
+#endif
+
 /*
  * hw_params callback
+ * allocate a buffer via vmalloc_32().
  * NOTE: this may be called not only once per pcm open!
  */
 static int snd_pcm_alloc_vmalloc_buffer(snd_pcm_substream_t *subs, size_t size)
 {
        snd_pcm_runtime_t *runtime = subs->runtime;
        if (runtime->dma_area) {
+               /* already allocated */
                if (runtime->dma_bytes >= size)
                        return 0; /* already enough large */
-               vfree_nocheck(runtime->dma_area);
+               vfree_nocheck(runtime->dma_area); /* bypass the memory wrapper */
        }
-       runtime->dma_area = vmalloc_nocheck(size);
+       runtime->dma_area = vmalloc_32(size);
        if (! runtime->dma_area)
                return -ENOMEM;
        runtime->dma_bytes = size;
-       return 0;
+       return 1; /* changed */
 }
 
 /*
  * hw_free callback
+ * free the buffer.
  * NOTE: this may be called not only once per pcm open!
  */
 static int snd_pcm_free_vmalloc_buffer(snd_pcm_substream_t *subs)
 {
        snd_pcm_runtime_t *runtime = subs->runtime;
        if (runtime->dma_area) {
-               vfree_nocheck(runtime->dma_area);
+               vfree_nocheck(runtime->dma_area); /* bypass the memory wrapper */
                runtime->dma_area = NULL;
        }
        return 0;
 }
 
 
-#if 0 /* NOT USED */
 /*
  * vx_flush_read - read rest of bytes via normal transfer mode
- * @count: frames to read
+ * @count: bytes to read
  *
  * the data size must be aligned to 3 bytes, though.
  * NB: call with a certain lock!
@@ -93,7 +104,6 @@
        int offset = frames_to_bytes(runtime, pipe->hw_ptr);
        unsigned char *buf = (unsigned char *)(runtime->dma_area + offset);
 
-       snd_assert(count % 3 == 0, return);
        pipe->hw_ptr += bytes_to_frames(runtime, count);
        if (pipe->hw_ptr >= runtime->buffer_size)
                pipe->hw_ptr -= runtime->buffer_size;
@@ -116,7 +126,6 @@
                count -= 3;
        }
 }
-#endif /* NOT USED */
 
 /*
  * vx_set_pcx_time - convert from the PC time to the RMH status time.
@@ -224,6 +233,9 @@
        return vx_set_stream_format(chip, pipe, header);
 }
 
+/*
+ * set / query the IBL size
+ */
 static int vx_set_ibl(vx_core_t *chip, struct vx_ibl_info *info)
 {
        int err;
@@ -274,6 +286,10 @@
  *
  * return the available size on h-buffer in bytes,
  * or a negative error code.
+ *
+ * NOTE: calling this function always switches to the stream mode.
+ *       you'll need to disconnect the host to get back to the
+ *       normal mode.
  */
 static int vx_query_hbuffer_size(vx_core_t *chip, vx_pipe_t *pipe)
 {
@@ -317,7 +333,7 @@
 }
 
 /*
- * vx_vonf_pipe - tell the pipe to stand by and wait for IRQA.
+ * vx_conf_pipe - tell the pipe to stand by and wait for IRQA.
  * @pipe: the pipe to be configured
  */
 static int vx_conf_pipe(vx_core_t *chip, vx_pipe_t *pipe)
@@ -565,7 +581,7 @@
 
        audio = subs->pcm->device * 2;
        snd_assert(audio < chip->audio_outs, return -EINVAL);
-       err = vx_alloc_pipe(chip, 0, audio, 2, &pipe); /* stereo capture */
+       err = vx_alloc_pipe(chip, 0, audio, 2, &pipe); /* stereo playback */
        if (err < 0)
                return err;
        pipe->substream = subs;
@@ -1011,7 +1027,7 @@
        size = (size / pipe->align) * pipe->align;
        if (! size)
                goto _finish;
-#if 0
+#if 1 /* read the last aligned frames by vx_flush_read */
        if (size > pipe->align)
                vx_pseudo_dma_read(chip, runtime, pipe, size - pipe->align);
  _finish:
@@ -1062,6 +1078,7 @@
 static int vx_init_audio_io(vx_core_t *chip)
 {
        struct vx_rmh rmh;
+       int preferred;
 
        vx_init_rmh(&rmh, CMD_SUPPORTED);
        if (vx_send_msg(chip, &rmh) < 0) {
@@ -1082,9 +1099,14 @@
        memset(chip->playback_pipes, 0, sizeof(vx_pipe_t *) * chip->audio_outs);
        memset(chip->capture_pipes, 0, sizeof(vx_pipe_t *) * chip->audio_ins);
 
+       preferred = chip->ibl.size;
+       chip->ibl.size = 0;
        vx_set_ibl(chip, &chip->ibl); /* query the info */
-       chip->ibl.size = chip->ibl.min_size;
-       vx_set_ibl(chip, &chip->ibl); /* set to the minimum */
+       if (preferred > 0)
+               chip->ibl.size = ((preferred + chip->ibl.granularity - 1) / 
chip->ibl.granularity) * chip->ibl.granularity;
+       else
+               chip->ibl.size = chip->ibl.min_size; /* set to the minimum */
+       vx_set_ibl(chip, &chip->ibl);
 
        return 0;
 }



-------------------------------------------------------
This SF.net email is sponsored by:Crypto Challenge is now open! 
Get cracking and register here for some mind boggling fun and 
the chance of winning an Apple iPod:
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0031en
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to