mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2026-02-23 01:40:06 -05:00
Merge a19db1e5ad into 55c6338290
This commit is contained in:
commit
ea3b53b02f
6 changed files with 526 additions and 2 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -67,3 +67,4 @@ test/seq
|
||||||
test/timer
|
test/timer
|
||||||
test/lsb/config
|
test/lsb/config
|
||||||
test/lsb/midi_event
|
test/lsb/midi_event
|
||||||
|
test/features/pcm
|
||||||
|
|
|
||||||
|
|
@ -761,7 +761,7 @@ AC_OUTPUT(Makefile doc/Makefile doc/pictures/Makefile doc/doxygen.cfg \
|
||||||
src/conf/pcm/Makefile \
|
src/conf/pcm/Makefile \
|
||||||
modules/Makefile modules/mixer/Makefile modules/mixer/simple/Makefile \
|
modules/Makefile modules/mixer/Makefile modules/mixer/simple/Makefile \
|
||||||
alsalisp/Makefile aserver/Makefile \
|
alsalisp/Makefile aserver/Makefile \
|
||||||
test/Makefile test/lsb/Makefile \
|
test/Makefile test/lsb/Makefile test/features/Makefile \
|
||||||
utils/Makefile utils/alsa-lib.spec utils/alsa.pc utils/alsa-topology.pc)
|
utils/Makefile utils/alsa-lib.spec utils/alsa.pc utils/alsa-topology.pc)
|
||||||
|
|
||||||
dnl Create asoundlib.h dynamically according to configure options
|
dnl Create asoundlib.h dynamically according to configure options
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
SUBDIRS=. lsb
|
SUBDIRS=. features lsb
|
||||||
|
|
||||||
check_PROGRAMS=control pcm pcm_min latency seq \
|
check_PROGRAMS=control pcm pcm_min latency seq \
|
||||||
playmidi1 timer rawmidi midiloop \
|
playmidi1 timer rawmidi midiloop \
|
||||||
|
|
|
||||||
6
test/features/Makefile.am
Normal file
6
test/features/Makefile.am
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
TESTS = pcm
|
||||||
|
check_PROGRAMS = $(TESTS)
|
||||||
|
noinst_HEADERS = test.h
|
||||||
|
|
||||||
|
AM_CFLAGS = -Wall -pipe
|
||||||
|
LDADD = ../../src/libasound.la
|
||||||
454
test/features/pcm.c
Normal file
454
test/features/pcm.c
Normal file
|
|
@ -0,0 +1,454 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include "test.h"
|
||||||
|
|
||||||
|
#define CARD_NAME "Loopback"
|
||||||
|
#define PERIOD_SIZE (16 * 1024)
|
||||||
|
#define CHANNELS 2
|
||||||
|
#define RATE 48000
|
||||||
|
#define FORMAT SND_PCM_FORMAT_S16_LE
|
||||||
|
|
||||||
|
int card_index;
|
||||||
|
static snd_pcm_t *opcm, *ipcm;
|
||||||
|
static char opcmdev[10], ipcmdev[10];
|
||||||
|
|
||||||
|
static int find_card(int *card_index) {
|
||||||
|
int index = -1;
|
||||||
|
ALSA_CALL(snd_card_next(&index));
|
||||||
|
while (index >= 0) {
|
||||||
|
char *name;
|
||||||
|
ALSA_CALL(snd_card_get_name(index, &name) < 0);
|
||||||
|
if (strcmp(name, CARD_NAME) == 0) {
|
||||||
|
free(name);
|
||||||
|
*card_index = index;
|
||||||
|
snprintf(opcmdev, sizeof(opcmdev), "hw:%i,0", index);
|
||||||
|
snprintf(ipcmdev, sizeof(ipcmdev), "hw:%i,1", index);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
free(name);
|
||||||
|
ALSA_CALL(snd_card_next(&index) < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CHECK_MSG(0, CARD_NAME" card not found");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setup_params(snd_pcm_t *pcm, int *bufsize) {
|
||||||
|
snd_pcm_hw_params_t *hw;
|
||||||
|
|
||||||
|
*bufsize = snd_pcm_format_size(FORMAT, PERIOD_SIZE) * CHANNELS;
|
||||||
|
|
||||||
|
snd_pcm_hw_params_alloca(&hw);
|
||||||
|
ALSA_CALL(snd_pcm_hw_params_any(pcm, hw));
|
||||||
|
ALSA_CALL(snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED));
|
||||||
|
ALSA_CALL(snd_pcm_hw_params_set_format(pcm, hw, FORMAT));
|
||||||
|
ALSA_CALL(snd_pcm_hw_params_set_channels(pcm, hw, CHANNELS));
|
||||||
|
ALSA_CALL(snd_pcm_hw_params_set_rate(pcm, hw, RATE, 0));
|
||||||
|
ALSA_CALL(snd_pcm_hw_params_set_period_size(pcm, hw, PERIOD_SIZE, 0));
|
||||||
|
ALSA_CALL(snd_pcm_hw_params_set_buffer_size(pcm, hw, *bufsize));
|
||||||
|
ALSA_CALL(snd_pcm_hw_params(pcm, hw));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_pass_bad_pointer_to_hw_params(void) {
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_hw_params(opcm, (snd_pcm_hw_params_t *) 1));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_set_hw_param_access_to_invalid_value(void) {
|
||||||
|
snd_pcm_hw_params_t *hw;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
snd_pcm_hw_params_alloca(&hw);
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_hw_params_set_access(opcm, hw, SND_PCM_ACCESS_LAST + 1));
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_hw_params(opcm, hw));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_set_hw_param_format_to_invalid_value(void) {
|
||||||
|
snd_pcm_hw_params_t *hw;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
snd_pcm_hw_params_alloca(&hw);
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_hw_params_set_format(opcm, hw, SND_PCM_FORMAT_LAST + 1));
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_hw_params(opcm, hw));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_set_hw_params_correctly(void) {
|
||||||
|
int bufsize;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_free_device_when_it_is_used(void) {
|
||||||
|
char *obuf;
|
||||||
|
int bufsize;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_hw_free(opcm));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_play_sound_and_capture_it(void) {
|
||||||
|
char *obuf, *ibuf, val;
|
||||||
|
int i, n, bufsize;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&ipcm, ipcmdev, SND_PCM_STREAM_CAPTURE, 0));
|
||||||
|
SUB_CALL(setup_params(ipcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
ibuf = malloc(bufsize);
|
||||||
|
|
||||||
|
val = rand() % 0x100 - 0x80;
|
||||||
|
memset(obuf, val, bufsize);
|
||||||
|
for (n = 0; n < 10; n++) {
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
}
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE));
|
||||||
|
for (i = 0; i < bufsize; i++) {
|
||||||
|
TEST_CHECK(ibuf[i] == val);
|
||||||
|
if (TEST_FAILED()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ALSA_CALL(snd_pcm_drain(ipcm));
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
free(ibuf);
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(ipcm));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_play_drain(void) {
|
||||||
|
char *obuf, val;
|
||||||
|
int bufsize;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
val = rand() % 0x100 - 0x80;
|
||||||
|
memset(obuf, val, bufsize);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
ALSA_CALL(snd_pcm_drain(opcm));
|
||||||
|
ALSA_CALL_FAIL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_status(void) {
|
||||||
|
char *obuf, val;
|
||||||
|
int bufsize;
|
||||||
|
snd_pcm_status_t *status;
|
||||||
|
snd_pcm_sframes_t delay1, delay2;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
val = rand() % 0x100 - 0x80;
|
||||||
|
memset(obuf, val, bufsize);
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
snd_pcm_status_alloca(&status);
|
||||||
|
ALSA_CALL(snd_pcm_status(opcm, status));
|
||||||
|
delay1 = snd_pcm_status_get_delay(status);
|
||||||
|
ALSA_CALL(snd_pcm_delay(opcm, &delay2));
|
||||||
|
TEST_CHECK_MSG(delay1 >= delay2 && (delay1 - delay2) < 100, "Delay values are wrong");
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_drain(opcm));
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_reset(void) {
|
||||||
|
char *obuf, val;
|
||||||
|
int bufsize;
|
||||||
|
snd_pcm_sframes_t delay;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
val = rand() % 0x100 - 0x80;
|
||||||
|
memset(obuf, val, bufsize);
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_delay(opcm, &delay));
|
||||||
|
TEST_CHECK(delay > 0);
|
||||||
|
ALSA_CALL(snd_pcm_reset(opcm));
|
||||||
|
ALSA_CALL(snd_pcm_delay(opcm, &delay));
|
||||||
|
TEST_CHECK(delay == 0);
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_start(void) {
|
||||||
|
snd_pcm_sw_params_t *sw;
|
||||||
|
char *obuf, *ibuf, val;
|
||||||
|
int i, bufsize;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&ipcm, ipcmdev, SND_PCM_STREAM_CAPTURE, 0));
|
||||||
|
SUB_CALL(setup_params(ipcm, &bufsize));
|
||||||
|
|
||||||
|
snd_pcm_sw_params_alloca(&sw);
|
||||||
|
ALSA_CALL(snd_pcm_sw_params_current(opcm, sw));
|
||||||
|
ALSA_CALL(snd_pcm_sw_params_set_start_threshold(opcm, sw, PERIOD_SIZE + 1));
|
||||||
|
ALSA_CALL(snd_pcm_sw_params(opcm, sw));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
ibuf = malloc(bufsize);
|
||||||
|
|
||||||
|
val = rand() % 0x100 - 0x80;
|
||||||
|
memset(obuf, val, bufsize);
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE));
|
||||||
|
for (i = 0; i < bufsize; i++) {
|
||||||
|
TEST_CHECK(ibuf[i] == 0);
|
||||||
|
if (TEST_FAILED()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_start(opcm));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE));
|
||||||
|
for (i = bufsize - 16; i < bufsize; i++) {
|
||||||
|
TEST_CHECK(ibuf[i] == val);
|
||||||
|
if (TEST_FAILED()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(ipcm));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_pause(void) {
|
||||||
|
char *obuf, *ibuf, val;
|
||||||
|
int i, n, bufsize, vals;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&ipcm, ipcmdev, SND_PCM_STREAM_CAPTURE, 0));
|
||||||
|
SUB_CALL(setup_params(ipcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
ibuf = malloc(bufsize);
|
||||||
|
|
||||||
|
val = rand() % 0x100 - 0x80;
|
||||||
|
memset(obuf, val, bufsize);
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
ALSA_CALL(snd_pcm_pause(opcm, 1));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE));
|
||||||
|
for (i = bufsize - 16; i < bufsize; i++) {
|
||||||
|
TEST_CHECK(ibuf[i] == 0);
|
||||||
|
if (TEST_FAILED()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_pause(opcm, 0));
|
||||||
|
sleep(1);
|
||||||
|
|
||||||
|
vals = 0;
|
||||||
|
for (n = 0; n < 3; n++) {
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE));
|
||||||
|
for (i = 0; i < bufsize; i++) {
|
||||||
|
if (ibuf[i] == val) {
|
||||||
|
vals++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TEST_CHECK(vals > 256);
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(ipcm));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_rewind(void) {
|
||||||
|
char *obuf, *ibuf;
|
||||||
|
int i, bufsize, shift;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&ipcm, ipcmdev, SND_PCM_STREAM_CAPTURE, 0));
|
||||||
|
SUB_CALL(setup_params(ipcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
ibuf = malloc(bufsize);
|
||||||
|
|
||||||
|
for (i = 0; i < bufsize; i++) {
|
||||||
|
obuf[i] = i % 128;
|
||||||
|
}
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE / 2));
|
||||||
|
ALSA_CALL(snd_pcm_rewind(ipcm, 16));
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf + (bufsize / 2), PERIOD_SIZE / 2));
|
||||||
|
shift = snd_pcm_format_size(FORMAT, 1) * CHANNELS * 16;
|
||||||
|
TEST_CHECK(ibuf[bufsize / 2 - 1] - ibuf[bufsize / 2] == shift - 1);
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(ipcm));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_forward(void) {
|
||||||
|
char *obuf, *ibuf;
|
||||||
|
int i, bufsize, shift;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&ipcm, ipcmdev, SND_PCM_STREAM_CAPTURE, 0));
|
||||||
|
SUB_CALL(setup_params(ipcm, &bufsize));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
ibuf = malloc(bufsize);
|
||||||
|
|
||||||
|
for (i = 0; i < bufsize; i++) {
|
||||||
|
obuf[i] = i % 128;
|
||||||
|
}
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf, PERIOD_SIZE / 2));
|
||||||
|
ALSA_CALL(snd_pcm_forward(ipcm, 1));
|
||||||
|
ALSA_CALL(snd_pcm_readi(ipcm, ibuf + (bufsize / 2), PERIOD_SIZE / 2));
|
||||||
|
shift = snd_pcm_format_size(FORMAT, 1) * CHANNELS;
|
||||||
|
TEST_CHECK(ibuf[bufsize / 2] == shift);
|
||||||
|
for (i = bufsize - shift; i < bufsize; i++) {
|
||||||
|
TEST_CHECK(ibuf[i] == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(ipcm));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_link(void) {
|
||||||
|
char *obuf, val;
|
||||||
|
int bufsize;
|
||||||
|
snd_pcm_status_t *status;
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&opcm, opcmdev, SND_PCM_STREAM_PLAYBACK, 0));
|
||||||
|
SUB_CALL(setup_params(opcm, &bufsize));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_open(&ipcm, ipcmdev, SND_PCM_STREAM_CAPTURE, 0));
|
||||||
|
SUB_CALL(setup_params(ipcm, &bufsize));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_link(ipcm, opcm));
|
||||||
|
|
||||||
|
obuf = malloc(bufsize);
|
||||||
|
|
||||||
|
val = rand() % 0x100 - 0x80;
|
||||||
|
memset(obuf, val, bufsize);
|
||||||
|
ALSA_CALL(snd_pcm_writei(opcm, obuf, PERIOD_SIZE));
|
||||||
|
|
||||||
|
snd_pcm_status_alloca(&status);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_pause(opcm, 1));
|
||||||
|
ALSA_CALL(snd_pcm_status(ipcm, status));
|
||||||
|
TEST_CHECK(snd_pcm_status_get_state(status) == SND_PCM_STATE_PAUSED);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_pause(opcm, 0));
|
||||||
|
ALSA_CALL(snd_pcm_status(ipcm, status));
|
||||||
|
TEST_CHECK(snd_pcm_status_get_state(status) == SND_PCM_STATE_RUNNING);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_unlink(ipcm));
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_pause(opcm, 1));
|
||||||
|
ALSA_CALL(snd_pcm_status(ipcm, status));
|
||||||
|
TEST_CHECK(snd_pcm_status_get_state(status) == SND_PCM_STATE_RUNNING);
|
||||||
|
|
||||||
|
free(obuf);
|
||||||
|
|
||||||
|
ALSA_CALL(snd_pcm_close(ipcm));
|
||||||
|
ALSA_CALL(snd_pcm_close(opcm));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
srand(time(0));
|
||||||
|
TEST_CALL(find_card(&card_index));
|
||||||
|
TEST_CALL(test_pass_bad_pointer_to_hw_params());
|
||||||
|
TEST_CALL(test_set_hw_param_access_to_invalid_value());
|
||||||
|
TEST_CALL(test_set_hw_param_format_to_invalid_value());
|
||||||
|
TEST_CALL(test_set_hw_params_correctly());
|
||||||
|
TEST_CALL(test_free_device_when_it_is_used());
|
||||||
|
TEST_CALL(test_play_sound_and_capture_it());
|
||||||
|
TEST_CALL(test_play_drain());
|
||||||
|
TEST_CALL(test_status());
|
||||||
|
TEST_CALL(test_reset());
|
||||||
|
TEST_CALL(test_start());
|
||||||
|
TEST_CALL(test_pause());
|
||||||
|
TEST_CALL(test_rewind());
|
||||||
|
TEST_CALL(test_forward());
|
||||||
|
TEST_CALL(test_link());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
63
test/features/test.h
Normal file
63
test/features/test.h
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
#ifndef TEST_H_INCLUDED
|
||||||
|
#define TEST_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
|
||||||
|
/* XXX this variable definition does not belong in a header file */
|
||||||
|
static int any_test_failed = 0;
|
||||||
|
|
||||||
|
#define TEST_CHECK(cond) do \
|
||||||
|
if (!(cond)) { \
|
||||||
|
fprintf(stderr, "%s:%d: test failed: %s\n", __FILE__, __LINE__, #cond); \
|
||||||
|
any_test_failed = 1; \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#define TEST_CHECK_MSG(cond, msg) do \
|
||||||
|
if (!(cond)) { \
|
||||||
|
fprintf(stderr, "%s:%d: test failed: %s\n", __FILE__, __LINE__, msg); \
|
||||||
|
any_test_failed = 1; \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#define ALSA_CHECK(fn) ({ \
|
||||||
|
int err = fn; \
|
||||||
|
if (err < 0) { \
|
||||||
|
fprintf(stderr, "%s:%d: ALSA function call failed (%s): %s\n", \
|
||||||
|
__FILE__, __LINE__, snd_strerror(err), #fn); \
|
||||||
|
any_test_failed = 1; \
|
||||||
|
} \
|
||||||
|
err; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define ALSA_CHECK_FAIL(fn) ({ \
|
||||||
|
int err = fn; \
|
||||||
|
if (err >= 0) { \
|
||||||
|
fprintf(stderr, "%s:%d: ALSA function call succeeded, but should fail (%s): %s\n", \
|
||||||
|
__FILE__, __LINE__, snd_strerror(err), #fn); \
|
||||||
|
any_test_failed = 1; \
|
||||||
|
} \
|
||||||
|
0; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define SUB_CALL(fn) do \
|
||||||
|
if (fn < 0) { \
|
||||||
|
return -1; \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#define ALSA_CALL(fn) SUB_CALL(ALSA_CHECK(fn))
|
||||||
|
|
||||||
|
#define ALSA_CALL_FAIL(fn) SUB_CALL(ALSA_CHECK_FAIL(fn))
|
||||||
|
|
||||||
|
#define TEST_FAILED() any_test_failed
|
||||||
|
|
||||||
|
#define TEST_CALL(fn) do { \
|
||||||
|
fn; \
|
||||||
|
if (TEST_FAILED()) { \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Add table
Add a link
Reference in a new issue