NetBSD-Bugs archive

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

Re: bin/38493: no good audio with cdplay



svs%ropnet.ru@localhost said:
>  -    ai.mode = AUMODE_PLAY;
>  +    ai.mode = AUMODE_PLAY_ALL; 

Thanks - this improves the "resume" for me too.
Here is an aggregate patch which also fixes some other
problems:
-The timeout for the raw SCSI command to read audio data
 is much too small. This caused complete failure for me.
-"digital 1" does not work, at least with HZ=100.
 (The signal handler can't keep up.)
-"digital 20" or so leads to poor interactive behaviour
 (because the program blocks most of the time in the
  signal handler)
With that patch, digital mode is usable for me.
(This code is a mess and should be rewritten, but
not before 5.0 imo.)

best regards
Matthias





-------------------------------------------------------------------
-------------------------------------------------------------------
Forschungszentrum Juelich GmbH
52425 Juelich

Sitz der Gesellschaft: Juelich
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
Vorsitzende des Aufsichtsrats: MinDir'in Baerbel Brumme-Bothe
Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
Dr. Ulrich Krafft (stellv. Vorsitzender), Prof. Dr. Harald Bolt,
Dr. Sebastian M. Schmidt
-------------------------------------------------------------------
-------------------------------------------------------------------
#
# old_revision [b0293fd440ffeb0cc85778a3a79fcbb762e17b78]
#
# patch "usr.bin/cdplay/cdplay.c"
#  from [97aad6bcf900d21ed7d4dea09dfce00aa70d314e]
#    to [d976096f1ed56cbf03af1c70350d0d3484e50413]
#
============================================================
--- usr.bin/cdplay/cdplay.c     97aad6bcf900d21ed7d4dea09dfce00aa70d314e
+++ usr.bin/cdplay/cdplay.c     d976096f1ed56cbf03af1c70350d0d3484e50413
@@ -483,7 +483,7 @@ run(int cmd, const char *arg)
 
        case CMD_DIGITAL:
                if (digital == 0) {
-                       int fpw;
+                       int fpw, intv_usecs, hz_usecs;
 
                        fpw = atoi(arg);
                        if (fpw > 0)
@@ -491,6 +491,23 @@ run(int cmd, const char *arg)
                        else
                                da.fpw = 5;
                        da.read_errors = 0;
+
+                       /* real rate: 75 frames per second */
+                       intv_usecs = 13333 * da.fpw;
+                       /*
+                        * interrupt earlier for safety, by a value which
+                        * doesn't hurt interactice response if we block
+                        * in the signal handler
+                        */
+                       intv_usecs -= 50000;
+                       hz_usecs = 1000000 / sysconf(_SC_CLK_TCK);
+                       if (intv_usecs < hz_usecs) {
+                               /* can't have a shorter interval, increase
+                                  buffer size to compensate */
+                               da.fpw += (hz_usecs - intv_usecs) / 13333;
+                               intv_usecs = hz_usecs;
+                       }
+
                        da.aubuf = malloc(da.fpw * CDDA_SIZE);
                        if (da.aubuf == NULL) {
                                warn("Not enough memory for audio buffers");
@@ -500,9 +517,10 @@ run(int cmd, const char *arg)
                                warn("Cannot open audio device");
                                return (1);
                        }
-                       itv_timer.it_interval.tv_sec = 
itv_timer.it_value.tv_sec = da.fpw / 75;
+                       itv_timer.it_interval.tv_sec = 
itv_timer.it_value.tv_sec =
+                               intv_usecs / 1000000;
                        itv_timer.it_interval.tv_usec = 
itv_timer.it_value.tv_usec =
-                           (da.fpw * 6666) % 1000000;
+                               intv_usecs % 1000000;
                        rv = setitimer(ITIMER_REAL, &itv_timer, NULL);
                        if (rv == 0) {
                                digital = 1;
@@ -932,7 +950,8 @@ print_status(const char *arg)
        else
                printf("shuffle play:\t%s\n", (shuffle != 0) ? "on" : "off");
        if (digital)
-               printf("digital xfer:\tto %s (%d frames per wakeup, %ld.%03lds 
period)\n",
+               printf("digital xfer:\tto %s "
+                      "(%d frames per wakeup, %ld.%06lds period)\n",
                    da.auname, da.fpw, itv_timer.it_interval.tv_sec,
                    itv_timer.it_interval.tv_usec);
        else
@@ -1346,7 +1365,7 @@ openaudio()
                da.afd = -1;
                return (0);
        }
-       ai.mode = AUMODE_PLAY;
+       ai.mode = AUMODE_PLAY_ALL;
        ai.play.sample_rate = 44100;
        ai.play.channels = 2;
        ai.play.precision = 16;
@@ -1387,7 +1406,7 @@ readaudio(afd, lba, blocks, data)
        sc.datalen = CDDA_SIZE * blocks;
        sc.senselen = sizeof(sc.sense);
        sc.flags = SCCMD_READ;
-       sc.timeout = da.fpw * 15;
+       sc.timeout = 10000; /* 10s */
        rc = ioctl(afd, SCIOCCOMMAND, &sc);
        if (rc < 0 || sc.retsts != SCCMD_OK) {
                if (da.read_errors < 10) {


Home | Main Index | Thread Index | Old Index