openvortex-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Openvortex-dev] pause - resume playback


From: Wilfried Weissmann
Subject: [Openvortex-dev] pause - resume playback
Date: Tue, 18 May 2004 21:24:52 +0200
User-agent: Mozilla Thunderbird 0.5 (X11/20040306)

hi,

i still need to resetup the dma registers to get the right samples after resuming audio playback. i thought that this has something to do with the samples crossing the 4k alignment boarders, but in my tests all samples were properly aligned. the attached patch applies aganist kernel 2.6.6 with the latest aureal fastplay/slowrecord patch applied.

bye,
wilfried
Binary files linux-2.6.6/sound/pci/au88x0/au8810.o and 
linux-2.6.6-aureal/sound/pci/au88x0/au8810.o differ
Binary files linux-2.6.6/sound/pci/au88x0/au8820.o and 
linux-2.6.6-aureal/sound/pci/au88x0/au8820.o differ
Binary files linux-2.6.6/sound/pci/au88x0/au8830.o and 
linux-2.6.6-aureal/sound/pci/au88x0/au8830.o differ
diff -Nurp linux-2.6.6/sound/pci/au88x0/au88x0.h 
linux-2.6.6-aureal/sound/pci/au88x0/au88x0.h
--- linux-2.6.6/sound/pci/au88x0/au88x0.h       2004-05-15 11:57:48.000000000 
+0200
+++ linux-2.6.6-aureal/sound/pci/au88x0/au88x0.h        2004-05-17 
20:47:31.000000000 +0200
@@ -208,6 +208,7 @@ static void vortex_adbdma_startfifo(vort
 static void vortex_adbdma_pausefifo(vortex_t * vortex, int adbdma);
 static void vortex_adbdma_resumefifo(vortex_t * vortex, int adbdma);
 static int inline vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma);
+void vortex_adbdma_resetup(vortex_t *vortex, int adbdma);
 
 #ifndef CHIP_AU8810
 static void vortex_wtdma_startfifo(vortex_t * vortex, int wtdma);
diff -Nurp linux-2.6.6/sound/pci/au88x0/au88x0_core.c 
linux-2.6.6-aureal/sound/pci/au88x0/au88x0_core.c
--- linux-2.6.6/sound/pci/au88x0/au88x0_core.c  2004-03-30 05:27:16.000000000 
+0200
+++ linux-2.6.6-aureal/sound/pci/au88x0/au88x0_core.c   2004-05-16 
15:40:28.000000000 +0200
@@ -1170,6 +1170,33 @@ vortex_adbdma_setmode(vortex_t * vortex,
        hwread(vortex->mmio, VORTEX_ADBDMA_CTRL + (adbdma << 2));
 }
 
+void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) {
+       stream_t *dma = &vortex->dma_adb[adbdma];
+       int p, pp, i;
+
+       /* refresh hw page table */
+       for (i=0 ; i < 4 && i < dma->nr_periods; i++) {
+               /* p: audio buffer page index */
+               p = dma->period_virt + i;
+               if (p >= dma->nr_periods)
+                       p -= dma->nr_periods;
+               /* pp: hardware DMA page index. */
+               pp = dma->period_real + i;
+               if( dma->nr_periods < 4) {
+                       if (pp >= dma->nr_periods)
+                               pp -= dma->nr_periods;
+               }
+               else {
+                       if (pp >= 4)
+                               pp -= 4;
+               }
+               hwwrite(vortex->mmio, VORTEX_ADBDMA_BUFBASE+(((adbdma << 2)+pp) 
<< 2), snd_sgbuf_get_addr(dma->sgbuf, dma->period_bytes * p));
+               /* Force write thru cache. */
+               hwread(vortex->mmio, VORTEX_ADBDMA_BUFBASE + (((adbdma << 
2)+pp) << 2));
+       }
+}
+
+
 static int vortex_adbdma_bufshift(vortex_t * vortex, int adbdma)
 {
        stream_t *dma = &vortex->dma_adb[adbdma];
diff -Nurp linux-2.6.6/sound/pci/au88x0/au88x0_pcm.c 
linux-2.6.6-aureal/sound/pci/au88x0/au88x0_pcm.c
--- linux-2.6.6/sound/pci/au88x0/au88x0_pcm.c   2004-03-30 05:26:15.000000000 
+0200
+++ linux-2.6.6-aureal/sound/pci/au88x0/au88x0_pcm.c    2004-05-17 
20:47:10.000000000 +0200
@@ -314,8 +314,10 @@ static int snd_vortex_pcm_trigger(snd_pc
                // do something to start the PCM engine
                //printk(KERN_INFO "vortex: start %d\n", dma);
                stream->fifo_enabled = 1;
-               if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT)
+               if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) {
+                       vortex_adbdma_resetup(chip, dma);
                        vortex_adbdma_startfifo(chip, dma);
+               }
 #ifndef CHIP_AU8810
                else {
                        printk(KERN_INFO "vortex: wt start %d\n", dma);
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8810.ko and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8810.ko differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8810.mod.o and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8810.mod.o differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8810.o and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8810.o differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8820.ko and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8820.ko differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8820.mod.o and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8820.mod.o differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8820.o and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8820.o differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8830.ko and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8830.ko differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8830.mod.o and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8830.mod.o differ
Binary files linux-2.6.6/sound/pci/au88x0/snd-au8830.o and 
linux-2.6.6-aureal/sound/pci/au88x0/snd-au8830.o differ

reply via email to

[Prev in Thread] Current Thread [Next in Thread]