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;
}

Reply via email to