Source-Changes-HG archive

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

[src/trunk]: src/tests/dev/audio Sync with sys/dev/audio/audio.c rev1.62.



details:   https://anonhg.NetBSD.org/src/rev/b381a84d26f9
branches:  trunk
changeset: 969880:b381a84d26f9
user:      isaki <isaki%NetBSD.org@localhost>
date:      Wed Mar 04 14:20:44 2020 +0000

description:
Sync with sys/dev/audio/audio.c rev1.62.
> Restore backward compatibility with netbsd-7 audio.

diffstat:

 tests/dev/audio/audiotest.c |  750 +++++++++++--------------------------------
 1 files changed, 192 insertions(+), 558 deletions(-)

diffs (truncated from 976 to 300 lines):

diff -r c369e0bf390c -r b381a84d26f9 tests/dev/audio/audiotest.c
--- a/tests/dev/audio/audiotest.c       Wed Mar 04 14:19:41 2020 +0000
+++ b/tests/dev/audio/audiotest.c       Wed Mar 04 14:20:44 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: audiotest.c,v 1.6 2020/02/22 05:53:19 isaki Exp $      */
+/*     $NetBSD: audiotest.c,v 1.7 2020/03/04 14:20:44 isaki Exp $      */
 
 /*
  * Copyright (C) 2019 Tetsuya Isaki. All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: audiotest.c,v 1.6 2020/02/22 05:53:19 isaki Exp $");
+__RCSID("$NetBSD: audiotest.c,v 1.7 2020/03/04 14:20:44 isaki Exp $");
 
 #include <errno.h>
 #include <fcntl.h>
@@ -106,7 +106,6 @@
 bool xp_sys_ok(int, int, const char *);
 bool xp_sys_ng(int, int, int, const char *);
 bool xp_sys_ptr(int, int, void *, const char *);
-bool xp_buffsize(int, bool, int, const char *);
 int debug_open(int, const char *, int);
 int debug_write(int, int, const void *, size_t);
 int debug_read(int, int, void *, size_t);
@@ -920,29 +919,6 @@
        return r;
 }
 
-/*
- * Check ai.*.buffer_size.
- * If exp == true, it expects that buffer_size is non-zero.
- * If exp == false, it expects that buffer_size is zero.
- */
-#define XP_BUFFSIZE(exp, act)  \
-       xp_buffsize(__LINE__, exp, act, #act)
-bool xp_buffsize(int line, bool exp, int act, const char *varname)
-{
-       bool r = true;
-
-       testcount++;
-       if (exp) {
-               if (act == 0)
-                       r = xp_fail(line, "%s expects non-zero but %d",
-                           varname, act);
-       } else {
-               if (act != 0)
-                       r = xp_fail(line, "%s expects zero but %d",
-                           varname, act);
-       }
-       return r;
-}
 
 /*
  * REQUIRED_* return immediately if condition does not meet.
@@ -1377,9 +1353,7 @@
  */
 
 void test_open_mode(int);
-void test_open_audio(int);
-void test_open_sound(int);
-void test_open_audioctl(int);
+void test_open(const char *, int);
 void test_open_simul(int, int);
 void try_open_multiuser(bool);
 void test_open_multiuser(bool);
@@ -1435,49 +1409,89 @@
 DEF(open_mode_WRONLY)  { test_open_mode(O_WRONLY); }
 DEF(open_mode_RDWR)    { test_open_mode(O_RDWR);   }
 
-
 /*
- * The initial parameters are always the same whenever you open /dev/audio.
+ * Check the initial parameters and stickiness.
+ * /dev/audio
+ *     The initial parameters are always the same whenever you open.
+ * /dev/sound and /dev/audioctl
+ *     The initial parameters are inherited from the last /dev/sound or
+ *     /dev/audio.
  */
 void
-test_open_audio(int mode)
+test_open(const char *devname, int mode)
 {
        struct audio_info ai;
        struct audio_info ai0;
+       char devfile[16];
        int fd;
        int r;
        int can_play;
        int can_rec;
-       bool pbuff;
-       bool rbuff;
-
-       TEST("open_audio_%s", openmode_str[mode] + 2);
-
+       int exp_mode;
+       int exp_encoding;
+       int exp_precision;
+       int exp_channels;
+       int exp_sample_rate;
+       int exp_pause;
+       int exp_popen;
+       int exp_ropen;
+
+       TEST("open_%s_%s", devname, openmode_str[mode] + 2);
+
+       snprintf(devfile, sizeof(devfile), "/dev/%s%d", devname, unit);
        can_play = mode2play(mode);
        can_rec  = mode2rec(mode);
-       if (can_play + can_rec == 0) {
-               /* Check whether it cannot be opened */
-               fd = OPEN(devaudio, mode);
-               XP_SYS_NG(ENXIO, fd);
-               return;
-       }
+       if (strcmp(devname, "audioctl") != 0) {
+               if (can_play + can_rec == 0) {
+                       /* Check whether it cannot be opened */
+                       fd = OPEN(devaudio, mode);
+                       XP_SYS_NG(ENXIO, fd);
+                       return;
+               }
+       }
+
+       /* /dev/audio is always initialized */
+       if (strcmp(devname, "audio") == 0) {
+               exp_encoding = AUDIO_ENCODING_ULAW;
+               exp_precision = 8;
+               exp_channels = 1;
+               exp_sample_rate = 8000;
+               exp_pause = 0;
+       } else {
+               exp_encoding = AUDIO_ENCODING_SLINEAR_LE;
+               exp_precision = 16;
+               exp_channels = 2;
+               exp_sample_rate = 11025;
+               exp_pause = 1;
+       }
+
+       /* /dev/audioctl is always "not opened" */
+       if (strcmp(devname, "audioctl") == 0) {
+               exp_mode = 0;
+               exp_popen = 0;
+               exp_ropen = 0;
+       } else {
+               exp_mode = mode2aumode(mode);
+               exp_popen = can_play;
+               exp_ropen = can_rec;
+       }
+
 
        /*
-        * NetBSD7,8 always has both buffers for playback and recording.
-        * NetBSD9 only has necessary buffers.
+        * At first, initialize the sticky parameters both of play and rec.
+        * This uses /dev/audio to verify /dev/audio.  It's not good way but
+        * I don't have better one...
         */
-       if (netbsd < 9) {
-               pbuff = true;
-               rbuff = true;
-       } else {
-               pbuff = can_play;
-               rbuff = can_rec;
-       }
+       fd = OPEN(devaudio, openable_mode());
+       REQUIRED_SYS_OK(fd);
+       r = CLOSE(fd);
+       REQUIRED_SYS_EQ(0, r);
 
        /*
-        * Open /dev/audio and check parameters
+        * Open target device and check the initial parameters
+        * At this moment, all devices are initialized by default.
         */
-       fd = OPEN(devaudio, mode);
+       fd = OPEN(devfile, mode);
        REQUIRED_SYS_OK(fd);
        memset(&ai, 0, sizeof(ai));
        r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
@@ -1485,23 +1499,24 @@
 
        XP_NE(0, ai.blocksize);
                /* hiwat/lowat */
-       XP_EQ(mode2aumode(mode), ai.mode);
+       XP_EQ(exp_mode, ai.mode);
        /* ai.play */
        XP_EQ(8000, ai.play.sample_rate);
        XP_EQ(1, ai.play.channels);
+       XP_EQ(8, ai.play.precision);
        XP_EQ(AUDIO_ENCODING_ULAW, ai.play.encoding);
                /* gain */
                /* port */
        XP_EQ(0, ai.play.seek);
                /* avail_ports */
-       XP_BUFFSIZE(pbuff, ai.play.buffer_size);
+       XP_NE(0, ai.play.buffer_size);
        XP_EQ(0, ai.play.samples);
        XP_EQ(0, ai.play.eof);
        XP_EQ(0, ai.play.pause);
        XP_EQ(0, ai.play.error);
        XP_EQ(0, ai.play.waiting);
                /* balance */
-       XP_EQ(can_play, ai.play.open);
+       XP_EQ(exp_popen, ai.play.open);
        XP_EQ(0, ai.play.active);
        /* ai.record */
        XP_EQ(8000, ai.record.sample_rate);
@@ -1512,14 +1527,14 @@
                /* port */
        XP_EQ(0, ai.record.seek);
                /* avail_ports */
-       XP_BUFFSIZE(rbuff, ai.record.buffer_size);
+       XP_NE(0, ai.record.buffer_size);
        XP_EQ(0, ai.record.samples);
        XP_EQ(0, ai.record.eof);
        XP_EQ(0, ai.record.pause);
        XP_EQ(0, ai.record.error);
        XP_EQ(0, ai.record.waiting);
                /* balance */
-       XP_EQ(can_rec, ai.record.open);
+       XP_EQ(exp_ropen, ai.record.open);
        /*
         * NetBSD7,8 (may?) be active when opened in recording mode but
         * recording has not started yet. (?)
@@ -1536,12 +1551,7 @@
         * Change much as possible
         */
        AUDIO_INITINFO(&ai);
-       ai.blocksize = ai0.blocksize * 2;
-       if (ai0.hiwat > 0)
-               ai.hiwat = ai0.hiwat - 1;
-       if (ai0.lowat < ai0.hiwat)
-               ai.lowat = ai0.lowat + 1;
-       ai.mode = ai.mode & ~AUMODE_PLAY_ALL;
+       ai.mode = ai0.mode ^ AUMODE_PLAY_ALL;
        ai.play.sample_rate = 11025;
        ai.play.channels = 2;
        ai.play.precision = 16;
@@ -1558,53 +1568,61 @@
        REQUIRED_SYS_EQ(0, r);
 
        /*
-        * Open /dev/audio again and check
+        * Open the same target device again and check
         */
-       fd = OPEN(devaudio, mode);
+       fd = OPEN(devfile, mode);
        REQUIRED_SYS_OK(fd);
        memset(&ai, 0, sizeof(ai));
        r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
        REQUIRED_SYS_EQ(0, r);
 
-       XP_EQ(ai0.blocksize, ai.blocksize);
-       XP_EQ(ai0.hiwat, ai.hiwat);
-       XP_EQ(ai0.lowat, ai.lowat);
-       XP_EQ(mode2aumode(mode), ai.mode);
+       XP_NE(0, ai.blocksize);
+               /* hiwat/lowat */
+       if (netbsd < 8) {
+               /*
+                * On NetBSD7, the behavior when changing ai.mode on
+                * /dev/audioctl can not be explained yet but I won't
+                * verify it more over.
+                */
+       } else {
+               /* On NetBSD9, changing mode never affects other fds */
+               XP_EQ(exp_mode, ai.mode);
+       }
        /* ai.play */
-       XP_EQ(8000, ai.play.sample_rate);
-       XP_EQ(1, ai.play.channels);
-       XP_EQ(8, ai.play.precision);
-       XP_EQ(AUDIO_ENCODING_ULAW, ai.play.encoding);
+       XP_EQ(exp_sample_rate, ai.play.sample_rate);
+       XP_EQ(exp_channels, ai.play.channels);
+       XP_EQ(exp_precision, ai.play.precision);
+       XP_EQ(exp_encoding, ai.play.encoding);
                /* gain */
                /* port */
        XP_EQ(0, ai.play.seek);
                /* avail_ports */
-       XP_EQ(ai0.play.buffer_size, ai.play.buffer_size);
+       XP_NE(0, ai.play.buffer_size);
        XP_EQ(0, ai.play.samples);
        XP_EQ(0, ai.play.eof);
-       XP_EQ(0, ai.play.pause);
+       XP_EQ(exp_pause, ai.play.pause);
        XP_EQ(0, ai.play.error);
        XP_EQ(0, ai.play.waiting);
                /* balance */
-       XP_EQ(can_play, ai.play.open);
+       XP_EQ(exp_popen, ai.play.open);
        XP_EQ(0, ai.play.active);
        /* ai.record */
-       XP_EQ(8000, ai.record.sample_rate);
-       XP_EQ(1, ai.record.channels);
-       XP_EQ(8, ai.record.precision);



Home | Main Index | Thread Index | Old Index