At Tue, 29 Jan 2019 16:06:40 +0900, Tetsuya Isaki wrote: > > looks good to me. Can you test recording? > > I will try it. (I need to setup)
I confirmed that GETISPACE at least looks correct with attached sample code (by watching and calulating it manually :) And I also confirmed that mplayer+pulseaudio on netbsd-8 worked even with the patch. (Although, I'm not sure why pulseaudio recording operation affects playback, too.) Anyway, I'll commit GETISPACE part. Thank you for comments. --- Tetsuya Isaki <[email protected] / [email protected]> #include <err.h> #include <fcntl.h> #include <stdio.h> #include <sys/ioctl.h> #include <sys/audioio.h> #include <soundcard.h> #include <unistd.h> int main(int ac, char *av[]) { struct audio_info ai; struct audio_buf_info bufinfo; int r; int afd = open("/dev/audio0", O_RDONLY); if (afd == -1) err(1, "open audio"); r = ioctl(afd, AUDIO_GETBUFINFO, &ai); if (r == -1) err(1, "AUDIO_GETBUFINFO"); printf("ai.record.buffer_size=%d\n", ai.record.buffer_size); printf("ai.blocksize=%d\n", ai.blocksize); printf("ai.hiwat=%d\n", ai.hiwat); char buf[3000]; // read and discard while (1) { r = read(afd, buf, sizeof(buf)); printf("read(%d bytes)\n", r); if (r != sizeof(buf)) err(1, "read"); r = ioctl(afd, AUDIO_GETBUFINFO, &ai); if (r == -1) err(1, "GETBUFINFO"); r = ioctl(afd, SNDCTL_DSP_GETISPACE, &bufinfo); if (r == -1) err(1, "GETISPACE"); printf("record.seek=%d : ", ai.record.seek); printf("fragments=%d fragstotal=%d fragsize=%d bytes=%d\n", bufinfo.fragments, bufinfo.fragstotal, bufinfo.fragsize, bufinfo.bytes); if (bufinfo.bytes < sizeof(buf)) { printf("sleep\n"); sleep(1); continue; } } /* NOTREACHED */ close(afd); return 0; }
