On Thu, 24 Jan 2002, Kai Vehmanen wrote:

> On the other hand with '-r 44100', full-duplex seems to work relatively
> well. Even though nominally running at different speeds
> (44100.952-44099.814=1.138frames/sec), they won't drift much apart.  

Ok, here's a patch that adds mathematical rounding to setting dac1 and 
dac2 rates. The same is done in 2.4.16 kernel's ens1371 drivers. 

After applying this, I stopped getting "Unexpected hw_pointer" and "Lost 
interrupt: hw_ptr = %d expected %d" errors from pcm_lib.c. Without the 
patch, I get these errors with all parameters I've tried (even 48kHz!) if 
both stream directions are active. 

Playback- or capture-only operation won't cause these errors.
Let me know how this works for you...

--cut--
RCS file: /cvsroot/alsa/alsa-kernel/pci/ens1370.c,v
retrieving revision 1.7
diff -u -r1.7 ens1370.c
--- ens1370.c   2002/01/21 08:55:18     1.7
+++ ens1370.c   2002/01/24 13:45:48
@@ -656,6 +656,12 @@
        truncm = (21 * n - 1) | 1;
        freq = ((48000UL << 15) / rate) * n;
        result = (48000UL << 15) / (freq / n);
+
+#ifdef CONFIG_SND_DEBUG
+       snd_printk("ens1371: setting adc-rate to freq=%lu ((%lu/%lu)*%lu) request for 
+%lu.\n", 
+                  freq, 48000UL << 15, rate, n, rate);
+#endif
+
        if (rate >= 24000) {
                if (truncm > 239)
                        truncm = 239;
@@ -678,8 +684,13 @@
 static void snd_es1371_dac1_rate(ensoniq_t * ensoniq, unsigned int rate)
 {
        unsigned int freq, r;
+
+       freq = ((rate << 15) + 1500) / 3000;
 
-       freq = (rate << 15) / 3000;
+#ifdef CONFIG_SND_DEBUG
+       snd_printk("ens1371: setting dac1-rate to freq=%lu (%lu/3000) request for 
+%lu.\n", freq, (rate << 15) + 1500, rate);
+#endif
+
        r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | 
ES_1371_DIS_P2 | ES_1371_DIS_R1)) | ES_1371_DIS_P1;
        outl(r, ES_REG(ensoniq, 1371_SMPRATE));
        snd_es1371_src_write(ensoniq, ES_SMPREG_DAC1 + ES_SMPREG_INT_REGS,
@@ -693,8 +704,13 @@
 static void snd_es1371_dac2_rate(ensoniq_t * ensoniq, unsigned int rate)
 {
        unsigned int freq, r;
+
+       freq = ((rate << 15) + 1500) / 3000;
+
+#ifdef CONFIG_SND_DEBUG
+       printk("ens1371: setting dac2-rate to freq=%lu (%lu/3000) request for %lu.\n", 
+freq, (rate << 15) + 1500, rate);
+#endif
 
-       freq = (rate << 15) / 3000;
        r = (snd_es1371_wait_src_ready(ensoniq) & (ES_1371_SRC_DISABLE | 
ES_1371_DIS_P1 | ES_1371_DIS_R1)) | ES_1371_DIS_P2;
        outl(r, ES_REG(ensoniq, 1371_SMPRATE));
        snd_es1371_src_write(ensoniq, ES_SMPREG_DAC2 + ES_SMPREG_INT_REGS,
--cut--

-- 
 http://www.eca.cx
 Audio software for Linux!


_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to