* devdsp.c: Outputs the names of the main test functions.
(forkrectest): Expect child success. (forkplaytest): Ditto. (syncwithchild): Output the child status and the desired value. (sinegenw): Reduce volume of the beep. (sinegenb): Ditto. (dup_test): New test.
This commit is contained in:
parent
721a934c16
commit
86b652f9c8
|
@ -1,3 +1,14 @@
|
||||||
|
2004-08-17 Gerd Spalink <Gerd.Spalink@t-online.de>
|
||||||
|
Pierre Humblet <Pierre.Humblet@ieee.org>
|
||||||
|
|
||||||
|
* devdsp.c: Outputs the names of the main test functions.
|
||||||
|
(forkrectest): Expect child success.
|
||||||
|
(forkplaytest): Ditto.
|
||||||
|
(syncwithchild): Output the child status and the desired value.
|
||||||
|
(sinegenw): Reduce volume of the beep.
|
||||||
|
(sinegenb): Ditto.
|
||||||
|
(dup_test): New test.
|
||||||
|
|
||||||
2004-04-13 Gerd Spalink <Gerd.Spalink@t-online.de>
|
2004-04-13 Gerd Spalink <Gerd.Spalink@t-online.de>
|
||||||
|
|
||||||
* winsup.api/devdsp.c (forkrectest): Move synchronization with child
|
* winsup.api/devdsp.c (forkrectest): Move synchronization with child
|
||||||
|
|
|
@ -29,6 +29,9 @@ details. */
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "test.h" /* use libltp framework */
|
#include "test.h" /* use libltp framework */
|
||||||
|
|
||||||
|
/* Controls if a child can open the device after the parent */
|
||||||
|
#define CHILD_EXPECT 0 /* 0 or 1 */
|
||||||
|
|
||||||
static const char wavfile_okay[] =
|
static const char wavfile_okay[] =
|
||||||
{
|
{
|
||||||
#include "devdsp_okay.h" /* a sound sample */
|
#include "devdsp_okay.h" /* a sound sample */
|
||||||
|
@ -36,7 +39,7 @@ static const char wavfile_okay[] =
|
||||||
|
|
||||||
/* Globals required by libltp */
|
/* Globals required by libltp */
|
||||||
const char *TCID = "devdsp"; /* set test case identifier */
|
const char *TCID = "devdsp"; /* set test case identifier */
|
||||||
int TST_TOTAL = 35;
|
int TST_TOTAL = 37;
|
||||||
|
|
||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
void sinegen (void *wave, int rate, int bits, int len, int stride);
|
void sinegen (void *wave, int rate, int bits, int len, int stride);
|
||||||
|
@ -57,6 +60,7 @@ void abortplaytest (void);
|
||||||
void playwavtest (void);
|
void playwavtest (void);
|
||||||
void syncwithchild (pid_t pid, int expected_exit_status);
|
void syncwithchild (pid_t pid, int expected_exit_status);
|
||||||
void cleanup (void);
|
void cleanup (void);
|
||||||
|
void dup_test (void);
|
||||||
|
|
||||||
static int expect_child_failure = 0;
|
static int expect_child_failure = 0;
|
||||||
|
|
||||||
|
@ -83,6 +87,7 @@ main (int argc, char *argv[])
|
||||||
forkrectest ();
|
forkrectest ();
|
||||||
abortplaytest ();
|
abortplaytest ();
|
||||||
playwavtest ();
|
playwavtest ();
|
||||||
|
dup_test ();
|
||||||
tst_exit ();
|
tst_exit ();
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -96,6 +101,7 @@ ioctltest (void)
|
||||||
int ioctl_par;
|
int ioctl_par;
|
||||||
int channels;
|
int channels;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
audio1 = open ("/dev/dsp", O_WRONLY);
|
audio1 = open ("/dev/dsp", O_WRONLY);
|
||||||
if (audio1 < 0)
|
if (audio1 < 0)
|
||||||
{
|
{
|
||||||
|
@ -143,6 +149,7 @@ playbacktest (void)
|
||||||
int audio1, audio2;
|
int audio1, audio2;
|
||||||
int rate, k;
|
int rate, k;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
audio1 = open ("/dev/dsp", O_WRONLY);
|
audio1 = open ("/dev/dsp", O_WRONLY);
|
||||||
if (audio1 < 0)
|
if (audio1 < 0)
|
||||||
{
|
{
|
||||||
|
@ -155,7 +162,7 @@ playbacktest (void)
|
||||||
tst_brkm (TFAIL, cleanup,
|
tst_brkm (TFAIL, cleanup,
|
||||||
"Second open /dev/dsp W succeeded, but is expected to fail");
|
"Second open /dev/dsp W succeeded, but is expected to fail");
|
||||||
}
|
}
|
||||||
if (errno != EBUSY)
|
else if (errno != EBUSY)
|
||||||
{
|
{
|
||||||
tst_brkm (TFAIL, cleanup, "Expected EBUSY here, exit: %s",
|
tst_brkm (TFAIL, cleanup, "Expected EBUSY here, exit: %s",
|
||||||
strerror (errno));
|
strerror (errno));
|
||||||
|
@ -179,7 +186,9 @@ recordingtest (void)
|
||||||
{
|
{
|
||||||
int audio1, audio2;
|
int audio1, audio2;
|
||||||
int rate, k;
|
int rate, k;
|
||||||
|
|
||||||
/* test read / record */
|
/* test read / record */
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
audio1 = open ("/dev/dsp", O_RDONLY);
|
audio1 = open ("/dev/dsp", O_RDONLY);
|
||||||
if (audio1 < 0)
|
if (audio1 < 0)
|
||||||
{
|
{
|
||||||
|
@ -192,7 +201,7 @@ recordingtest (void)
|
||||||
tst_brkm (TFAIL, cleanup,
|
tst_brkm (TFAIL, cleanup,
|
||||||
"Second open /dev/dsp R succeeded, but is expected to fail");
|
"Second open /dev/dsp R succeeded, but is expected to fail");
|
||||||
}
|
}
|
||||||
if (errno != EBUSY)
|
else if (errno != EBUSY)
|
||||||
{
|
{
|
||||||
tst_brkm (TFAIL, cleanup, "Expected EBUSY here, exit: %s",
|
tst_brkm (TFAIL, cleanup, "Expected EBUSY here, exit: %s",
|
||||||
strerror (errno));
|
strerror (errno));
|
||||||
|
@ -216,6 +225,7 @@ monitortest (void)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
fd = open ("/dev/dsp", O_RDWR);
|
fd = open ("/dev/dsp", O_RDWR);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
|
@ -235,6 +245,7 @@ forkrectest (void)
|
||||||
int pid;
|
int pid;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
fd = open ("/dev/dsp", O_RDONLY);
|
fd = open ("/dev/dsp", O_RDONLY);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
|
@ -274,15 +285,16 @@ forkrectest (void)
|
||||||
if (pid)
|
if (pid)
|
||||||
{
|
{
|
||||||
tst_resm (TINFO, "forked, child PID=%d", pid);
|
tst_resm (TINFO, "forked, child PID=%d", pid);
|
||||||
syncwithchild (pid, TFAIL); /* expecting error exit */
|
syncwithchild (pid, CHILD_EXPECT?TFAIL:0); /* expecting error exit */
|
||||||
tst_resm (TINFO, "parent records again ..");
|
tst_resm (TINFO, "parent records again ..");
|
||||||
rectest (fd, 22050, 1, 16);
|
rectest (fd, 22050, 1, 16);
|
||||||
tst_resm (TINFO, "parent done");
|
tst_resm (TINFO, "parent done");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* child */
|
{ /* child */
|
||||||
expect_child_failure = 1;
|
expect_child_failure = CHILD_EXPECT;
|
||||||
tst_resm (TINFO, "child trying to record (should fail)..");
|
tst_resm (TINFO, "child trying to record %s",
|
||||||
|
CHILD_EXPECT?"(should fail)..":"");
|
||||||
rectest (fd, 44100, 1, 16);
|
rectest (fd, 44100, 1, 16);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
tst_resm (TINFO, "child done");
|
tst_resm (TINFO, "child done");
|
||||||
|
@ -293,7 +305,7 @@ forkrectest (void)
|
||||||
{
|
{
|
||||||
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
||||||
}
|
}
|
||||||
tst_resm (TPASS, "child cannot record if parent is already recording");
|
tst_resm (TPASS, "child tries to record while parent is already recording");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -302,6 +314,7 @@ forkplaytest (void)
|
||||||
int pid;
|
int pid;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
fd = open ("/dev/dsp", O_WRONLY);
|
fd = open ("/dev/dsp", O_WRONLY);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
|
@ -341,15 +354,16 @@ forkplaytest (void)
|
||||||
if (pid)
|
if (pid)
|
||||||
{
|
{
|
||||||
tst_resm (TINFO, "forked, child PID=%d", pid);
|
tst_resm (TINFO, "forked, child PID=%d", pid);
|
||||||
syncwithchild (pid, TFAIL); /* expected failure */
|
syncwithchild (pid, CHILD_EXPECT?TFAIL:0); /* expected failure */
|
||||||
tst_resm (TINFO, "parent plays again..");
|
tst_resm (TINFO, "parent plays again..");
|
||||||
playtest (fd, 22050, 0, 8);
|
playtest (fd, 22050, 0, 8);
|
||||||
tst_resm (TINFO, "parent done");
|
tst_resm (TINFO, "parent done");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* child */
|
{ /* child */
|
||||||
expect_child_failure = 1;
|
expect_child_failure = CHILD_EXPECT;
|
||||||
tst_resm (TINFO, "child trying to play (should fail)..");
|
tst_resm (TINFO, "child trying to play %s",
|
||||||
|
CHILD_EXPECT?"(should fail)..":"");
|
||||||
playtest (fd, 44100, 1, 16);
|
playtest (fd, 44100, 1, 16);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
tst_resm (TINFO, "child done");
|
tst_resm (TINFO, "child done");
|
||||||
|
@ -360,7 +374,7 @@ forkplaytest (void)
|
||||||
{
|
{
|
||||||
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
||||||
}
|
}
|
||||||
tst_resm (TPASS, "child cannot play if parent is already playing");
|
tst_resm (TPASS, "child tries to play while parent is already playing");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -552,7 +566,8 @@ syncwithchild (pid_t pid, int expected_exit_status)
|
||||||
}
|
}
|
||||||
if (WEXITSTATUS (status) != expected_exit_status)
|
if (WEXITSTATUS (status) != expected_exit_status)
|
||||||
{
|
{
|
||||||
tst_brkm (TBROK, cleanup, "Child had exit status != 0");
|
tst_brkm (TFAIL, cleanup, "Child had exit status %d != %d",
|
||||||
|
WEXITSTATUS (status), expected_exit_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -582,7 +597,7 @@ sinegenw (int freq, int samprate, short *value, int len, int stride)
|
||||||
incr = M_PI * 2.0 * (double) freq / (double) samprate;
|
incr = M_PI * 2.0 * (double) freq / (double) samprate;
|
||||||
while (len-- > 0)
|
while (len-- > 0)
|
||||||
{
|
{
|
||||||
*value = (short) floor (0.5 + 32766.5 * sin (phase));
|
*value = (short) floor (0.5 + 6553 * sin (phase));
|
||||||
value += stride;
|
value += stride;
|
||||||
phase += incr;
|
phase += incr;
|
||||||
}
|
}
|
||||||
|
@ -597,7 +612,7 @@ sinegenb (int freq, int samprate, unsigned char *value, int len, int stride)
|
||||||
incr = M_PI * 2.0 * (double) freq / (double) samprate;
|
incr = M_PI * 2.0 * (double) freq / (double) samprate;
|
||||||
while (len-- > 0)
|
while (len-- > 0)
|
||||||
{
|
{
|
||||||
*value = (unsigned char) floor (128.5 + 126.5 * sin (phase));
|
*value = (unsigned char) floor (128.5 + 26 * sin (phase));
|
||||||
value += stride;
|
value += stride;
|
||||||
phase += incr;
|
phase += incr;
|
||||||
}
|
}
|
||||||
|
@ -611,6 +626,7 @@ abortplaytest (void)
|
||||||
int n;
|
int n;
|
||||||
int ioctl_par = 0;
|
int ioctl_par = 0;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
audio = open ("/dev/dsp", O_WRONLY);
|
audio = open ("/dev/dsp", O_WRONLY);
|
||||||
if (audio < 0)
|
if (audio < 0)
|
||||||
{
|
{
|
||||||
|
@ -642,6 +658,8 @@ playwavtest (void)
|
||||||
int audio;
|
int audio;
|
||||||
int size = sizeof (wavfile_okay);
|
int size = sizeof (wavfile_okay);
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
audio = open ("/dev/dsp", O_WRONLY);
|
audio = open ("/dev/dsp", O_WRONLY);
|
||||||
if (audio < 0)
|
if (audio < 0)
|
||||||
{
|
{
|
||||||
|
@ -663,6 +681,102 @@ playwavtest (void)
|
||||||
tst_resm (TPASS, "Set parameters from wave file header");
|
tst_resm (TPASS, "Set parameters from wave file header");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dup_test (void)
|
||||||
|
{
|
||||||
|
int audio, fd, n;
|
||||||
|
int bits1, bits2;
|
||||||
|
int size = sizeof (wavfile_okay);
|
||||||
|
int header = 44;
|
||||||
|
const char *okay = wavfile_okay + header;
|
||||||
|
|
||||||
|
tst_resm (TINFO, "Running %s", __FUNCTION__);
|
||||||
|
audio = open ("/dev/dsp", O_WRONLY);
|
||||||
|
if (audio < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Error open /dev/dsp W: %s",
|
||||||
|
strerror (errno));
|
||||||
|
}
|
||||||
|
/* write header once to set parameters correctly */
|
||||||
|
n = write (audio, wavfile_okay, header);
|
||||||
|
if (n != header)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Wrote %d, expected %d; exit", n, header);
|
||||||
|
}
|
||||||
|
size = size - header;
|
||||||
|
/* dup / close */
|
||||||
|
for (fd = audio+1; fd <= audio+5; fd++)
|
||||||
|
if (dup2 (fd-1, fd) != -1)
|
||||||
|
{
|
||||||
|
if (fd-2 >= audio)
|
||||||
|
if (close (fd-2) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
if ((n = write (fd, okay, size)) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "write: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
if (n != size)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Wrote %d, expected %d; exit", n, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tst_brkm (TFAIL, cleanup, "dup: %s", strerror (errno));
|
||||||
|
|
||||||
|
for (fd = audio+4; fd <= audio+5; fd++)
|
||||||
|
if (close (fd) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
tst_resm (TPASS, "Write to duped fd");
|
||||||
|
|
||||||
|
audio = open ("/dev/dsp", O_WRONLY);
|
||||||
|
if (audio < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Error open /dev/dsp W: %s",
|
||||||
|
strerror (errno));
|
||||||
|
}
|
||||||
|
fd = audio + 1;
|
||||||
|
if (dup2 (audio, fd) == -1)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "dup: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
bits1 = AFMT_U8;
|
||||||
|
if (ioctl (audio, SNDCTL_DSP_SAMPLESIZE, &bits1) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "ioctl: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
bits1 = AFMT_S16_LE;
|
||||||
|
if (ioctl (fd, SNDCTL_DSP_SAMPLESIZE, &bits1) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "ioctl: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
bits1 = AFMT_QUERY;
|
||||||
|
if (ioctl (audio, SNDCTL_DSP_SAMPLESIZE, &bits1) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "ioctl: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
bits2 = AFMT_QUERY;
|
||||||
|
if (ioctl (fd, SNDCTL_DSP_SAMPLESIZE, &bits2) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "ioctl: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
if (bits1 != AFMT_S16_LE || bits2 != AFMT_S16_LE)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Inconsistent state of duped fd: %d %d %d",
|
||||||
|
AFMT_S16_LE,bits1,bits2);
|
||||||
|
}
|
||||||
|
if (close (audio) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
if (close (fd) < 0)
|
||||||
|
{
|
||||||
|
tst_brkm (TFAIL, cleanup, "Close audio: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
tst_resm (TPASS, "Parameter change to duped fd");
|
||||||
|
}
|
||||||
void
|
void
|
||||||
cleanup (void)
|
cleanup (void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue