diff options
author | Franc[e]sco | 2020-10-11 23:17:19 +0200 |
---|---|---|
committer | Franc[e]sco | 2020-10-11 23:34:32 +0200 |
commit | 484001f2d17ebdcf3d66e2e07f912d75e95eb7a5 (patch) | |
tree | 545df89934b0b52b9407944b675ba61cc8fadfee | |
download | aur-484001f2d17ebdcf3d66e2e07f912d75e95eb7a5.tar.gz |
first commit
-rw-r--r-- | .SRCINFO | 118 | ||||
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | 0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch | 54 | ||||
-rw-r--r-- | 0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch | 60 | ||||
-rw-r--r-- | 0003-ui-Change-refresh-interval-to-60fps.patch | 25 | ||||
-rw-r--r-- | 65-kvm.rules | 1 | ||||
-rw-r--r-- | PKGBUILD | 223 | ||||
-rw-r--r-- | qemu-ga.service | 9 | ||||
-rw-r--r-- | qemu.install | 8 |
9 files changed, 501 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..e9547a6fb011 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,118 @@ +pkgbase = qemu-templeos + pkgdesc = QEMU with better pc speaker audio for TempleOS + pkgver = 5.1.0 + pkgrel = 1 + url = https://wiki.qemu.org/ + arch = x86_64 + license = GPL2 + license = LGPL2.1 + makedepends = spice-protocol + makedepends = python + makedepends = ceph + makedepends = libiscsi + makedepends = glusterfs + makedepends = python-sphinx + makedepends = xfsprogs + depends = virglrenderer + depends = sdl2 + depends = vte3 + depends = libpulse + depends = libjack.so + depends = brltty + depends = seabios + depends = gnutls + depends = libpng + depends = libaio + depends = numactl + depends = libnfs + depends = lzo + depends = snappy + depends = curl + depends = vde2 + depends = libcap-ng + depends = spice + depends = libcacard + depends = usbredir + depends = libslirp + depends = libssh + depends = zstd + depends = liburing + provides = qemu + provides = qemu-headless + provides = qemu-arch-extra + provides = qemu-headless-arch-extra + provides = qemu-block-iscsi + provides = qemu-block-rbd + provides = qemu-block-gluster + provides = qemu-guest-agent + source = https://download.qemu.org/qemu-5.1.0.tar.xz + source = https://download.qemu.org/qemu-5.1.0.tar.xz.sig + source = qemu-ga.service + source = 65-kvm.rules + validpgpkeys = CEACC9E15534EBABB82D3FA03353C9CEF108B584 + sha512sums = e213edb71d93d5167ddce7546220ecb7b52a7778586a4f476f65bd1e510c9cfc6d1876238a7b501d9cc3fd31cc2ae4b7fb9e753bc3f12cc17cd16dfce2a96ba3 + sha512sums = SKIP + sha512sums = 269c0f0bacbd06a3d817fde02dce26c99d9f55c9e3b74bb710bd7e5cdde7a66b904d2eb794c8a605bf9305e4e3dee261a6e7d4ec9d9134144754914039f176e4 + sha512sums = bdf05f99407491e27a03aaf845b7cc8acfa2e0e59968236f10ffc905e5e3d5e8569df496fd71c887da2b5b8d1902494520c7da2d3a8258f7fd93a881dd610c99 + +pkgname = qemu-templeos + optdepends = qemu-arch-extra-templeos: extra architectures support + provides = qemu-headless + conflicts = qemu-headless + replaces = qemu-kvm + +pkgname = qemu-headless-templeos + pkgdesc = QEMU without GUI + depends = seabios + depends = gnutls + depends = libpng + depends = libaio + depends = numactl + depends = libnfs + depends = lzo + depends = snappy + depends = curl + depends = vde2 + depends = libcap-ng + depends = spice + depends = libcacard + depends = usbredir + depends = libslirp + depends = libssh + depends = zstd + depends = liburing + optdepends = qemu-headless-arch-extra-templeos: extra architectures support + +pkgname = qemu-arch-extra-templeos + pkgdesc = QEMU for foreign architectures + depends = qemu + provides = qemu-headless-arch-extra + conflicts = qemu-headless-arch-extra + options = !strip + +pkgname = qemu-headless-arch-extra-templeos + pkgdesc = QEMU without GUI, for foreign architectures + depends = qemu-headless + options = !strip + +pkgname = qemu-block-iscsi-templeos + pkgdesc = QEMU iSCSI block module + depends = glib2 + depends = libiscsi + +pkgname = qemu-block-rbd-templeos + pkgdesc = QEMU RBD block module + depends = glib2 + depends = ceph-libs + +pkgname = qemu-block-gluster-templeos + pkgdesc = QEMU GlusterFS block module + depends = glib2 + depends = glusterfs + +pkgname = qemu-guest-agent-templeos + pkgdesc = QEMU Guest Agent + depends = gcc-libs + depends = glib2 + depends = libudev.so + diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..68eba2849535 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.tar.zst +/pkg +/src diff --git a/0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch b/0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch new file mode 100644 index 000000000000..ca939aab35a9 --- /dev/null +++ b/0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p.patch @@ -0,0 +1,54 @@ +From 0ddb31675a8ba2fef40340034b0371b7fb63a8b9 Mon Sep 17 00:00:00 2001 +From: "Franc[e]sco" <lolisamurai@tfwno.gf> +Date: Sun, 11 Oct 2020 15:25:28 +0200 +Subject: [PATCH 1/2] hw/audio/pcspk: Use a semicircle wave rather than a pure + square wave + +--- + hw/audio/pcspk.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c +index ea539e7605..1545b3c90a 100644 +--- a/hw/audio/pcspk.c ++++ b/hw/audio/pcspk.c +@@ -23,6 +23,7 @@ + */ + + #include "qemu/osdep.h" ++#include <math.h> + #include "hw/isa/isa.h" + #include "hw/audio/soundhw.h" + #include "audio/audio.h" +@@ -61,18 +62,26 @@ typedef struct { + static const char *s_spk = "pcspk"; + static PCSpkState *pcspk_state; + ++/* a lot less harsh on the ears than a perfect square wave, while still sounding square-ish */ ++static inline float circle_wave(float x) ++{ ++ int s = (x > 0) - (x < 0); ++ float t = (x * 2 - (s - 1) / 2) * 2 - 1; ++ return -s * sqrtf(1 - t * t); ++} ++ + static inline void generate_samples(PCSpkState *s) + { + unsigned int i; + + if (s->pit_count) { + const uint32_t m = PCSPK_SAMPLE_RATE * s->pit_count; +- const uint32_t n = ((uint64_t)PIT_FREQ << 32) / m; ++ const float n = (float)PIT_FREQ / m; + + /* multiple of wavelength for gapless looping */ + s->samples = (QEMU_ALIGN_DOWN(PCSPK_BUF_LEN * PIT_FREQ, m) / (PIT_FREQ >> 1) + 1) >> 1; + for (i = 0; i < s->samples; ++i) +- s->sample_buf[i] = (64 & (n * i >> 25)) - 32; ++ s->sample_buf[i] = 128 + circle_wave(fmod(n * i, 1.f) - .5f) * 16; + } else { + s->samples = PCSPK_BUF_LEN; + for (i = 0; i < PCSPK_BUF_LEN; ++i) +-- +2.28.0 + diff --git a/0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch b/0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch new file mode 100644 index 000000000000..e2ab0a3b981b --- /dev/null +++ b/0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re.patch @@ -0,0 +1,60 @@ +From 2c26487bd00d6b834a3f204d60b425b2564b14f8 Mon Sep 17 00:00:00 2001 +From: "Franc[e]sco" <lolisamurai@tfwno.gf> +Date: Sun, 11 Oct 2020 21:49:40 +0200 +Subject: [PATCH 2/2] hw/audio/pcspk: Insert small pauses to distinguish + repeated notes + +--- + hw/audio/pcspk.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c +index 1545b3c90a..2a672e77d5 100644 +--- a/hw/audio/pcspk.c ++++ b/hw/audio/pcspk.c +@@ -52,6 +52,7 @@ typedef struct { + SWVoiceOut *voice; + void *pit; + unsigned int pit_count; ++ unsigned int last_pit_count; + unsigned int samples; + unsigned int play_pos; + uint8_t data_on; +@@ -74,7 +75,9 @@ static inline void generate_samples(PCSpkState *s) + { + unsigned int i; + +- if (s->pit_count) { ++ /* add 1 tick of silence when frequency changes or speaker gets reset to distinguish ++ * repeated frequencies */ ++ if (s->pit_count && s->last_pit_count == s->pit_count) { + const uint32_t m = PCSPK_SAMPLE_RATE * s->pit_count; + const float n = (float)PIT_FREQ / m; + +@@ -106,7 +109,9 @@ static void pcspk_callback(void *opaque, int free) + if (n < PCSPK_MIN_COUNT) + n = 0; + +- if (s->pit_count != n) { ++ if (s->pit_count != n || s->last_pit_count != s->pit_count) { ++ /* generate twice for each freq change. first the pause, then the steady frequence */ ++ s->last_pit_count = s->pit_count; + s->pit_count = n; + s->play_pos = 0; + generate_samples(s); +@@ -165,8 +170,11 @@ static void pcspk_io_write(void *opaque, hwaddr addr, uint64_t val, + s->data_on = (val >> 1) & 1; + pit_set_gate(s->pit, 2, gate); + if (s->voice) { +- if (gate) /* restart */ ++ if (gate) { /* restart */ + s->play_pos = 0; ++ s->last_pit_count = 0; ++ s->pit_count = 0; ++ } + AUD_set_active_out(s->voice, gate & s->data_on); + } + } +-- +2.28.0 + diff --git a/0003-ui-Change-refresh-interval-to-60fps.patch b/0003-ui-Change-refresh-interval-to-60fps.patch new file mode 100644 index 000000000000..6fcfcb9513a6 --- /dev/null +++ b/0003-ui-Change-refresh-interval-to-60fps.patch @@ -0,0 +1,25 @@ +From cc12b35e77953a196479237b00f2d44707481d28 Mon Sep 17 00:00:00 2001 +From: "Franc[e]sco" <lolisamurai@tfwno.gf> +Date: Sun, 11 Oct 2020 23:30:20 +0200 +Subject: [PATCH] ui: Change refresh intervcal to 60fps + +--- + include/ui/console.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/ui/console.h b/include/ui/console.h +index f35b4fc082..fb5485d38b 100644 +--- a/include/ui/console.h ++++ b/include/ui/console.h +@@ -26,7 +26,7 @@ + #define QEMU_CAPS_LOCK_LED (1 << 2) + + /* in ms */ +-#define GUI_REFRESH_INTERVAL_DEFAULT 30 ++#define GUI_REFRESH_INTERVAL_DEFAULT 16 + #define GUI_REFRESH_INTERVAL_IDLE 3000 + + /* Color number is match to standard vga palette */ +-- +2.28.0 + diff --git a/65-kvm.rules b/65-kvm.rules new file mode 100644 index 000000000000..fbb0ebb69c9e --- /dev/null +++ b/65-kvm.rules @@ -0,0 +1 @@ +KERNEL=="vhost-net", GROUP="kvm", MODE="0660", TAG+="uaccess", OPTIONS+="static_node=vhost-net" diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..4dcca6d65f2d --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,223 @@ +# Maintainer: Franc[e]sco <lolisamurai@tfwno.gf> + +pkgbase=qemu-templeos +pkgname=(qemu-templeos qemu-headless-templeos qemu-arch-extra-templeos + qemu-headless-arch-extra-templeos qemu-block-{iscsi,rbd,gluster}-templeos + qemu-guest-agent-templeos) +provides=(qemu qemu-headless qemu-arch-extra qemu-headless-arch-extra + qemu-block-{iscsi,rbd,gluster} qemu-guest-agent) +pkgdesc="QEMU with better pc speaker audio for TempleOS" +pkgver=5.1.0 +pkgrel=1 +arch=(x86_64) +license=(GPL2 LGPL2.1) +url="https://wiki.qemu.org/" +_headlessdeps=(seabios gnutls libpng libaio numactl libnfs + lzo snappy curl vde2 libcap-ng spice libcacard usbredir libslirp + libssh zstd liburing) +depends=(virglrenderer sdl2 vte3 libpulse libjack.so brltty "${_headlessdeps[@]}") +makedepends=(spice-protocol python ceph libiscsi glusterfs python-sphinx xfsprogs) +source=(https://download.qemu.org/qemu-$pkgver.tar.xz{,.sig} + qemu-ga.service + 65-kvm.rules) +sha512sums=('e213edb71d93d5167ddce7546220ecb7b52a7778586a4f476f65bd1e510c9cfc6d1876238a7b501d9cc3fd31cc2ae4b7fb9e753bc3f12cc17cd16dfce2a96ba3' + 'SKIP' + '269c0f0bacbd06a3d817fde02dce26c99d9f55c9e3b74bb710bd7e5cdde7a66b904d2eb794c8a605bf9305e4e3dee261a6e7d4ec9d9134144754914039f176e4' + 'bdf05f99407491e27a03aaf845b7cc8acfa2e0e59968236f10ffc905e5e3d5e8569df496fd71c887da2b5b8d1902494520c7da2d3a8258f7fd93a881dd610c99') +validpgpkeys=('CEACC9E15534EBABB82D3FA03353C9CEF108B584') +patches="0001-hw-audio-pcspk-Use-a-semicircle-wave-rather-than-a-p + 0002-hw-audio-pcspk-Insert-small-pauses-to-distinguish-re + 0003-ui-Change-refresh-interval-to-60fps" + +case $CARCH in + i?86) _corearch=i386 ;; + x86_64) _corearch=x86_64 ;; +esac + +prepare() { + mkdir -p build-{full,headless} + mkdir -p extra-arch-{full,headless}/usr/{bin,share/qemu} + cd "$pkgname-$pkgver" + for p in $patches; do + patch --forward --strip=1 --input="${startdir}/$p.patch" + done +} + +build() { + _build full \ + --audio-drv-list="pa alsa sdl jack" + + _build headless \ + --audio-drv-list= \ + --disable-sdl \ + --disable-gtk \ + --disable-vte \ + --disable-brlapi \ + --disable-opengl \ + --disable-virglrenderer +} + +_build() ( + cd build-$1 + + ../${pkgname}-${pkgver}/configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --libexecdir=/usr/lib/qemu \ + --extra-ldflags="$LDFLAGS" \ + --smbd=/usr/bin/smbd \ + --enable-modules \ + --enable-sdl \ + --enable-slirp=system \ + --enable-xfsctl \ + "${@:2}" + + make +) + +package_qemu-templeos() { + optdepends=('qemu-arch-extra-templeos: extra architectures support') + provides=(qemu-headless) + conflicts=(qemu-headless) + replaces=(qemu-kvm) + + _package full +} + +package_qemu-headless-templeos() { + pkgdesc="QEMU without GUI" + depends=("${_headlessdeps[@]}") + optdepends=('qemu-headless-arch-extra-templeos: extra architectures support') + + _package headless +} + +_package() { + optdepends+=('samba: SMB/CIFS server support' + 'qemu-block-iscsi: iSCSI block support' + 'qemu-block-rbd: RBD block support' + 'qemu-block-gluster: glusterfs block support') + install=qemu.install + options=(!strip !emptydirs) + + make -C build-$1 DESTDIR="$pkgdir" install "${@:2}" + + # systemd stuff + install -Dm644 65-kvm.rules "$pkgdir/usr/lib/udev/rules.d/65-kvm.rules" + + # remove conflicting /var/run directory + cd "$pkgdir" + rm -r var + + cd usr/lib + + # bridge_helper needs suid + # https://bugs.archlinux.org/task/32565 + chmod u+s qemu/qemu-bridge-helper + + # remove split block modules + rm qemu/block-{iscsi,rbd,gluster}.so + + cd ../bin + + # remove extra arch + for _bin in qemu-*; do + [[ -f $_bin ]] || continue + + case ${_bin#qemu-} in + # guest agent + ga) rm "$_bin"; continue ;; + + # tools + edid|img|io|keymap|nbd|pr-helper|storage-daemon) continue ;; + + # core emu + system-${_corearch}) continue ;; + esac + + mv "$_bin" "$srcdir/extra-arch-$1/usr/bin" + done + + cd ../share/qemu + for _blob in *; do + [[ -f $_blob ]] || continue + + case $_blob in + # provided by seabios package + bios.bin|bios-256k.bin|vgabios-cirrus.bin|vgabios-qxl.bin|\ + vgabios-stdvga.bin|vgabios-vmware.bin|vgabios-virtio.bin|vgabios-bochs-display.bin|\ + vgabios-ramfb.bin) rm "$_blob"; continue ;; + + # provided by edk2-ovmf package + edk2-*) rm "$_blob"; continue ;; + + # iPXE ROMs + efi-*|pxe-*) continue ;; + + # core blobs + bios-microvm.bin|kvmvapic.bin|linuxboot*|multiboot.bin|sgabios.bin|vgabios*) continue ;; + + # Trace events definitions + trace-events*) continue ;; + esac + + mv "$_blob" "$srcdir/extra-arch-$1/usr/share/qemu" + done + + # provided by edk2-ovmf package + rm -r firmware + + cd .. + if [ "$1" = headless ]; then rm -r {applications,icons}; fi +} + +package_qemu-arch-extra-templeos() { + pkgdesc="QEMU for foreign architectures" + depends=(qemu) + provides=(qemu-headless-arch-extra) + conflicts=(qemu-headless-arch-extra) + options=(!strip) + + mv extra-arch-full/usr "$pkgdir" +} + +package_qemu-headless-arch-extra-templeos() { + pkgdesc="QEMU without GUI, for foreign architectures" + depends=(qemu-headless) + options=(!strip) + + mv extra-arch-headless/usr "$pkgdir" +} + +package_qemu-block-iscsi-templeos() { + pkgdesc="QEMU iSCSI block module" + depends=(glib2 libiscsi) + + install -D build-full/block-iscsi.so "$pkgdir/usr/lib/qemu/block-iscsi.so" +} + +package_qemu-block-rbd-templeos() { + pkgdesc="QEMU RBD block module" + depends=(glib2 ceph-libs) + + install -D build-full/block-rbd.so "$pkgdir/usr/lib/qemu/block-rbd.so" +} + +package_qemu-block-gluster-templeos() { + pkgdesc="QEMU GlusterFS block module" + depends=(glib2 glusterfs) + + install -D build-full/block-gluster.so "$pkgdir/usr/lib/qemu/block-gluster.so" +} + +package_qemu-guest-agent-templeos() { + pkgdesc="QEMU Guest Agent" + depends=(gcc-libs glib2 libudev.so) + + install -D build-full/qemu-ga "$pkgdir/usr/bin/qemu-ga" + install -Dm644 qemu-ga.service "$pkgdir/usr/lib/systemd/system/qemu-ga.service" + install -Dm755 "$srcdir/qemu-$pkgver/scripts/qemu-guest-agent/fsfreeze-hook" "$pkgdir/etc/qemu/fsfreeze-hook" +} + +# vim:set ts=2 sw=2 et: diff --git a/qemu-ga.service b/qemu-ga.service new file mode 100644 index 000000000000..abbb6ab9dfe2 --- /dev/null +++ b/qemu-ga.service @@ -0,0 +1,9 @@ +[Unit] +Description=QEMU Guest Agent +ConditionPathExists=/dev/virtio-ports/org.qemu.guest_agent.0 + +[Service] +ExecStart=/usr/bin/qemu-ga + +[Install] +WantedBy=multi-user.target diff --git a/qemu.install b/qemu.install new file mode 100644 index 000000000000..d90269ecfecd --- /dev/null +++ b/qemu.install @@ -0,0 +1,8 @@ +# Arg 1: the new package version +post_install() { + # trigger events on modules files when already loaded + for _f in /sys/devices/virtual/misc/vhost-net; do + [[ -e "$_f" ]] && udevadm trigger "$_f" + done + : +} |