Programming question: fcntl(...,O_ASYNC) on device?
Andrew Reilly
andrew-freebsd at areilly.bpc-users.org
Thu May 27 15:05:16 PDT 2004
Hi, oh gurus,
I'm venturing into a realm of Unix programming that I had
previously been able to avoid: asynchronous event processing,
with or without threads.
Can anyone suggest why the following test-case program always
produces:
$ ./test-case
test-case: can't set O_ASYNC on device: Invalid argument
?
For reference to details, my system is 4-STABLE about a week
old, and the device in question is a Midiman1010 sound card with
the 4Front (OSS) driver. (FreeBSD's native pcm device doesn't
support this card.)
What I'm trying to achieve is the Unix equivalent of a DSP-style
IO interrupt for audio processing. I want the main body of the
code to be able to go on and do UI things without sitting and
waiting at the inevitable read(....,fd), but I also want processing
of the input data to proceed immediately that data is available,
irrespective of what the UI code is doing (so just O_NONBLOCK
isn't what I'm after). The code doesn't work if the O_ASYNC
argument to fcntl is O_NONBLOCK|O_ASYNC either. Any clues?
Thanks for any suggestions.
----snip-----
/* standard OSS includes */
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/soundcard.h>
#include <err.h>
#include <signal.h>
#define BUF_SIZE 4096
int fd;
unsigned char buf[BUF_SIZE];
void
got_data(int sig)
{
/* foo: do something with buf[] */
if (-1 == read(fd, buf, BUF_SIZE)) /* initiate next read */
err(1, "can't read from device");
}
int
main(int argc, char **argv)
{
signal(SIGIO, got_data);
fd=open("/dev/dsp6", O_RDONLY);
if (-1 == fd) err(1, "can't open device");
if (-1 == fcntl(fd, F_SETFL, O_ASYNC))
err(1, "can't set O_ASYNC on device");
if (-1 == read(fd, buf, BUF_SIZE)) /* initiate next read */
err(1, "can't read from device");
for (;;) { /* UI */ }
return 0;
}
----un-snip------
--
Andrew
More information about the freebsd-questions
mailing list