Update of /cvsroot/alsa/alsa-kernel/pci
In directory sc8-pr-cvs1:/tmp/cvs-serv20026
Modified Files:
es1968.c
Log Message:
- hopefully fixed the capture.
- align the buffers in 4k.
- a bit code clean up.
Index: es1968.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/es1968.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- es1968.c 6 Aug 2003 17:44:50 -0000 1.48
+++ es1968.c 7 Aug 2003 14:18:56 -0000 1.49
@@ -439,7 +439,8 @@
/* capture mixing buffer size */
-#define ESM_MIXBUF_SIZE 512
+#define ESM_MEM_ALIGN 0x1000
+#define ESM_MIXBUF_SIZE 0x400
#define ESM_MODE_PLAY 0
#define ESM_MODE_CAPTURE 1
@@ -977,8 +978,10 @@
/* spin lock held */
inline static void snd_es1968_trigger_apu(es1968_t *esm, int apu, int mode)
{
- /* dma on, no envelopes, filter to all 1s) */
- __apu_set_register(esm, apu, 0, 0x400f | mode);
+ /* set the APU mode */
+ __apu_set_register(esm, apu, 0,
+ (__apu_get_register(esm, apu, 0) & 0xff0f) |
+ (mode << 4));
}
static void snd_es1968_pcm_start(es1968_t *chip, esschan_t *es)
@@ -1092,12 +1095,12 @@
/* clear routing stuff */
apu_set_register(chip, apu, 11, 0x0000);
/* dma on, no envelopes, filter to all 1s) */
- // apu_set_register(chip, apu, 0, 0x400F);
+ apu_set_register(chip, apu, 0, 0x400F);
if (es->fmt & ESS_FMT_16BIT)
- es->apu_mode[channel] = 0x10; /* 16bit mono */
+ es->apu_mode[channel] = ESM_APU_16BITLINEAR;
else
- es->apu_mode[channel] = 0x30; /* 8bit mono */
+ es->apu_mode[channel] = ESM_APU_8BITLINEAR;
if (es->fmt & ESS_FMT_STEREO) {
/* set panning: left or right */
@@ -1107,7 +1110,7 @@
and not the APU Regs 4-5. */
apu_set_register(chip, apu, 10,
0x8F00 | (channel ? 0 : 0x10));
- es->apu_mode[channel] += 0x10; /* stereo */
+ es->apu_mode[channel] += 1; /* stereo */
} else
apu_set_register(chip, apu, 10, 0x8F08);
}
@@ -1137,119 +1140,91 @@
snd_es1968_apu_set_freq(chip, es->apu[1], freq);
}
+
+static void init_capture_apu(es1968_t *chip, esschan_t *es, int channel,
+ unsigned int pa, unsigned int bsize,
+ int mode, int route)
+{
+ int i, apu = es->apu[channel];
+
+ es->apu_mode[channel] = mode;
+
+ /* set the wavecache control reg */
+ snd_es1968_program_wavecache(chip, es, channel, pa, 1);
+
+ /* Offset to PCMBAR */
+ pa -= chip->dma.addr;
+ pa >>= 1; /* words */
+
+ /* base offset of dma calcs when reading the pointer
+ on this left one */
+ es->base[channel] = pa & 0xFFFF;
+ pa |= 0x00400000; /* bit 22 -> System RAM */
+
+ /* Begin loading the APU */
+ for (i = 0; i < 16; i++)
+ apu_set_register(chip, apu, i, 0x0000);
+
+ /* need to enable subgroups.. and we should probably
+ have different groups for different /dev/dsps.. */
+ apu_set_register(chip, apu, 2, 0x8);
+
+ /* Load the buffer into the wave engine */
+ apu_set_register(chip, apu, 4, ((pa >> 16) & 0xFF) << 8);
+ apu_set_register(chip, apu, 5, pa & 0xFFFF);
+ apu_set_register(chip, apu, 6, (pa + bsize) & 0xFFFF);
+ apu_set_register(chip, apu, 7, bsize);
+ /* clear effects/env.. */
+ apu_set_register(chip, apu, 8, 0x00F0);
+ /* amplitude now? sure. why not. */
+ apu_set_register(chip, apu, 9, 0x0000);
+ /* set filter tune, radius, polar pan */
+ apu_set_register(chip, apu, 10, 0x8F08);
+ /* route input */
+ apu_set_register(chip, apu, 11, route);
+ /* dma on, no envelopes, filter to all 1s) */
+ apu_set_register(chip, apu, 0, 0x400F);
+}
+
static void snd_es1968_capture_setup(es1968_t *chip, esschan_t *es,
snd_pcm_runtime_t *runtime)
{
- int apu_step = 2;
- int channel, apu;
- int i, size;
+ int size;
u32 freq;
unsigned long flags;
size = es->dma_size >> es->wav_shift;
- /* we're given the full size of the buffer, but
- in stereo each channel will only use its half */
- if (es->fmt & ESS_FMT_STEREO)
- apu_step = 1;
-
/* APU assignments:
0 = mono/left SRC
1 = right SRC
2 = mono/left Input Mixer
- 3 = right Input Mixer */
- for (channel = 0; channel < 4; channel += apu_step) {
- int bsize, route;
- u32 pa;
-
- apu = es->apu[channel];
-
- /* data seems to flow from the codec, through an apu into
- the 'mixbuf' bit of page, then through the SRC apu
- and out to the real 'buffer'. ok. sure. */
-
- if (channel & 2) {
- /* ok, we're an input mixer going from adc
- through the mixbuf to the other apus */
-
- if (!(channel & 0x01)) {
- pa = es->mixbuf->addr;
- } else {
- pa = es->mixbuf->addr + ESM_MIXBUF_SIZE / 2;
- }
-
- /* we source from a 'magic' apu */
- bsize = ESM_MIXBUF_SIZE / 4; /* half of this channels alloc,
in words */
- /* parallel in crap, see maestro reg 0xC [8-11] */
- route = 0x14 + channel - 2;
- es->apu_mode[channel] = 0x90; /* Input Mixer */
- } else {
- /* we're a rate converter taking
- input from the input apus and outputing it to
- system memory */
- if (!(channel & 0x01))
- pa = es->memory->addr;
- else
- pa = es->memory->addr + size * 2; /* size is in word */
-
- es->apu_mode[channel] = 0xB0; /* Sample Rate Converter */
-
- bsize = size;
- /* get input from inputing apu */
- route = es->apu[channel + 2];
- }
-
- /* set the wavecache control reg */
- snd_es1968_program_wavecache(chip, es, channel, pa, 1);
-
- /* Offset to PCMBAR */
- pa -= chip->dma.addr;
- pa >>= 1; /* words */
-
- /* base offset of dma calcs when reading the pointer
- on this left one */
- es->base[channel] = pa & 0xFFFF;
-
- pa |= 0x00400000; /* bit 22 -> System RAM */
-
- /* Begin loading the APU */
- for (i = 0; i < 16; i++)
- apu_set_register(chip, apu, i, 0x0000);
-
- /* need to enable subgroups.. and we should probably
- have different groups for different /dev/dsps.. */
- apu_set_register(chip, apu, 2, 0x8);
-
- /* Load the buffer into the wave engine */
- apu_set_register(chip, apu, 4, ((pa >> 16) & 0xFF) << 8);
- /* XXX reg is little endian.. */
- apu_set_register(chip, apu, 5, pa & 0xFFFF);
- apu_set_register(chip, apu, 6, (pa + bsize) & 0xFFFF);
- apu_set_register(chip, apu, 7, bsize);
-#if 0
- if (es->fmt & ESS_FMT_STEREO) /* ??? really ??? */
- apu_set_register(chip, apu, 7, bsize - 1);
-#endif
-
- /* clear effects/env.. */
- apu_set_register(chip, apu, 8, 0x00F0);
- /* amplitude now? sure. why not. */
- apu_set_register(chip, apu, 9, 0x0000);
- /* set filter tune, radius, polar pan */
- apu_set_register(chip, apu, 10, 0x8F08);
- /* route input */
- apu_set_register(chip, apu, 11, route);
- /* dma on, no envelopes, filter to all 1s) */
- // apu_set_register(chip, apu, 0, 0x400F);
+ 3 = right Input Mixer
+ */
+ /* data seems to flow from the codec, through an apu into
+ the 'mixbuf' bit of page, then through the SRC apu
+ and out to the real 'buffer'. ok. sure. */
+
+ /* input mixer (left/mono) */
+ /* parallel in crap, see maestro reg 0xC [8-11] */
+ init_capture_apu(chip, es, 2,
+ es->mixbuf->addr, ESM_MIXBUF_SIZE/4, /* in words */
+ ESM_APU_INPUTMIXER, 0x14);
+ /* SRC (left/mono); get input from inputing apu */
+ init_capture_apu(chip, es, 0, es->memory->addr, size,
+ ESM_APU_SRCONVERTOR, es->apu[2]);
+ if (es->fmt & ESS_FMT_STEREO) {
+ /* input mixer (right) */
+ init_capture_apu(chip, es, 3,
+ es->mixbuf->addr + ESM_MIXBUF_SIZE/2,
+ ESM_MIXBUF_SIZE/4, /* in words */
+ ESM_APU_INPUTMIXER, 0x15);
+ /* SRC (right) */
+ init_capture_apu(chip, es, 1,
+ es->memory->addr + size*2, size,
+ ESM_APU_SRCONVERTOR, es->apu[3]);
}
- spin_lock_irqsave(&chip->reg_lock, flags);
- /* clear WP interrupts */
- outw(1, chip->io_port + 0x04);
- /* enable WP ints */
- outw(inw(chip->io_port + ESM_PORT_HOST_IRQ) | ESM_HIRQ_DSIE, chip->io_port +
ESM_PORT_HOST_IRQ);
- spin_unlock_irqrestore(&chip->reg_lock, flags);
-
freq = runtime->rate;
/* Sample Rate conversion APUs don't like 0x10000 for their rate */
if (freq > 47999)
@@ -1267,6 +1242,13 @@
freq = 0x10000;
snd_es1968_apu_set_freq(chip, es->apu[2], freq);
snd_es1968_apu_set_freq(chip, es->apu[3], freq);
+
+ spin_lock_irqsave(&chip->reg_lock, flags);
+ /* clear WP interrupts */
+ outw(1, chip->io_port + 0x04);
+ /* enable WP ints */
+ outw(inw(chip->io_port + ESM_PORT_HOST_IRQ) | ESM_HIRQ_DSIE, chip->io_port +
ESM_PORT_HOST_IRQ);
+ spin_unlock_irqrestore(&chip->reg_lock, flags);
}
/*******************
@@ -1419,6 +1401,7 @@
esm_memory_t *buf;
struct list_head *p;
+ size = ((size + ESM_MEM_ALIGN - 1) / ESM_MEM_ALIGN) * ESM_MEM_ALIGN;
down(&chip->memory_mutex);
list_for_each(p, &chip->buf_list) {
buf = list_entry(p, esm_memory_t, list);
@@ -1517,10 +1500,10 @@
snd_es1968_free_dmabuf(chip);
return -ENOMEM;
}
- memset(chip->dma.area, 0, 512);
- chunk->buf = chip->dma.area + 512;
- chunk->addr = chip->dma.addr + 512;
- chunk->size = chip->dma.bytes - 512;
+ memset(chip->dma.area, 0, ESM_MEM_ALIGN);
+ chunk->buf = chip->dma.area + ESM_MEM_ALIGN;
+ chunk->addr = chip->dma.addr + ESM_MEM_ALIGN;
+ chunk->size = chip->dma.bytes - ESM_MEM_ALIGN;
chunk->empty = 1;
list_add(&chunk->list, &chip->buf_list);
@@ -1634,7 +1617,10 @@
runtime->hw = snd_es1968_playback;
runtime->hw.buffer_bytes_max = runtime->hw.period_bytes_max =
calc_available_memory_size(chip);
-
+#if 0
+ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
+ 1024);
+#endif
spin_lock_irqsave(&chip->substream_lock, flags);
list_add(&es->list, &chip->substream_list);
spin_unlock_irqrestore(&chip->substream_lock, flags);
@@ -1685,12 +1671,16 @@
snd_magic_kfree(es);
return -ENOMEM;
}
+ memset(es->mixbuf->buf, 0, ESM_MIXBUF_SIZE);
runtime->private_data = es;
runtime->hw = snd_es1968_capture;
runtime->hw.buffer_bytes_max = runtime->hw.period_bytes_max =
- calc_available_memory_size(chip) - 1024;
-
+ calc_available_memory_size(chip) - 1024; /* keep MIXBUF size */
+#if 0
+ snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
+ 1024);
+#endif
spin_lock_irqsave(&chip->substream_lock, flags);
list_add(&es->list, &chip->substream_list);
spin_unlock_irqrestore(&chip->substream_lock, flags);
@@ -1797,6 +1787,7 @@
for (i = 0; i < 16; i++)
apu_set_register(chip, apu, i, 0x0000);
+ apu_set_register(chip, apu, 0, 0x400f);
apu_set_register(chip, apu, 4, ((pa >> 16) & 0xff) << 8);
apu_set_register(chip, apu, 5, pa & 0xffff);
apu_set_register(chip, apu, 6, (pa + CLOCK_MEASURE_BUFSIZE/2) & 0xffff);
@@ -1814,7 +1805,7 @@
spin_lock_irqsave(&chip->reg_lock, flags);
__apu_set_register(chip, apu, 5, pa & 0xffff);
- snd_es1968_trigger_apu(chip, apu, 0x10); /* 16bit mono */
+ snd_es1968_trigger_apu(chip, apu, ESM_APU_16BITLINEAR);
do_gettimeofday(&start_time);
spin_unlock_irqrestore(&chip->reg_lock, flags);
#if 0
@@ -2509,7 +2500,7 @@
{ TYPE_MAESTRO2E, 0x1028 },
{ TYPE_MAESTRO2E, 0x103c },
{ TYPE_MAESTRO2E, 0x1179 },
- { TYPE_MAESTRO2E, 0x14c0 },
+ { TYPE_MAESTRO2E, 0x14c0 }, /* HP omnibook 4150 */
};
static int __devinit snd_es1968_create(snd_card_t * card,
-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog