Annotation of nono/host/sounddriver_netbsd.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2025 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: //
        !             8: // サウンドの NetBSD audio(4) ドライバ
        !             9: //
        !            10: 
        !            11: #include "sounddriver_netbsd.h"
        !            12: #include "config.h"
        !            13: #include "mainapp.h"
        !            14: #include "sound.h"
        !            15: #include <fcntl.h>
        !            16: #include <unistd.h>
        !            17: #include <sys/audioio.h>
        !            18: #include <sys/ioctl.h>
        !            19: 
        !            20: // コンストラクタ
        !            21: SoundDriverNetBSD::SoundDriverNetBSD(HostDevice *hostdev_)
        !            22:        : inherited(hostdev_, "netbsd")
        !            23: {
        !            24: }
        !            25: 
        !            26: // デストラクタ
        !            27: SoundDriverNetBSD::~SoundDriverNetBSD()
        !            28: {
        !            29:        fd.Close();
        !            30: }
        !            31: 
        !            32: bool
        !            33: SoundDriverNetBSD::InitDriver(bool startup)
        !            34: {
        !            35:        if (inherited::InitDriver(startup) == false) {
        !            36:                return false;
        !            37:        }
        !            38: 
        !            39:        // NetBSD audio(4) はオープンしたまま保持してても困らないので
        !            40:        // 生存期間中ずっとオープンしておく。
        !            41: 
        !            42:        const ConfigItem& item = gConfig->Find("hostsound-netbsd-device");
        !            43:        device = item.AsString();
        !            44: 
        !            45:        if (device.empty()) {
        !            46:                item.Err();
        !            47:                return false;
        !            48:        }
        !            49: 
        !            50:        // device は '/'(スラッシュ) から始まっていればフルパス。
        !            51:        // そうでなければ "/dev/" を接頭する。
        !            52:        if (device[0] != '/') {
        !            53:                device = "/dev/" + device;
        !            54:        }
        !            55: 
        !            56:        fd = open(device.c_str(), O_WRONLY);
        !            57:        if (fd < 0) {
        !            58:                warn("%s: open %s failed", __method__, device.c_str());
        !            59:                return false;
        !            60:        }
        !            61: 
        !            62:        struct audio_info info;
        !            63:        AUDIO_INITINFO(&info);
        !            64:        info.play.sample_rate = freq;
        !            65:        info.play.channels = Sound::NCHAN;
        !            66:        info.play.precision = 16;
        !            67:        info.play.encoding = AUDIO_ENCODING_SLINEAR;    // ホストエンディアン
        !            68:        if (ioctl(fd, AUDIO_SETINFO, &info) < 0) {
        !            69:                warn("%s: %s: AUDIO_SETINFO failed", __method__, device.c_str());
        !            70:                return false;
        !            71:        }
        !            72: 
        !            73:        return true;
        !            74: }
        !            75: 
        !            76: // ブロック書き出し
        !            77: void
        !            78: SoundDriverNetBSD::Write(const int16 *blk)
        !            79: {
        !            80:        size_t written = 0;
        !            81:        for (; written < blkbytes;) {
        !            82:                const uint8 *buf = (const uint8 *)blk;
        !            83:                auto r = write(fd, buf + written, blkbytes - written);
        !            84:                if (r < 0) {
        !            85:                        if (errno == EINTR) {
        !            86:                                continue;
        !            87:                        }
        !            88:                        warn("%s: write failed", __method__);
        !            89:                        return;
        !            90:                }
        !            91:                written += r;
        !            92:        }
        !            93: }
        !            94: 
        !            95: void
        !            96: SoundDriverNetBSD::MonitorUpdateMD(TextScreen& screen, int y)
        !            97: {
        !            98:        screen.Print(0, y, "Device path:      %s", device.c_str());
        !            99: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.