Update of /cvsroot/alsa/alsa-oss/test
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16120
Modified Files:
Makefile.am
Added Files:
osstest.c
Removed Files:
mmap_test.c
Log Message:
mmap_test -> osstest; recoding in progress
--- NEW FILE: osstest.c ---
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <getopt.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/soundcard.h>
#include <sys/time.h>
#include <oss-redir.h>
#define VERBOSE 1
//static char data[500000];
static int verbose;
static char *device = "/dev/dsp";
static int rate = 48000;
static int channels = 2;
static int omode = O_RDWR;
static int frag = 0xffff000c; /* Max # periods of 2^13=8k bytes */
static int fd;
static audio_buf_info ospace;
static audio_buf_info ispace;
static int bufsize;
static int fragsize;
static char *wbuf, *rbuf;
static void help(void)
{
printf(
"Usage: mmap_test [OPTION]...\n"
"-h,--help help\n"
"-D,--device playback device\n"
"-r,--rate stream rate in Hz\n"
"-c,--channels count of channels in stream\n"
"-f,--frequency sine wave frequency in Hz\n"
"-b,--buffer ring buffer size in us\n"
"-p,--period period size in us\n"
"-m,--method transfer method (read/write/duplex)\n"
"-v,--verbose show the PCM setup parameters\n"
"\n");
}
static void set_params(void)
{
int caps;
if (oss_pcm_ioctl(fd, SNDCTL_DSP_SPEED, &rate) < 0) {
perror("SNDCTL_DSP_SPEED\n");
exit(EXIT_FAILURE);
}
printf("Rate set to %d\n", rate);
if (oss_pcm_ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) < 0) {
perror("SNDCTL_DSP_CHANNELS\n");
exit(EXIT_FAILURE);
}
printf("Channels set to %d\n", channels);
if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETCAPS, &caps) < 0) {
perror("/dev/dsp");
fprintf(stderr, "Sorry but your sound driver is too old\n");
exit(EXIT_FAILURE);
}
if (!(caps & DSP_CAP_TRIGGER) ||
!(caps & DSP_CAP_MMAP))
{
fprintf(stderr, "Sorry but your soundcard can't do this\n");
exit(EXIT_FAILURE);
}
if (oss_pcm_ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frag) < 0)
perror("SNDCTL_DSP_SETFRAGMENT");
bufsize = fragsize = -1;
if (omode == O_RDWR || omode == O_WRONLY) {
if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETOSPACE, &ospace) < 0) {
perror("SNDCTL_DSP_GETOSPACE");
exit(EXIT_FAILURE);
}
bufsize = ospace.fragstotal * ospace.fragsize;
fragsize = ospace.fragsize;
printf("ospace.fragstotal = %i\n", ospace.fragstotal);
printf("ospace.fragsize = %i\n", ospace.fragsize);
printf("ospace.periods = %i\n", ospace.fragments);
printf("ospace.bytes = %i\n", ospace.bytes);
if ((wbuf=mmap(NULL, bufsize, PROT_WRITE, MAP_FILE|MAP_SHARED, fd,
0))==MAP_FAILED) {
perror("mmap (write)");
exit(-1);
}
printf("mmap (out) returned %p\n", wbuf);
}
if (omode == O_RDWR || omode == O_RDONLY) {
if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETISPACE, &ispace) < 0) {
perror("SNDCTL_DSP_GETISPACE");
if (omode == O_RDWR) {
omode = O_WRONLY;
fprintf(stderr, "Falling to write only mode\n");
} else {
exit(EXIT_FAILURE);
}
}
if (omode != O_WRONLY) {
if (bufsize < 0) {
bufsize = ispace.fragstotal * ispace.fragsize;
fragsize = ispace.fragsize;
}
printf("ispace.fragstotal = %i\n", ispace.fragstotal);
printf("ispace.fragsize = %i\n", ispace.fragsize);
printf("ispace.periods = %i\n", ispace.fragments);
printf("ispace.bytes = %i\n", ispace.bytes);
if ((rbuf=mmap(NULL, bufsize, PROT_READ, MAP_FILE|MAP_SHARED,
fd, 0))==MAP_FAILED) {
perror("mmap (read)");
exit(-1);
}
printf("mmap (in) returned %p\n", rbuf);
}
}
}
static void set_trigger(void)
{
int tmp;
if (oss_pcm_ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp) < 0) {
perror("SNDCTL_DSP_SETTRIGGER");
exit(EXIT_FAILURE);
}
printf("Trigger set to %08x\n", tmp);
if (omode == O_RDWR)
tmp = PCM_ENABLE_OUTPUT|PCM_ENABLE_INPUT;
else if (omode == O_RDONLY)
tmp = PCM_ENABLE_INPUT;
else if (omode == O_WRONLY)
tmp = PCM_ENABLE_OUTPUT;
if (oss_pcm_ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp) < 0) {
perror("SNDCTL_DSP_SETTRIGGER");
exit(EXIT_FAILURE);
}
printf("Trigger set to %08x\n", tmp);
}
int main(int argc, char *argv[])
{
int morehelp = 0;
int nfrag, idx;
struct timeval tim;
fd_set writeset, readset;
struct option long_option[] =
{
{"help", 0, NULL, 'h'},
{"device", 1, NULL, 'D'},
{"verbose", 1, NULL, 'v'},
{"omode", 1, NULL, 'M'},
{"rate", 1, NULL, 'r'},
{"channels", 1, NULL, 'c'},
{"frag", 1, NULL, 'F'},
{NULL, 0, NULL, 0},
};
morehelp = 0;
while (1) {
int c;
if ((c = getopt_long(argc, argv, "hD:M:r:c:F:v", long_option, NULL)) <
0)
break;
switch (c) {
case 'h':
morehelp++;
break;
case 'D':
device = strdup(optarg);
break;
case 'M':
if (!strcmp(optarg, "read"))
omode = O_RDONLY;
else if (!strcmp(optarg, "write"))
omode = O_WRONLY;
else
omode = O_RDWR;
break;
case 'r':
rate = atoi(optarg);
break;
case 'c':
channels = atoi(optarg);
break;
case 'F':
frag = atoi(optarg);
break;
case 'v':
verbose = 1;
break;
}
}
if (morehelp) {
help();
return 0;
}
if ((fd=oss_pcm_open(device, O_RDWR, 0))==-1) {
perror("/dev/dsp");
exit(-1);
}
set_params();
set_trigger();
nfrag = 0;
for (idx=0; idx<40; idx++) {
struct count_info count;
int res;
FD_ZERO(&writeset);
FD_SET(fd, &writeset);
tim.tv_sec = 10;
tim.tv_usec= 0;
res = select(fd+1, NULL, &writeset, NULL, &tim);
#ifdef VERBOSE
printf("Select returned: %03d\n", res);
fflush(stdout);
#endif
if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETOPTR, &count) < 0) {
perror("GETOPTR");
exit(EXIT_FAILURE);
}
nfrag += count.blocks;
#ifdef VERBOSE
printf("Total: %09d, Period: %03d, Ptr: %06d\n", count.bytes, nfrag,
count.ptr);
fflush(stdout);
#endif
}
close(fd);
exit(0);
}
Index: Makefile.am
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/test/Makefile.am,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Makefile.am 12 Feb 2004 17:16:07 -0000 1.2
+++ Makefile.am 17 Feb 2004 13:06:57 -0000 1.3
@@ -1,6 +1,6 @@
-check_PROGRAMS=mmap_test lmixer
+check_PROGRAMS=osstest lmixer
-mmap_test_LDADD=../oss-redir/libossredir.la
+osstest_LDADD=../oss-redir/libossredir.la
lmixer_LDADD=../oss-redir/libossredir.la
lmixer_SOURCES=lmixer.cc
--- mmap_test.c DELETED ---
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog