Date: Mon, 22 Dec 1997 14:05:42 -0600 (CST) From: Jim Lowe <james@miller.cs.uwm.edu> To: hasty@rah.star-gate.com, luigi@labinfo.iet.unipi.it Cc: multimedia@FreeBSD.ORG, steve@visint.co.uk Subject: Re: precise soundcard tuning ? Message-ID: <199712222005.OAA23623@miller.cs.uwm.edu>
next in thread | raw e-mail | index | archive | help
> From: Luigi Rizzo <luigi@labinfo.iet.unipi.it>
> Subject: Re: precise soundcard tuning ?
> To: hasty@rah.star-gate.com (Amancio Hasty)
>
> While i was developing a delay compensation mechanism for my
> telephone app, I was printing the difference between the expected
> arrival time of data packets (based on the RTP timestamp which in
> turn is based on the card sample clock) and the actual arrival time
> (computed using the cpu clock).
>
> It took some minutes to realize that the drift of about 8 samples/s
> was not a bug in my code but rather the clock drift!
>
Try running this little program. Depending on the buffer size and
card type you can get some interesting results.
-Jim
--------------------------
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/file.h>
#include <errno.h>
#include <machine/soundcard.h>
/* #define BROKEN_SELECT /* */
char *dev="/dev/dsp0";
int blocksize = 160;
main(int ac, char **av)
{
struct timeval tv, start;
int fd;
fd_set rfd;
int cc;
int i;
int freq;
double u;
if(ac>1) {
freq = atoi(av[1]);
} else
freq = 8000;
if((fd=open(dev, O_RDONLY)) < 0) {
perror("open failed\n");
exit(-1);
}
if(ioctl(fd, SNDCTL_DSP_SETBLKSIZE, &blocksize) < 0) {
printf("Setting blocksize failed: %s\n", strerror(errno));
}
if(ioctl(fd, SNDCTL_DSP_SPEED, &freq) < 0) {
printf("Setting speed failed: %s\n", strerror(errno));
}
#ifdef BROKEN_SELECT
read(fd, dev, 1);
#endif
gettimeofday(&start, 0);
cc = 0;
i = 0;
FD_ZERO(&rfd);
while (1) {
int n;
char buf[blocksize];
FD_SET(fd, &rfd);
select(fd+1, &rfd, 0, 0, 0);
n = read(fd, buf, blocksize);
if (n < 0) {
perror("read");
exit(1);
}
if(n!=blocksize) printf("read %d, wanted blocksize\n", n);
cc += n;
if (++i >= 50) {
i = 0;
gettimeofday(&tv, 0);
u = tv.tv_sec - start.tv_sec;
u += 1e-6 * (tv.tv_usec - start.tv_usec);
printf("%d %lg %lg\n", cc, u,
(double)cc / u);
fflush(stdout);
}
}
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712222005.OAA23623>
