Module Name: src
Committed By: isaki
Date: Wed Mar 4 14:20:44 UTC 2020
Modified Files:
src/tests/dev/audio: audiotest.c
Log Message:
Sync with sys/dev/audio/audio.c rev1.62.
> Restore backward compatibility with netbsd-7 audio.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/tests/dev/audio/audiotest.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/dev/audio/audiotest.c
diff -u src/tests/dev/audio/audiotest.c:1.6 src/tests/dev/audio/audiotest.c:1.7
--- src/tests/dev/audio/audiotest.c:1.6 Sat Feb 22 05:53:19 2020
+++ src/tests/dev/audio/audiotest.c Wed Mar 4 14:20:44 2020
@@ -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_eq(int, int, int, const char
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 @@ bool xp_sys_ptr(int line, int exp, void
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 @@ mixer_get_outputs_master(int mixerfd)
*/
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,248 +1409,89 @@ DEF(open_mode_RDONLY) { test_open_mode(O
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;
+ 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_audio_%s", openmode_str[mode] + 2);
+ 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;
+ }
}
- /*
- * NetBSD7,8 always has both buffers for playback and recording.
- * NetBSD9 only has necessary buffers.
- */
- if (netbsd < 9) {
- pbuff = true;
- rbuff = true;
+ /* /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 {
- pbuff = can_play;
- rbuff = can_rec;
+ exp_encoding = AUDIO_ENCODING_SLINEAR_LE;
+ exp_precision = 16;
+ exp_channels = 2;
+ exp_sample_rate = 11025;
+ exp_pause = 1;
}
- /*
- * Open /dev/audio and check parameters
- */
- fd = OPEN(devaudio, mode);
- REQUIRED_SYS_OK(fd);
- memset(&ai, 0, sizeof(ai));
- r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
- REQUIRED_SYS_EQ(0, r);
-
- XP_NE(0, ai.blocksize);
- /* hiwat/lowat */
- XP_EQ(mode2aumode(mode), ai.mode);
- /* ai.play */
- XP_EQ(8000, ai.play.sample_rate);
- XP_EQ(1, ai.play.channels);
- 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_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(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);
- XP_EQ(AUDIO_ENCODING_ULAW, ai.record.encoding);
- /* gain */
- /* port */
- XP_EQ(0, ai.record.seek);
- /* avail_ports */
- XP_BUFFSIZE(rbuff, 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);
- /*
- * NetBSD7,8 (may?) be active when opened in recording mode but
- * recording has not started yet. (?)
- * NetBSD9 is not active at that time.
- */
- if (netbsd < 9) {
+ /* /dev/audioctl is always "not opened" */
+ if (strcmp(devname, "audioctl") == 0) {
+ exp_mode = 0;
+ exp_popen = 0;
+ exp_ropen = 0;
} else {
- XP_EQ(0, ai.record.active);
+ exp_mode = mode2aumode(mode);
+ exp_popen = can_play;
+ exp_ropen = can_rec;
}
- /* Save it */
- ai0 = ai;
- /*
- * 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.play.sample_rate = 11025;
- ai.play.channels = 2;
- ai.play.precision = 16;
- ai.play.encoding = AUDIO_ENCODING_SLINEAR_LE;
- ai.play.pause = 1;
- ai.record.sample_rate = 11025;
- ai.record.channels = 2;
- ai.record.precision = 16;
- ai.record.encoding = AUDIO_ENCODING_SLINEAR_LE;
- ai.record.pause = 1;
- r = IOCTL(fd, AUDIO_SETINFO, &ai, "ai");
- REQUIRED_SYS_EQ(0, r);
- r = CLOSE(fd);
- REQUIRED_SYS_EQ(0, r);
/*
- * Open /dev/audio again and check
+ * 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...
*/
- fd = OPEN(devaudio, mode);
+ fd = OPEN(devaudio, openable_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);
- /* 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_EQ(ai0.play.buffer_size, 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(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);
- XP_EQ(AUDIO_ENCODING_ULAW, ai.record.encoding);
- /* gain */
- /* port */
- XP_EQ(0, ai.record.seek);
- /* avail_ports */
- XP_EQ(ai0.record.buffer_size, 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);
- if (netbsd < 9) {
- } else {
- XP_EQ(0, ai.record.active);
- }
-
r = CLOSE(fd);
REQUIRED_SYS_EQ(0, r);
-}
-DEF(open_audio_RDONLY) { test_open_audio(O_RDONLY); }
-DEF(open_audio_WRONLY) { test_open_audio(O_WRONLY); }
-DEF(open_audio_RDWR) { test_open_audio(O_RDWR); }
-
-/*
- * /dev/sound inherits the initial parameters from /dev/sound and /dev/audio.
- */
-void
-test_open_sound(int mode)
-{
- struct audio_info ai;
- struct audio_info ai0;
- int fd;
- int r;
- int can_play;
- int can_rec;
- bool pbuff;
- bool rbuff;
-
- TEST("open_sound_%s", openmode_str[mode] + 2);
-
- 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;
- }
-
- /*
- * NetBSD7,8 always has both buffers for playback and recording.
- * NetBSD9 only has necessary buffers.
- */
- if (netbsd < 9) {
- pbuff = true;
- rbuff = true;
- } else {
- pbuff = can_play;
- rbuff = can_rec;
- }
-
- /*
- * At first, open /dev/audio to initialize the parameters both of
- * playback and recording.
- */
- if (hw_canplay()) {
- fd = OPEN(devaudio, O_WRONLY);
- REQUIRED_SYS_OK(fd);
- r = CLOSE(fd);
- REQUIRED_SYS_EQ(0, r);
- }
- if (hw_canrec()) {
- fd = OPEN(devaudio, O_RDONLY);
- REQUIRED_SYS_OK(fd);
- r = CLOSE(fd);
- REQUIRED_SYS_EQ(0, r);
- }
/*
- * Open /dev/sound and check the initial parameters.
- * It should be the same with /dev/audio's initial parameters.
+ * Open target device and check the initial parameters
+ * At this moment, all devices are initialized by default.
*/
- fd = OPEN(devsound, mode);
+ fd = OPEN(devfile, mode);
REQUIRED_SYS_OK(fd);
memset(&ai, 0, sizeof(ai));
r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
@@ -1684,7 +1499,7 @@ test_open_sound(int mode)
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);
@@ -1694,14 +1509,14 @@ test_open_sound(int mode)
/* 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);
@@ -1712,14 +1527,14 @@ test_open_sound(int mode)
/* 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. (?)
@@ -1736,10 +1551,7 @@ test_open_sound(int mode)
* Change much as possible
*/
AUDIO_INITINFO(&ai);
- ai.blocksize = ai0.blocksize * 2;
- ai.hiwat = ai0.hiwat - 1;
- ai.lowat = ai0.lowat + 1;
- ai.mode = ai0.mode & ~AUMODE_PLAY_ALL;
+ ai.mode = ai0.mode ^ AUMODE_PLAY_ALL;
ai.play.sample_rate = 11025;
ai.play.channels = 2;
ai.play.precision = 16;
@@ -1752,257 +1564,66 @@ test_open_sound(int mode)
ai.record.pause = 1;
r = IOCTL(fd, AUDIO_SETINFO, &ai, "ai");
REQUIRED_SYS_EQ(0, r);
- r = IOCTL(fd, AUDIO_GETBUFINFO, &ai0, "ai0");
- REQUIRED_SYS_EQ(0, r);
r = CLOSE(fd);
REQUIRED_SYS_EQ(0, r);
/*
- * Open /dev/sound again and check
+ * Open the same target device again and check
*/
- fd = OPEN(devsound, 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_NE(0, ai.blocksize);
/* hiwat/lowat */
- XP_EQ(mode2aumode(mode), ai.mode); /* mode is reset */
- /* ai.play */
- XP_EQ(ai0.play.sample_rate, ai.play.sample_rate); /* sticky */
- XP_EQ(ai0.play.channels, ai.play.channels); /* sticky */
- XP_EQ(ai0.play.precision, ai.play.precision); /* sticky */
- XP_EQ(ai0.play.encoding, ai.play.encoding); /* sticky */
- /* gain */
- /* port */
- XP_EQ(0, ai.play.seek);
- /* avail_ports */
- XP_BUFFSIZE(pbuff, ai.play.buffer_size);
- XP_EQ(0, ai.play.samples);
- XP_EQ(0, ai.play.eof);
- XP_EQ(ai0.play.pause, ai.play.pause); /* sticky */
- XP_EQ(0, ai.play.error);
- XP_EQ(0, ai.play.waiting);
- /* balance */
- XP_EQ(can_play, ai.play.open);
- XP_EQ(0, ai.play.active);
- /* ai.record */
- XP_EQ(ai0.record.sample_rate, ai.record.sample_rate); /* sticky */
- XP_EQ(ai0.record.channels, ai.record.channels); /* sticky */
- XP_EQ(ai0.record.precision, ai.record.precision); /* sticky */
- XP_EQ(ai0.record.encoding, ai.record.encoding); /* sticky */
- /* gain */
- /* port */
- XP_EQ(0, ai.record.seek);
- /* avail_ports */
- XP_BUFFSIZE(rbuff, ai.record.buffer_size);
- XP_EQ(0, ai.record.samples);
- XP_EQ(0, ai.record.eof);
- XP_EQ(ai0.record.pause, ai.record.pause); /* sticky */
- XP_EQ(0, ai.record.error);
- XP_EQ(0, ai.record.waiting);
- /* balance */
- XP_EQ(can_rec, ai.record.open);
- if (netbsd < 9) {
- } else {
- XP_EQ(0, ai.record.active);
- }
-
- r = CLOSE(fd);
- REQUIRED_SYS_EQ(0, r);
-}
-DEF(open_sound_RDONLY) { test_open_sound(O_RDONLY); }
-DEF(open_sound_WRONLY) { test_open_sound(O_WRONLY); }
-DEF(open_sound_RDWR) { test_open_sound(O_RDWR); }
-
-/*
- * The (initial) parameters of /dev/audioctl are affected by sticky like
- * as /dev/sound.
- */
-void
-test_open_audioctl(int mode)
-{
- struct audio_info ai;
- struct audio_info ai0;
- int fd;
- int r;
- int can_play;
- int can_rec;
- bool pbuff;
- bool rbuff;
-
- TEST("open_audioctl_%s", openmode_str[mode] + 2);
- XP_SKIP("not yet");
- return;
-
- can_play = mode2play(mode);
- can_rec = mode2rec(mode);
-
- /*
- * NetBSD7,8 always has both buffers for playback and recording.
- * NetBSD9 only has necessary buffers.
- */
- if (netbsd < 9) {
- pbuff = true;
- rbuff = true;
- } else {
- pbuff = can_play;
- rbuff = can_rec;
- }
-
- /* Reset sticky */
- fd = OPEN(devaudio, openable_mode());
- REQUIRED_SYS_OK(fd);
- r = CLOSE(fd);
- REQUIRED_SYS_EQ(0, r);
-
- /*
- * Open /dev/audioctl and check parameters
- */
- fd = OPEN(devaudioctl, mode);
- REQUIRED_SYS_OK(fd);
- memset(&ai, 0, sizeof(ai));
- r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
- REQUIRED_SYS_EQ(0, r);
-
- if (netbsd < 9) {
- XP_NE(0, ai.blocksize);
- XP_NE(0, ai.hiwat);
- /* lowat */
- } else {
- /* NetBSD9 returns dummy non-zero blocksize */
- XP_NE(0, ai.blocksize);
- XP_NE(0, ai.hiwat);
- /* lowat */
- }
- XP_EQ(0, ai.mode);
- /* ai.play */
- XP_EQ(8000, ai.play.sample_rate);
- XP_EQ(1, ai.play.channels);
- 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_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(0, 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);
- XP_EQ(AUDIO_ENCODING_ULAW, ai.record.encoding);
- /* gain */
- /* port */
- XP_EQ(0, ai.record.seek);
- /* avail_ports */
- XP_BUFFSIZE(rbuff, 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(0, ai.record.open);
- /*
- * NetBSD7,8 (may?) be active when opened in recording mode but
- * recording has not started yet. (?)
- * NetBSD9 is not active at that time.
- */
- if (netbsd < 9) {
- /* ai.record.active */
- } else {
- XP_EQ(0, ai.record.active);
- }
-
- /*
- * Change much as possible
- */
- ai0 = ai;
- AUDIO_INITINFO(&ai);
if (netbsd < 8) {
/*
- * On NetBSD7, The behavior when changing ai.mode on
+ * 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 tracks */
- ai0.mode ^= 7;
- ai.mode = ai0.mode;
+ /* On NetBSD9, changing mode never affects other fds */
+ XP_EQ(exp_mode, ai.mode);
}
- ai.play.sample_rate = 11025;
- ai.play.channels = 2;
- ai.play.precision = 16;
- ai.play.encoding = AUDIO_ENCODING_SLINEAR_LE;
- ai.play.pause = 1;
- ai.record.sample_rate = 11025;
- ai.record.channels = 2;
- ai.record.precision = 16;
- ai.record.encoding = AUDIO_ENCODING_SLINEAR_LE;
- ai.record.pause = 1;
- r = IOCTL(fd, AUDIO_SETINFO, &ai, "ai");
- REQUIRED_SYS_EQ(0, r);
- r = CLOSE(fd);
- REQUIRED_SYS_EQ(0, r);
-
- /*
- * Open /dev/audioctl again and check
- */
- fd = OPEN(devaudioctl, mode);
- REQUIRED_SYS_OK(fd);
- memset(&ai, 0, sizeof(ai));
- r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
- REQUIRED_SYS_EQ(0, r);
-
- XP_NE(0, ai.blocksize);
- XP_NE(0, ai.hiwat); /* hiwat should not be zero */
- /* lowat */ /* lowat can be zero */
- XP_EQ(0, ai.mode);
/* ai.play */
- XP_EQ(11025, ai.play.sample_rate);
- XP_EQ(2, ai.play.channels);
- XP_EQ(16, ai.play.precision);
- XP_EQ(AUDIO_ENCODING_SLINEAR_LE, 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(1, 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(0, ai.play.open);
+ XP_EQ(exp_popen, ai.play.open);
XP_EQ(0, ai.play.active);
/* ai.record */
- XP_EQ(11025, ai.record.sample_rate);
- XP_EQ(2, ai.record.channels);
- XP_EQ(16, ai.record.precision);
- XP_EQ(AUDIO_ENCODING_SLINEAR_LE, ai.record.encoding);
+ XP_EQ(exp_sample_rate, ai.record.sample_rate);
+ XP_EQ(exp_channels, ai.record.channels);
+ XP_EQ(exp_precision, ai.record.precision);
+ XP_EQ(exp_encoding, ai.record.encoding);
/* gain */
/* port */
XP_EQ(0, ai.record.seek);
/* avail_ports */
- XP_EQ(ai0.record.buffer_size, 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(1, ai.record.pause);
+ XP_EQ(exp_pause, ai.record.pause);
XP_EQ(0, ai.record.error);
XP_EQ(0, ai.record.waiting);
/* balance */
- XP_EQ(0, ai.record.open);
+ XP_EQ(exp_ropen, ai.record.open);
if (netbsd < 9) {
- /* ai.record.active */
} else {
XP_EQ(0, ai.record.active);
}
@@ -2010,10 +1631,15 @@ test_open_audioctl(int mode)
r = CLOSE(fd);
REQUIRED_SYS_EQ(0, r);
}
-DEF(open_audioctl_RDONLY) { test_open_audioctl(O_RDONLY); }
-DEF(open_audioctl_WRONLY) { test_open_audioctl(O_WRONLY); }
-DEF(open_audioctl_RDWR) { test_open_audioctl(O_RDWR); }
-
+DEF(open_audio_RDONLY) { test_open("audio", O_RDONLY); }
+DEF(open_audio_WRONLY) { test_open("audio", O_WRONLY); }
+DEF(open_audio_RDWR) { test_open("audio", O_RDWR); }
+DEF(open_sound_RDONLY) { test_open("sound", O_RDONLY); }
+DEF(open_sound_WRONLY) { test_open("sound", O_WRONLY); }
+DEF(open_sound_RDWR) { test_open("sound", O_RDWR); }
+DEF(open_audioctl_RDONLY) { test_open("audioctl", O_RDONLY); }
+DEF(open_audioctl_WRONLY) { test_open("audioctl", O_WRONLY); }
+DEF(open_audioctl_RDWR) { test_open("audioctl", O_RDWR); }
/*
* Open (1) /dev/sound -> (2) /dev/audio -> (3) /dev/sound,
@@ -2062,7 +1688,7 @@ DEF(open_sound_sticky)
}
/*
- * /dev/audioctl doesn't have stickiness like /dev/sound.
+ * /dev/audioctl has stickiness like /dev/sound.
*/
DEF(open_audioctl_sticky)
{
@@ -2072,30 +1698,54 @@ DEF(open_audioctl_sticky)
int openmode;
TEST("open_audioctl_sticky");
- XP_SKIP("not yet");
- return;
openmode = openable_mode();
- /* First, open /dev/sound and change encoding as a delegate */
- fd = OPEN(devsound, openmode);
+ /* First, open /dev/audio and change encoding */
+ fd = OPEN(devaudio, openmode);
REQUIRED_SYS_OK(fd);
AUDIO_INITINFO(&ai);
ai.play.encoding = AUDIO_ENCODING_SLINEAR_LE;
+ ai.play.precision = 16;
ai.record.encoding = AUDIO_ENCODING_SLINEAR_LE;
- r = IOCTL(fd, AUDIO_SETINFO, &ai, "");
+ ai.record.precision = 16;
+ r = IOCTL(fd, AUDIO_SETINFO, &ai, "SLINEAR_LE");
REQUIRED_SYS_EQ(0, r);
r = CLOSE(fd);
REQUIRED_SYS_EQ(0, r);
- /* Next, open /dev/audioctl. It should not be affected */
+ /* Next, open /dev/audioctl. It should be affected */
fd = OPEN(devaudioctl, openmode);
REQUIRED_SYS_OK(fd);
memset(&ai, 0, sizeof(ai));
r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
REQUIRED_SYS_EQ(0, r);
XP_EQ(AUDIO_ENCODING_SLINEAR_LE, ai.play.encoding);
+ XP_EQ(16, ai.play.precision);
XP_EQ(AUDIO_ENCODING_SLINEAR_LE, ai.record.encoding);
+ XP_EQ(16, ai.record.precision);
+
+ /* Then, change /dev/audioctl */
+ AUDIO_INITINFO(&ai);
+ ai.play.encoding = AUDIO_ENCODING_ULAW;
+ ai.play.precision = 8;
+ ai.record.encoding = AUDIO_ENCODING_ULAW;
+ ai.record.precision = 8;
+ r = IOCTL(fd, AUDIO_SETINFO, &ai, "ULAW");
+ REQUIRED_SYS_EQ(0, r);
+ r = CLOSE(fd);
+ REQUIRED_SYS_EQ(0, r);
+
+ /* Finally, open /dev/sound. It also should be affected */
+ fd = OPEN(devsound, openmode);
+ REQUIRED_SYS_OK(fd);
+ memset(&ai, 0, sizeof(ai));
+ r = IOCTL(fd, AUDIO_GETBUFINFO, &ai, "");
+ REQUIRED_SYS_EQ(0, r);
+ XP_EQ(AUDIO_ENCODING_ULAW, ai.play.encoding);
+ XP_EQ(8, ai.play.precision);
+ XP_EQ(AUDIO_ENCODING_ULAW, ai.record.encoding);
+ XP_EQ(8, ai.record.precision);
r = CLOSE(fd);
REQUIRED_SYS_EQ(0, r);
}
@@ -5069,16 +4719,8 @@ test_AUDIO_SETINFO_mode(int openmode, in
XP_EQ(inimode, ai.mode);
XP_EQ(mode2play(openmode), ai.play.open);
XP_EQ(mode2rec(openmode), ai.record.open);
-
- /*
- * On NetBSD7 and 8, both playback and recording buffer are always
- * allocated. So I won't check it.
- * On NetBSD9, buffer should be allocated only if necessary.
- */
- if (netbsd >= 9) {
- XP_BUFFSIZE(mode2play(openmode), ai.play.buffer_size);
- XP_BUFFSIZE(mode2rec(openmode), ai.record.buffer_size);
- }
+ XP_NE(0, ai.play.buffer_size);
+ XP_NE(0, ai.record.buffer_size);
/* Change mode (and pause here) */
ai.mode = setmode;
@@ -5094,11 +4736,8 @@ test_AUDIO_SETINFO_mode(int openmode, in
/* It seems to keep the initial openmode regardless of mode */
XP_EQ(mode2play(openmode), ai.play.open);
XP_EQ(mode2rec(openmode), ai.record.open);
- /* buffers are always allocated on NetBSD 7 and 8 */
- if (netbsd >= 9) {
- XP_BUFFSIZE(mode2play(openmode), ai.play.buffer_size);
- XP_BUFFSIZE(mode2rec(openmode), ai.record.buffer_size);
- }
+ XP_NE(0, ai.play.buffer_size);
+ XP_NE(0, ai.record.buffer_size);
}
/*
@@ -5315,30 +4954,10 @@ test_AUDIO_SETINFO_params_set(int openmo
? (mode2aumode(openmode) & ~AUMODE_PLAY_ALL)
: mode2aumode(openmode);
XP_EQ(expmode, ai.mode);
-
- if (openmode == O_RDONLY) {
- /* Playback track doesn't exist */
- if (netbsd < 9)
- XP_EQ(pause, ai.play.pause);
- else
- XP_EQ(0, ai.play.pause);
- } else {
- /* Playback track exists */
- XP_EQ(11025, ai.play.sample_rate);
- XP_EQ(pause, ai.play.pause);
- }
-
- if (openmode == O_WRONLY) {
- /* Recording track doesn't exist */
- if (netbsd < 9)
- XP_EQ(pause, ai.record.pause);
- else
- XP_EQ(0, ai.record.pause);
- } else {
- /* Recording track exists */
- XP_EQ(11025, ai.record.sample_rate);
- XP_EQ(pause, ai.record.pause);
- }
+ XP_EQ(11025, ai.play.sample_rate);
+ XP_EQ(pause, ai.play.pause);
+ XP_EQ(11025, ai.record.sample_rate);
+ XP_EQ(pause, ai.record.pause);
r = CLOSE(fd);
XP_SYS_EQ(0, r);
@@ -5361,7 +4980,10 @@ DEF(AUDIO_SETINFO_params_set_RDWR_3) { f
#undef f
/*
- * AUDIO_SETINFO should not be interfere by other descriptor.
+ * AUDIO_SETINFO for existing track should not be interfered by other
+ * descriptor.
+ * AUDIO_SETINFO for non-existing track affects/is affected sticky parameters
+ * for backward compatibility.
*/
DEF(AUDIO_SETINFO_params_simul)
{
@@ -5375,6 +4997,10 @@ DEF(AUDIO_SETINFO_params_simul)
XP_SKIP("Multiple open is not supported");
return;
}
+ if (hw_canplay() == 0) {
+ XP_SKIP("This test is for playable device");
+ return;
+ }
/* Open the 1st one as playback only */
fd0 = OPEN(devaudio, O_WRONLY);
@@ -5391,12 +5017,38 @@ DEF(AUDIO_SETINFO_params_simul)
r = IOCTL(fd1, AUDIO_SETINFO, &ai, "");
XP_SYS_EQ(0, r);
- /* Both track of the 1st one should not be affected */
+ /*
+ * The 1st one doesn't have recording track so that only recording
+ * parameter is affected by sticky parameter.
+ */
memset(&ai, 0, sizeof(ai));
- r = IOCTL(fd0, AUDIO_GETINFO, &ai, "");
+ r = IOCTL(fd0, AUDIO_GETBUFINFO, &ai, "");
XP_SYS_EQ(0, r);
XP_EQ(8000, ai.play.sample_rate);
- XP_EQ(8000, ai.record.sample_rate);
+ XP_EQ(11025, ai.record.sample_rate);
+
+ /* Next, change some parameters of both track on the 1st one */
+ AUDIO_INITINFO(&ai);
+ ai.play.sample_rate = 16000;
+ ai.record.sample_rate = 16000;
+ r = IOCTL(fd0, AUDIO_SETINFO, &ai, "");
+ XP_SYS_EQ(0, r);
+
+ /*
+ * On bi-directional device, the 2nd one has both track so that
+ * both track are not affected by sticky parameter.
+ * On uni-directional device, the 2nd one has only playback track
+ * so that playback track is not affected by sticky parameter.
+ */
+ memset(&ai, 0, sizeof(ai));
+ r = IOCTL(fd1, AUDIO_GETBUFINFO, &ai, "");
+ XP_SYS_EQ(0, r);
+ XP_EQ(11025, ai.play.sample_rate);
+ if (hw_bidir()) {
+ XP_EQ(11025, ai.record.sample_rate);
+ } else {
+ XP_EQ(16000, ai.record.sample_rate);
+ }
r = CLOSE(fd0);
XP_SYS_EQ(0, r);
@@ -5675,28 +5327,10 @@ test_AUDIO_SETINFO_pause(int openmode, i
? (mode2aumode(openmode) & ~AUMODE_PLAY_ALL)
: mode2aumode(openmode);
XP_EQ(expmode, ai.mode);
- if (openmode == O_RDONLY) {
- /* Playback track doesn't exists */
- if (netbsd < 9)
- XP_EQ(1, ai.play.pause);
- else
- XP_EQ(0, ai.play.pause);
- } else {
- /* Playback track exists */
- XP_EQ(1, ai.play.pause);
- XP_EQ(param ? 11025 : 8000, ai.play.sample_rate);
- }
- if (openmode == O_WRONLY) {
- /* Recording track doesn't exist */
- if (netbsd < 9)
- XP_EQ(1, ai.record.pause);
- else
- XP_EQ(0, ai.record.pause);
- } else {
- /* Recording track exists */
- XP_EQ(1, ai.record.pause);
- XP_EQ(param ? 11025 : 8000, ai.record.sample_rate);
- }
+ XP_EQ(1, ai.play.pause);
+ XP_EQ(param ? 11025 : 8000, ai.play.sample_rate);
+ XP_EQ(1, ai.record.pause);
+ XP_EQ(param ? 11025 : 8000, ai.record.sample_rate);
/* Set unpause (?) */
AUDIO_INITINFO(&ai);