diff --git a/SCORE.md b/SCORE.md index c458fb124e..3f5923774c 100644 --- a/SCORE.md +++ b/SCORE.md @@ -16,7 +16,7 @@ As implemented in this monorepo through the direction of [@jeffrey](https://prom 355 built-in pieces (337 JS + 18 KidLisp), ~83 API endpoints.
-2810 registered handles, 265 user-published pieces, 4425 paintings, 16523 KidLisp programs, 18048 chat messages, 20 prints ordered.
+2810 registered handles, 265 user-published pieces, 4425 paintings, 16523 KidLisp programs, 18049 chat messages, 20 prints ordered.
*Last refreshed: Mar 10, 2026* diff --git a/fedac/native/bootloader/Makefile b/fedac/native/bootloader/Makefile new file mode 100644 index 0000000000..9a61a8675d --- /dev/null +++ b/fedac/native/bootloader/Makefile @@ -0,0 +1,36 @@ +# UEFI Splash Chainloader — gnu-efi based +ARCH = x86_64 +TARGET = splash.efi + +# gnu-efi paths +EFI_INC = /usr/include/efi +EFI_INCS = -I$(EFI_INC) -I$(EFI_INC)/$(ARCH) -I$(EFI_INC)/protocol +EFI_LIB = /usr/lib +EFI_CRT = $(EFI_LIB)/crt0-efi-$(ARCH).o +EFI_LDS = $(EFI_LIB)/elf_$(ARCH)_efi.lds + +CC = gcc +CFLAGS = -fno-stack-protector -fpic -fshort-wchar -mno-red-zone \ + -Wall -DGNU_EFI_USE_MS_ABI -DEFI_FUNCTION_WRAPPER $(EFI_INCS) +LDFLAGS = -nostdlib -znocombreloc -T $(EFI_LDS) -shared -Bsymbolic \ + -L$(EFI_LIB) $(EFI_CRT) +LIBS = -lefi -lgnuefi + +.PHONY: all clean + +all: $(TARGET) + +splash.o: splash.c font8x8.h + $(CC) $(CFLAGS) -c -o $@ $< + +splash.so: splash.o + ld $(LDFLAGS) $^ -o $@ $(LIBS) + +$(TARGET): splash.so + objcopy -j .text -j .sdata -j .data -j .dynamic \ + -j .dynsym -j .rel -j .rela -j .reloc \ + --target=efi-app-$(ARCH) $< $@ + @echo "Built: $@ ($$(wc -c < $@ | tr -d ' ') bytes)" + +clean: + rm -f splash.o splash.so $(TARGET) diff --git a/fedac/native/bootloader/font8x8.h b/fedac/native/bootloader/font8x8.h new file mode 100644 index 0000000000..125cf165c9 --- /dev/null +++ b/fedac/native/bootloader/font8x8.h @@ -0,0 +1,152 @@ +/** + * 8x8 monochrome bitmap fonts for rendering + * Author: Daniel Hepper + * + * License: Public Domain + * + * Based on: + * // Summary: font8x8.h + * // 8x8 monochrome bitmap fonts for rendering + * // + * // Author: + * // Marcel Sondaar + * // International Business Machines (public domain VGA fonts) + * // + * // License: + * // Public Domain + * + * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm + **/ + +// Constant: font8x8_basic +// Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin) +char font8x8_basic[128][8] = { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space) + { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) + { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") + { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) + { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) + { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) + { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) + { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') + { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() + { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) + { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) + { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) + { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) + { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) + { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) + { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) + { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) + { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) + { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) + { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) + { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) + { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) + { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) + { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (;) + { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) + { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) + { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F +}; diff --git a/fedac/native/bootloader/splash.c b/fedac/native/bootloader/splash.c new file mode 100644 index 0000000000..a89f00d4d5 --- /dev/null +++ b/fedac/native/bootloader/splash.c @@ -0,0 +1,163 @@ +// splash.c — UEFI chainloader that shows "Aesthetic.Computer" then boots the kernel +// Replaces the OEM (Lenovo) logo with a custom splash screen. +// Built with gnu-efi, output is splash.efi (copied as BOOTX64.EFI). +// The real kernel lives at \EFI\BOOT\KERNEL.EFI on the same partition. + +#include +#include + +#include "font8x8.h" + +#define KERNEL_PATH L"\\EFI\\BOOT\\KERNEL.EFI" + +// --- GOP helpers --- + +static EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL; +static UINT32 hres, vres, ppsl; +static UINT32 *fb; +static int pixel_is_rgb = 0; // 0 = BGR (default), 1 = RGB + +static EFI_STATUS init_gop(void) { + EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; + EFI_STATUS status = uefi_call_wrapper(BS->LocateProtocol, 3, + &gop_guid, NULL, (void **)&gop); + if (EFI_ERROR(status)) return status; + + hres = gop->Mode->Info->HorizontalResolution; + vres = gop->Mode->Info->VerticalResolution; + ppsl = gop->Mode->Info->PixelsPerScanLine; + fb = (UINT32 *)(UINTN)gop->Mode->FrameBufferBase; + + // Detect pixel format + if (gop->Mode->Info->PixelFormat == PixelRedGreenBlueReserved8BitPerColor) + pixel_is_rgb = 1; + // PixelBlueGreenRedReserved8BitPerColor = 0 (default) + // PixelBitMask: would need mask parsing, assume BGR for now + + return EFI_SUCCESS; +} + +// Pack RGB into framebuffer pixel (handles BGR vs RGB format) +static UINT32 pack_color(UINT8 r, UINT8 g, UINT8 b) { + if (pixel_is_rgb) + return ((UINT32)r) | ((UINT32)g << 8) | ((UINT32)b << 16); + else + return ((UINT32)b) | ((UINT32)g << 8) | ((UINT32)r << 16); +} + +static void fill_screen(UINT32 color) { + UINTN total = (UINTN)ppsl * vres; + for (UINTN i = 0; i < total; i++) + fb[i] = color; +} + +static void draw_pixel(UINT32 x, UINT32 y, UINT32 color) { + if (x < hres && y < vres) + fb[y * ppsl + x] = color; +} + +// Draw one 8x8 character scaled by `scale` +static void draw_char(unsigned char c, UINT32 x, UINT32 y, UINT32 scale, UINT32 color) { + if (c < 32 || c > 127) return; + const char *glyph = font8x8_basic[c]; + for (UINT32 row = 0; row < 8; row++) { + unsigned char bits = (unsigned char)glyph[row]; + for (UINT32 col = 0; col < 8; col++) { + if (bits & (1 << col)) { + for (UINT32 sy = 0; sy < scale; sy++) + for (UINT32 sx = 0; sx < scale; sx++) + draw_pixel(x + col * scale + sx, + y + row * scale + sy, color); + } + } + } +} + +static UINT32 measure_string(const char *s, UINT32 scale) { + UINT32 len = 0; + while (s[len]) len++; + return len * 8 * scale; +} + +static void draw_string(const char *s, UINT32 x, UINT32 y, + UINT32 scale, UINT32 color) { + while (*s) { + draw_char((unsigned char)*s, x, y, scale, color); + x += 8 * scale; + s++; + } +} + +// --- Chainload --- + +static EFI_STATUS chainload(EFI_HANDLE ImageHandle, CHAR16 *path) { + EFI_STATUS status; + EFI_HANDLE new_image; + EFI_LOADED_IMAGE *loaded_image; + EFI_GUID lip_guid = EFI_LOADED_IMAGE_PROTOCOL_GUID; + EFI_DEVICE_PATH *dev_path; + + status = uefi_call_wrapper(BS->HandleProtocol, 3, + ImageHandle, &lip_guid, (void **)&loaded_image); + if (EFI_ERROR(status)) return status; + + dev_path = FileDevicePath(loaded_image->DeviceHandle, path); + if (!dev_path) return EFI_NOT_FOUND; + + status = uefi_call_wrapper(BS->LoadImage, 6, + FALSE, ImageHandle, dev_path, NULL, 0, &new_image); + FreePool(dev_path); + if (EFI_ERROR(status)) return status; + + // Transfer control — does not return on success + status = uefi_call_wrapper(BS->StartImage, 3, new_image, NULL, NULL); + return status; +} + +// --- Entry point --- + +EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, + EFI_SYSTEM_TABLE *SystemTable) { + EFI_STATUS status; + + InitializeLib(ImageHandle, SystemTable); + + // Disable UEFI watchdog timer (prevents auto-reset if boot takes long) + uefi_call_wrapper(BS->SetWatchdogTimer, 4, 0, 0, 0, NULL); + + // Disable firmware console output (prevents POST text from appearing) + uefi_call_wrapper(ST->ConOut->EnableCursor, 2, ST->ConOut, FALSE); + uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); + + // Initialize GOP + status = init_gop(); + if (EFI_ERROR(status)) goto chain; + + // Clear screen to black + fill_screen(pack_color(0, 0, 0)); + + // Draw "Aesthetic.Computer" centered + { + const char *text = "Aesthetic.Computer"; + UINT32 scale = (hres >= 2560) ? 4 : (hres >= 1920) ? 3 : 2; + UINT32 tw = measure_string(text, scale); + UINT32 x = (hres - tw) / 2; + UINT32 y = (vres - 8 * scale) / 2; + // Soft pink/lavender: R=220 G=180 B=200 + UINT32 color = pack_color(220, 180, 200); + draw_string(text, x, y, scale, color); + } + + // Brief pause so splash is visible (500ms) + uefi_call_wrapper(BS->Stall, 1, 500000); + +chain: + status = chainload(ImageHandle, KERNEL_PATH); + + // Chainload failed — show error + Print(L"Failed to load "); + Print(KERNEL_PATH); + Print(L": %r\n", status); + uefi_call_wrapper(BS->Stall, 1, 5000000); + return status; +} diff --git a/fedac/native/bootloader/splash.efi b/fedac/native/bootloader/splash.efi new file mode 100755 index 0000000000000000000000000000000000000000..1cba3808df94c01f61c435d3a0c6eafc7a523c30 GIT binary patch literal 51715 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

ZX2l-Yu9_m}4&QA~z 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 Df1NB0 literal 0 HcmV?d00001 diff --git a/fedac/native/bootloader/splash.so b/fedac/native/bootloader/splash.so new file mode 100755 index 0000000000000000000000000000000000000000..b52f85dfb387a681411cc1ec7e6d0d7cfe42ad1b GIT binary patch literal 277616 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�s4l5@cb3qeZ2`ekxLWDkFR$(?~ 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üNaL9a? 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 0; - console.log(`[sample] wave-enter: loaded=${sampleLoaded} len=${mic.sampleLength || 0} rate=${mic.sampleRate || 0} connected=${!!mic.connected} device=${mic.device || "none"} err=${mic.lastError || ""}`); + // Open hot-mic so device stays ready — recording is instant after this. + // Always call open(); C side is idempotent if already hot. + sound?.microphone?.open?.(); + console.log(`[sample] wave-enter: loaded=${sampleLoaded} len=${mic.sampleLength || 0} rate=${mic.sampleRate || 0} connected=${!!mic.connected} hot=${!!mic.hot} device=${mic.device || "none"} err=${mic.lastError || ""}`); } else { + // Close hot-mic when leaving sample mode to free the device + if (prev === "sample") sound?.microphone?.close?.(); playWaveSound(sound, wave); } } @@ -405,6 +410,14 @@ function act({ event: e, sound, wifi, system }) { if (key >= "1" && key <= "9") { octave = parseInt(key); return; } if (key === "arrowup") { octave = Math.min(9, octave + 1); return; } if (key === "arrowdown") { octave = Math.max(1, octave - 1); return; } + // Home key: hold to record in sample mode + if (key === "home" && wave === "sample" && !recording) { + const ok = !!sound?.microphone?.rec?.(); + recording = ok; + recPointerId = null; // keyboard-driven, no pointer + console.log(`[mic] rec-home: ok=${ok}`); + return; + } if (key === "arrowleft") { const idx = (waveIndex - 1 + wavetypes.length) % wavetypes.length; setWave(wavetypes[idx], sound); @@ -451,9 +464,9 @@ function act({ event: e, sound, wifi, system }) { const playFreq = freq * Math.pow(2, effectivePitchShift()); if (wave === "sample" && sampleLoaded) { - // Play recorded sample at this pitch + // Play recorded sample at this pitch, looping while key is held const smp = sound.sample.play({ - tone: playFreq, base: SAMPLE_BASE_FREQ, volume: vol, pan, + tone: playFreq, base: SAMPLE_BASE_FREQ, volume: vol, pan, loop: true, }); if (smp) { sounds[key] = { synth: smp, note: letter, octave: noteOctave, baseFreq: freq, isSample: true }; @@ -480,6 +493,11 @@ function act({ event: e, sound, wifi, system }) { if (e.is("keyboard:up")) { const key = e.key?.toLowerCase(); if (!key) return; + // Home key release: stop recording + if (key === "home" && recording && recPointerId === null) { + stopSampleRecording(sound, "home-lift"); + return; + } if (sounds[key]) { const s = sounds[key].synth || sounds[key]; sound.kill(s, quickMode ? 0.02 : 0.08); @@ -690,7 +708,7 @@ function act({ event: e, sound, wifi, system }) { let synth; if (wave === "sample" && sampleLoaded) { const smp = sound.sample.play({ - tone: playFreq, base: SAMPLE_BASE_FREQ, volume: 0.5, pan, + tone: playFreq, base: SAMPLE_BASE_FREQ, volume: 0.5, pan, loop: true, }); if (smp) { synth = smp; @@ -778,7 +796,7 @@ function act({ event: e, sound, wifi, system }) { let synth; if (wave === "sample" && sampleLoaded) { const smp = sound.sample.play({ - tone: playFreq, base: SAMPLE_BASE_FREQ, volume: 0.5, pan, + tone: playFreq, base: SAMPLE_BASE_FREQ, volume: 0.5, pan, loop: true, }); if (smp) { synth = smp; @@ -1002,6 +1020,21 @@ function paint({ wipe, ink, box, line, write, screen, sound, system, trackpad, p return true; }; + // Auto-update status in bar (grouped with OS indicators) + if (autoUpdate.state === "downloading") { + const pct = Math.round((osProgress || 0) * 100); + statusWrite("os " + pct + "%", 80, 180, 100, 180); + } else if (autoUpdate.state === "flashing") { + statusWrite("flash", 255, 160, 60, 200); + } else if (autoUpdate.state === "ready") { + statusWrite("reboot?", 100, 220, 100, 220); + } else if (autoUpdate.availableVersion && isRemoteVersionNewer(autoUpdate.availableVersion, osCurrentVersion)) { + // "os" in normal dim + orange "!" appended + statusWrite("os", dark ? 90 : 130, dark ? 110 : 120, dark ? 80 : 110); + statusWrite("!", 255, 160, 40); + } + + // Chat status (after OS indicators) if (acMsg) { const maxChatChars = Math.floor((statusRightLimit - chatX) / 4); if (maxChatChars > 8) { @@ -1016,20 +1049,6 @@ function paint({ wipe, ink, box, line, write, screen, sound, system, trackpad, p statusWrite("chat", dark ? 60 : 180, dark ? 100 : 190, dark ? 60 : 180); } - // Auto-update status in bar (subtle, only during active download/flash/reboot) - if (autoUpdate.state === "downloading") { - const pct = Math.round((osProgress || 0) * 100); - statusWrite("os " + pct + "%", 80, 180, 100, 180); - } else if (autoUpdate.availableVersion && isRemoteVersionNewer(autoUpdate.availableVersion, osCurrentVersion)) { - const blinkOn = (frame % 60) < 35; - if (blinkOn) statusWrite("update!", 255, 210, 90, 210); - else statusWrite("update", dark ? 90 : 130, dark ? 110 : 120, dark ? 80 : 110, 150); - } else if (autoUpdate.state === "flashing") { - statusWrite("flash", 255, 160, 60, 200); - } else if (autoUpdate.state === "rebooting") { - statusWrite("reboot", 220, 100, 60, 220); - } - // Metronome indicator (pendulum) in status bar — shown when enabled if (metronomeEnabled) { const bpmLabel = metronomeBPM + "b"; @@ -1246,7 +1265,8 @@ function paint({ wipe, ink, box, line, write, screen, sound, system, trackpad, p autoUpdate.availableVersion = ver; osRemoteVersion = ver; notifyUpdateAvailable(sound, ver); - startAutoUpdateDownload(system); + // Don't auto-download — user must manually trigger via OS panel + autoUpdate.state = "idle"; } else { autoUpdate.availableVersion = ""; autoUpdate.state = "checking"; @@ -1289,8 +1309,10 @@ function paint({ wipe, ink, box, line, write, screen, sound, system, trackpad, p if (autoUpdate.state === "flashing") { if (system.flashDone) { if (system.flashOk) { - autoUpdate.state = "rebooting"; - autoUpdate.rebootFrame = frame + 300; // 5s delay before reboot + // Don't auto-reboot — just mark as ready. User must manually reboot via OS panel. + autoUpdate.state = "ready"; + autoUpdate.lastError = ""; + console.log("[os] auto-update flashed successfully, awaiting manual reboot"); } else { autoUpdate.lastError = "flash failed"; autoUpdate.state = "checking"; @@ -1298,9 +1320,6 @@ function paint({ wipe, ink, box, line, write, screen, sound, system, trackpad, p } } } - if (autoUpdate.state === "rebooting" && frame >= autoUpdate.rebootFrame) { - system.reboot?.(); - } // OS update panel state machine (manual, only when panel open) if (activeScreen === "os") { @@ -1588,14 +1607,17 @@ function paint({ wipe, ink, box, line, write, screen, sound, system, trackpad, p const h12 = hh % 12 || 12; const timeStr = h12 + ":" + (mm < 10 ? "0" : "") + mm + ":" + (ss < 10 ? "0" : "") + ss + ampm; rx -= timeStr.length * CH; - ink(FG_DIM, FG_DIM, FG_DIM); - write(timeStr, { x: rx, y: barY, size: 1 }); - // Green sync dot(s) after time when synced - if (clockSynced) { - ink(60, 220, 80); - const dotX = rx + timeStr.length * CH + 1; - box(dotX, barY + 3, 2, 2, true); - if (Math.abs(clockOffset) < 500) box(dotX + 3, barY + 3, 2, 2, true); // 2 dots = very precise + // Draw clock with green colons when synced + let cx = rx; + for (let ci = 0; ci < timeStr.length; ci++) { + const ch = timeStr[ci]; + if (ch === ":" && clockSynced) { + ink(60, 220, 80); + } else { + ink(FG_DIM, FG_DIM, FG_DIM); + } + write(ch, { x: cx, y: barY, size: 1 }); + cx += CH; } rx -= 4; } @@ -1973,6 +1995,21 @@ function paint({ wipe, ink, box, line, write, screen, sound, system, trackpad, p ink(255, 90, 90); box(meterX, meterY, Math.max(1, Math.floor(meterW * level)), meterH, true); } + + // Live mic level bar — simple peak meter below status text + if (mic.hot) { + const lvY = infoY + 19; + const lvH = 6; + // Background + ink(dark ? 20 : 230, dark ? 20 : 230, dark ? 25 : 235); + box(0, lvY, w, lvH, true); + // Level bar + const lvl = mic.level || 0; + if (lvl > 0.005) { + ink(recording ? 255 : 100, recording ? 80 : 180, recording ? 80 : 100); + box(0, lvY, Math.max(1, Math.round(w * Math.min(1, lvl))), lvH, true); + } + } } // Expose hit zones for act() diff --git a/fedac/native/scripts/build-and-flash.sh b/fedac/native/scripts/build-and-flash.sh index 331ca851c0..a01a798336 100755 --- a/fedac/native/scripts/build-and-flash.sh +++ b/fedac/native/scripts/build-and-flash.sh @@ -519,10 +519,18 @@ PART_EOF # Format FAT32 mkfs.vfat -F 32 -n "AC-NATIVE" "${PART}" - # Copy kernel using mtools (no mount needed) + # Copy kernel + splash chainloader using mtools (no mount needed) mmd -i "${PART}" ::EFI mmd -i "${PART}" ::EFI/BOOT - mcopy -i "${PART}" "${VMLINUZ}" ::EFI/BOOT/BOOTX64.EFI + SPLASH_EFI="${NATIVE_DIR}/bootloader/splash.efi" + if [ -f "${SPLASH_EFI}" ]; then + log "Using splash chainloader (${SPLASH_EFI})" + mcopy -i "${PART}" "${SPLASH_EFI}" ::EFI/BOOT/BOOTX64.EFI + mcopy -i "${PART}" "${VMLINUZ}" ::EFI/BOOT/KERNEL.EFI + else + log "No splash chainloader found, using kernel directly" + mcopy -i "${PART}" "${VMLINUZ}" ::EFI/BOOT/BOOTX64.EFI + fi # Write config.json with handle + optional per-char colors from handle-colors API HANDLE_CLEAN="${HANDLE#@}" diff --git a/fedac/native/src/ac-native.c b/fedac/native/src/ac-native.c index d5bb19615f..c21b41b039 100644 --- a/fedac/native/src/ac-native.c +++ b/fedac/native/src/ac-native.c @@ -223,9 +223,8 @@ static void load_boot_visual_config(void) { char handle[64] = {0}; if (parse_config_string(buf, "\"handle\"", handle, sizeof(handle))) { - if ((int)strlen(handle) < (int)sizeof(boot_title) - 1) { - boot_title[0] = '@'; - snprintf(boot_title + 1, sizeof(boot_title) - 1, "%s", handle); + if ((int)strlen(handle) < (int)sizeof(boot_title) - 4) { + snprintf(boot_title, sizeof(boot_title), "hi @%s", handle); } } parse_boot_title_colors(buf); @@ -257,9 +256,14 @@ static ACColor title_char_color(int ci, int frame, int alpha) { int title_len = (int)strlen(boot_title); int idx = ci; - // Accept either @handle-length palettes or handle-only palettes. - if (boot_title[0] == '@' && title_len > 1 && boot_title_colors_len == title_len - 1) { - idx = (ci > 0) ? (ci - 1) : 0; + // Map palette to the handle portion of "hi @handle" (skip "hi @" = 4 chars) + const char *at = strchr(boot_title, '@'); + int handle_start = at ? (int)(at - boot_title) + 1 : 0; // char after @ + if (handle_start > 0 && ci >= handle_start && boot_title_colors_len > 0) { + idx = ci - handle_start; + } else if (ci < handle_start) { + // "hi " and "@" get rainbow colors + return rainbow_title_color(ci, frame, alpha); } if (idx < 0) idx = 0; if (boot_title_colors_len > 0) idx %= boot_title_colors_len; @@ -792,6 +796,45 @@ static int draw_startup_fade(ACGraph *graph, ACFramebuffer *screen, graph_wipe(graph, (ACColor){0, 0, 0, 255}); display_present(display, screen, 3); + // Check if this is a fresh boot of a new version + int is_new_version = 0; +#ifdef AC_GIT_HASH +#ifdef AC_BUILD_TS + { + const char *current_ver = AC_GIT_HASH "-" AC_BUILD_TS; + char prev_ver[128] = ""; + FILE *vf = fopen("/mnt/booted-version", "r"); + if (vf) { + if (fgets(prev_ver, sizeof(prev_ver), vf)) { + // Strip trailing newline + char *nl = strchr(prev_ver, '\n'); + if (nl) *nl = 0; + } + fclose(vf); + } + is_new_version = (strcmp(prev_ver, current_ver) != 0); + ac_log("[boot] version=%s prev=%s new=%s\n", current_ver, prev_ver, is_new_version ? "YES" : "no"); + // Write current version immediately so next boot sees it + vf = fopen("/mnt/booted-version", "w"); + if (vf) { + fprintf(vf, "%s", current_ver); + fclose(vf); + } + // Append to boot history log (persists across reboots) + vf = fopen("/mnt/boot-history.log", "a"); + if (vf) { + time_t now_t = time(NULL); + struct tm *tm = gmtime(&now_t); + char ts[32]; + strftime(ts, sizeof(ts), "%Y-%m-%dT%H:%M:%SZ", tm); + fprintf(vf, "%s %s %s\n", ts, current_ver, is_new_version ? "NEW" : "same"); + fclose(vf); + } + sync(); + } +#endif +#endif + // 180 frames = 3 second animation. // W press → halt and show y/n confirmation // Any other key → skip animation and start playing @@ -827,20 +870,21 @@ static int draw_startup_fade(ACGraph *graph, ACFramebuffer *screen, // Startup greeting — use handle if available if (f == 10 && tts) { char greet[96]; - if (boot_title[0] == '@') - snprintf(greet, sizeof(greet), "hi %s", boot_title + 1); + const char *at = strchr(boot_title, '@'); + if (at) + snprintf(greet, sizeof(greet), "hi %s", at + 1); else snprintf(greet, sizeof(greet), "hi"); tts_speak(tts, greet); } // W hint is visual only — no TTS - // Fade from black to green bg (complete in first 0.3s) + // Fade from black to yellow bg (complete in first 0.3s) double fade_t = t * 3.33; if (fade_t > 1.0) fade_t = 1.0; - int bg_r = (int)(10 * fade_t); // green - int bg_g = (int)(50 * fade_t); - int bg_b = (int)(15 * fade_t); + int bg_r = (int)(55 * fade_t); // yellow + int bg_g = (int)(45 * fade_t); + int bg_b = (int)(8 * fade_t); graph_wipe(graph, (ACColor){(uint8_t)bg_r, (uint8_t)bg_g, (uint8_t)bg_b, 255}); // Title — per-handle palette (fallback rainbow), animated pulse @@ -880,6 +924,11 @@ static int draw_startup_fade(ACGraph *graph, ACFramebuffer *screen, font_draw_matrix(graph, ver, panel_x + 4, panel_y + 3, 1); graph_ink(graph, (ACColor){210, 235, 220, (uint8_t)alpha}); font_draw_matrix(graph, bts, panel_x + 4, panel_y + 11, 1); + // "NEW" badge when first boot of this version + if (is_new_version) { + graph_ink(graph, (ACColor){80, 255, 120, (uint8_t)alpha}); + font_draw_matrix(graph, "NEW", panel_x - font_measure_matrix("NEW", 1) - 4, panel_y + 6, 1); + } } #endif @@ -1301,7 +1350,24 @@ int main(int argc, char *argv[]) { } if (power_pressed) { - // Shutdown animation — chaotic red/white strobe with title + // Say bye IMMEDIATELY (TTS + shutdown chime start before animation) + char bye_title[80]; + { + const char *at = strchr(boot_title, '@'); + if (at) + snprintf(bye_title, sizeof(bye_title), "bye @%s", at + 1); + else + snprintf(bye_title, sizeof(bye_title), "bye"); + char bye_speech[96]; + if (at) + snprintf(bye_speech, sizeof(bye_speech), "bye %s", at + 1); + else + snprintf(bye_speech, sizeof(bye_speech), "bye"); + if (tts) tts_speak(tts, bye_speech); + audio_shutdown_sound(audio); + } + + // Shutdown animation — chaotic red/white strobe with bye title struct timespec anim_time; clock_gettime(CLOCK_MONOTONIC, &anim_time); @@ -1332,8 +1398,8 @@ int main(int argc, char *argv[]) { uint8_t tg = (f % 3 == 0) ? 255 : 40; uint8_t tb = (f % 3 == 0) ? 255 : 40; graph_ink(&graph, (ACColor){tr, tg, tb, (uint8_t)alpha}); - int tw = font_measure_matrix(boot_title, 3); - font_draw_matrix(&graph, boot_title, + int tw = font_measure_matrix(bye_title, 3); + font_draw_matrix(&graph, bye_title, (screen->width - tw) / 2 + jx, screen->height / 2 - 20 + jy, 3); graph_ink(&graph, (ACColor){(uint8_t)(120 * fade), 40, 40, (uint8_t)(alpha / 2)}); @@ -1467,8 +1533,9 @@ int main(int argc, char *argv[]) { } } - // Cleanup + // Cleanup (TTS bye + shutdown chime already fired at power-press time) ac_log("[ac-native] Shutting down\n"); + if (logfile) { fclose(logfile); logfile = NULL; } sync(); // Unmount USB log @@ -1478,18 +1545,9 @@ int main(int argc, char *argv[]) { js_destroy(rt); wifi_destroy(wifi); if (tts) { - { - char bye[96]; - if (boot_title[0] == '@') - snprintf(bye, sizeof(bye), "bye %s", boot_title + 1); - else - snprintf(bye, sizeof(bye), "bye"); - tts_speak(tts, bye); - } tts_wait(tts); - usleep(300000); // Let TTS ring buffer drain before chime + usleep(300000); // Let TTS ring buffer drain } - audio_shutdown_sound(audio); usleep(600000); // Let shutdown chime ring out tts_destroy(tts); audio_destroy(audio); diff --git a/fedac/native/src/audio.c b/fedac/native/src/audio.c index e42fd46237..e27fd42e0d 100644 --- a/fedac/native/src/audio.c +++ b/fedac/native/src/audio.c @@ -306,22 +306,55 @@ static void *audio_thread_fn(void *arg) { if (sv->fade <= 0.0) { sv->fade = 0.0; sv->active = 0; continue; } } - int pos0 = (int)sv->position; - if (pos0 >= audio->sample_len) { sv->active = 0; continue; } - int pos1 = pos0 + 1; - if (pos1 >= audio->sample_len) pos1 = pos0; - double frac = sv->position - pos0; - double sample = audio->sample_buf[pos0] * (1.0 - frac) - + audio->sample_buf[pos1] * frac; - sample *= sv->volume * sv->fade; - double l_gain = sv->pan <= 0 ? 1.0 : 1.0 - sv->pan; - double r_gain = sv->pan >= 0 ? 1.0 : 1.0 + sv->pan; - mix_l += sample * l_gain; - mix_r += sample * r_gain; + // Stereo spread: micro-delay between L/R (Haas effect) + // Pan controls both amplitude and a small time offset + // giving mono samples a wide stereo image. + double delay_samps = sv->pan * 0.0004 * rate; // ~0.4ms max at pan=1 + double pos_l = sv->position - (delay_samps > 0 ? delay_samps : 0); + double pos_r = sv->position + (delay_samps > 0 ? 0 : delay_samps); + if (pos_l < 0) pos_l = 0; + if (pos_r < 0) pos_r = 0; + + // Interpolated read for L channel + int slen = audio->sample_len; + int p0l = (int)pos_l; + if (sv->loop) { + p0l = ((p0l % slen) + slen) % slen; + } else if (p0l >= slen) { + sv->active = 0; continue; + } + int p1l = p0l + 1; if (p1l >= slen) p1l = sv->loop ? 0 : p0l; + double fl = pos_l - p0l; + double samp_l = audio->sample_buf[p0l] * (1.0 - fl) + + audio->sample_buf[p1l] * fl; + + // Interpolated read for R channel + int p0r = (int)pos_r; + if (sv->loop) { + p0r = ((p0r % slen) + slen) % slen; + } else if (p0r >= slen) { + p0r = slen - 1; + } + int p1r = p0r + 1; if (p1r >= slen) p1r = sv->loop ? 0 : p0r; + double fr = pos_r - p0r; + double samp_r = audio->sample_buf[p0r] * (1.0 - fr) + + audio->sample_buf[p1r] * fr; + + double vol = sv->volume * sv->fade; + double l_gain = sv->pan <= 0 ? 1.0 : 1.0 - sv->pan * 0.6; + double r_gain = sv->pan >= 0 ? 1.0 : 1.0 + sv->pan * 0.6; + mix_l += samp_l * vol * l_gain; + mix_r += samp_r * vol * r_gain; sv->position += sv->speed; if (sv->position >= audio->sample_len) { - sv->active = 0; // one-shot + if (sv->loop) { + // Wrap for seamless looping + while (sv->position >= audio->sample_len) + sv->position -= audio->sample_len; + } else { + sv->active = 0; // one-shot + } } } @@ -605,9 +638,12 @@ ACAudio *audio_init(void) { audio->sample_rate = 48000; // default, overwritten by actual capture rate audio->sample_next_id = 1; audio->mic_connected = 0; + audio->mic_hot = 0; audio->mic_level = 0.0f; audio->mic_last_chunk = 0; audio->capture_thread_running = 0; + memset(audio->mic_waveform, 0, sizeof(audio->mic_waveform)); + audio->mic_waveform_pos = 0; snprintf(audio->mic_device, sizeof(audio->mic_device), "none"); audio->mic_last_error[0] = 0; seed_default_sample(audio); @@ -982,7 +1018,11 @@ void audio_set_fx_mix(ACAudio *audio, float mix) { audio->target_fx_mix = mix; } -// --- Microphone capture thread --- +// --- Hot-mic capture thread --- +// Device stays open while mic_hot is set; audio is always read to keep +// ALSA happy and the level meter live, but only written to sample_buf +// when recording is true. This eliminates the device-open latency on +// every rec press. static void *capture_thread_func(void *arg) { ACAudio *audio = (ACAudio *)arg; snd_pcm_t *cap = NULL; @@ -1007,7 +1047,7 @@ static void *capture_thread_func(void *arg) { audio->mic_connected = 0; audio->mic_level = 0.0f; ac_log("[mic] no capture device found\n"); - audio->recording = 0; + audio->mic_hot = 0; return NULL; } @@ -1028,6 +1068,12 @@ static void *capture_thread_func(void *arg) { unsigned int rate = 48000; snd_pcm_hw_params_set_rate_near(cap, hw, &rate, NULL); + // Set small period + buffer for low-latency capture + snd_pcm_uframes_t period_frames = 128; // ~2.7ms at 48kHz + snd_pcm_hw_params_set_period_size_near(cap, hw, &period_frames, NULL); + snd_pcm_uframes_t buffer_frames = 512; // 4 periods + snd_pcm_hw_params_set_buffer_size_near(cap, hw, &buffer_frames); + if (snd_pcm_hw_params(cap, hw) < 0) { snprintf(audio->mic_last_error, sizeof(audio->mic_last_error), "failed to configure capture"); @@ -1035,20 +1081,28 @@ static void *capture_thread_func(void *arg) { audio->mic_level = 0.0f; ac_log("[mic] failed to configure capture\n"); snd_pcm_close(cap); - audio->recording = 0; + audio->mic_hot = 0; return NULL; } audio->sample_rate = rate; - audio->sample_write_pos = 0; audio->mic_connected = 1; audio->mic_level = 0.0f; audio->mic_last_chunk = 0; - ac_log("[mic] recording at %u Hz, %u ch\n", rate, channels); + // Log actual negotiated parameters + snd_pcm_uframes_t actual_period = 0, actual_buffer = 0; + snd_pcm_hw_params_get_period_size(hw, &actual_period, NULL); + snd_pcm_hw_params_get_buffer_size(hw, &actual_buffer); + ac_log("[mic] hot-mic running at %u Hz, %u ch, period=%lu buf=%lu\n", + rate, channels, (unsigned long)actual_period, (unsigned long)actual_buffer); + + int read_frames = (int)actual_period; + if (read_frames < 64) read_frames = 64; + if (read_frames > 512) read_frames = 512; int16_t buf[1024 * 2]; // max stereo - while (audio->recording && audio->sample_write_pos < audio->sample_max_len) { - int n = snd_pcm_readi(cap, buf, 512); + while (audio->mic_hot) { + int n = snd_pcm_readi(cap, buf, read_frames); if (n < 0) { n = snd_pcm_recover(cap, n, 0); if (n < 0) { @@ -1060,46 +1114,56 @@ static void *capture_thread_func(void *arg) { continue; } audio->mic_last_chunk = n; + + // Always compute level + fill waveform ring; only buffer when recording float peak = 0.0f; - for (int s = 0; s < n && audio->sample_write_pos < audio->sample_max_len; s++) { + // Downsample into waveform ring: pick evenly spaced samples from chunk + int wf_step = n > 8 ? n / 8 : 1; // ~8 samples per chunk into ring + for (int s = 0; s < n; s++) { float sample; if (channels == 1) { sample = buf[s] / 32768.0f; } else { - sample = (buf[s * 2] + buf[s * 2 + 1]) / 65536.0f; // average L+R + sample = (buf[s * 2] + buf[s * 2 + 1]) / 65536.0f; } float abs_s = fabsf(sample); if (abs_s > peak) peak = abs_s; - audio->sample_buf[audio->sample_write_pos++] = sample; + + if (audio->recording && audio->sample_write_pos < audio->sample_max_len) { + audio->sample_buf[audio->sample_write_pos++] = sample; + } + + // Feed waveform ring (downsampled) + if (s % wf_step == 0) { + audio->mic_waveform[audio->mic_waveform_pos % MIC_WAVEFORM_SIZE] = sample; + audio->mic_waveform_pos++; + } + } + audio->mic_level = peak; // raw peak, no smoothing + + // Cap recording at buffer limit + if (audio->recording && audio->sample_write_pos >= audio->sample_max_len) { + audio->sample_len = audio->sample_write_pos; + audio->recording = 0; + ac_log("[mic] recording buffer full (%d samples)\n", audio->sample_len); } - audio->mic_level = audio->mic_level * 0.85f + peak * 0.15f; } - audio->sample_len = audio->sample_write_pos; - ac_log("[mic] recorded %d samples (%.2fs) peak=%.4f device=%s\n", - audio->sample_len, - (double)audio->sample_len / audio->sample_rate, - audio->mic_level, audio->mic_device); + ac_log("[mic] hot-mic thread exiting, device=%s\n", audio->mic_device); snd_pcm_close(cap); audio->mic_connected = 0; audio->recording = 0; return NULL; } -int audio_mic_start(ACAudio *audio) { - if (!audio || audio->recording || audio->capture_thread_running) return -1; - audio->recording = 1; +int audio_mic_open(ACAudio *audio) { + if (!audio || audio->mic_hot || audio->capture_thread_running) return -1; + audio->mic_hot = 1; audio->capture_thread_running = 1; - audio->sample_len = 0; - audio->mic_level = 0.0f; - audio->mic_last_chunk = 0; audio->mic_last_error[0] = 0; - ac_log("[mic] start requested\n"); - // Kill any playing sample voices - for (int i = 0; i < AUDIO_MAX_SAMPLE_VOICES; i++) - audio->sample_voices[i].active = 0; + ac_log("[mic] opening hot-mic\n"); if (pthread_create(&audio->capture_thread, NULL, capture_thread_func, audio) != 0) { - audio->recording = 0; + audio->mic_hot = 0; audio->capture_thread_running = 0; snprintf(audio->mic_last_error, sizeof(audio->mic_last_error), "failed to create capture thread"); @@ -1109,21 +1173,50 @@ int audio_mic_start(ACAudio *audio) { return 0; } -int audio_mic_stop(ACAudio *audio) { - if (!audio) return 0; +void audio_mic_close(ACAudio *audio) { + if (!audio) return; audio->recording = 0; + audio->mic_hot = 0; if (audio->capture_thread_running) { pthread_join(audio->capture_thread, NULL); audio->capture_thread_running = 0; } - ac_log("[mic] stop requested, sample_len=%d sample_rate=%u\n", + ac_log("[mic] hot-mic closed\n"); +} + +int audio_mic_start(ACAudio *audio) { + if (!audio || audio->recording) return -1; + // If hot-mic isn't running yet, open it first + if (!audio->mic_hot) { + int rc = audio_mic_open(audio); + if (rc != 0) return rc; + } + // Kill any playing sample voices + for (int i = 0; i < AUDIO_MAX_SAMPLE_VOICES; i++) + audio->sample_voices[i].active = 0; + // Reset write position FIRST (atomic int write), then set recording flag. + // The capture thread only writes when recording==1, and checks sample_write_pos, + // so resetting pos before setting the flag avoids any race. + audio->sample_len = 0; + audio->sample_write_pos = 0; + __sync_synchronize(); // memory barrier: ensure pos=0 is visible before recording=1 + audio->recording = 1; + ac_log("[mic] recording started (instant)\n"); + return 0; +} + +int audio_mic_stop(ACAudio *audio) { + if (!audio) return 0; + audio->recording = 0; + audio->sample_len = audio->sample_write_pos; + ac_log("[mic] recording stopped, sample_len=%d sample_rate=%u\n", audio->sample_len, audio->sample_rate); return audio->sample_len; } // --- Sample playback --- uint64_t audio_sample_play(ACAudio *audio, double freq, double base_freq, - double volume, double pan) { + double volume, double pan, int loop) { if (!audio || audio->sample_len == 0) return 0; pthread_mutex_lock(&audio->lock); @@ -1136,6 +1229,7 @@ uint64_t audio_sample_play(ACAudio *audio, double freq, double base_freq, SampleVoice *sv = &audio->sample_voices[slot]; sv->active = 1; + sv->loop = loop; sv->position = 0.0; // Speed: pitch ratio * rate conversion (capture rate → output rate) sv->speed = (freq / base_freq) * ((double)audio->sample_rate / (double)audio->actual_rate); @@ -1311,11 +1405,7 @@ void audio_shutdown_sound(ACAudio *audio) { void audio_destroy(ACAudio *audio) { if (!audio) return; audio->running = 0; - audio->recording = 0; - if (audio->capture_thread_running) { - pthread_join(audio->capture_thread, NULL); - audio->capture_thread_running = 0; - } + audio_mic_close(audio); if (audio->pcm) { pthread_join(audio->thread, NULL); snd_pcm_close((snd_pcm_t *)audio->pcm); diff --git a/fedac/native/src/audio.h b/fedac/native/src/audio.h index 9d77058b1d..2bc9f6b2fb 100644 --- a/fedac/native/src/audio.h +++ b/fedac/native/src/audio.h @@ -50,6 +50,7 @@ typedef struct { typedef struct { int active; + int loop; // 1 = loop sample, 0 = one-shot double position; // fractional sample index double speed; // playback rate (1.0 = original pitch) double volume; @@ -118,15 +119,21 @@ typedef struct { int sample_len; // length in samples (0 = no sample) int sample_max_len; // buffer capacity unsigned int sample_rate; // capture sample rate (for speed calc) - volatile int recording; // 1 = actively recording + volatile int recording; // 1 = buffering mic input to sample_buf int sample_write_pos; // write cursor during recording volatile int mic_connected; // 1 = capture device currently open - volatile float mic_level; // smoothed peak level (0.0-1.0) while recording + volatile int mic_hot; // 1 = hot-mic thread running (device stays open) + volatile float mic_level; // raw peak level (0.0-1.0) per chunk volatile int mic_last_chunk;// last captured frame count char mic_device[64]; // active ALSA capture device string char mic_last_error[128]; // last capture error message pthread_t capture_thread; - volatile int capture_thread_running; // 1 while capture thread owns ALSA device + volatile int capture_thread_running; // 1 while capture thread is alive + + // Live mic waveform ring buffer (for visualization) + #define MIC_WAVEFORM_SIZE 128 + float mic_waveform[128]; // circular buffer of recent samples (downsampled) + volatile int mic_waveform_pos; // write position in ring SampleVoice sample_voices[AUDIO_MAX_SAMPLE_VOICES]; uint64_t sample_next_id; @@ -168,13 +175,15 @@ void audio_glitch_toggle(ACAudio *audio); void audio_set_room_mix(ACAudio *audio, float mix); void audio_set_fx_mix(ACAudio *audio, float mix); -// Microphone recording -int audio_mic_start(ACAudio *audio); // start capture thread, returns 0 on success -int audio_mic_stop(ACAudio *audio); // stop capture, returns sample length +// Microphone — hot-mic mode (device stays open, recording toggles buffering) +int audio_mic_open(ACAudio *audio); // open device + start hot-mic thread +void audio_mic_close(ACAudio *audio); // stop thread + close device +int audio_mic_start(ACAudio *audio); // begin buffering (instant, no device open) +int audio_mic_stop(ACAudio *audio); // stop buffering, returns sample length -// Sample playback with pitch shifting +// Sample playback with pitch shifting (loop=1 for infinite loop, 0 for one-shot) uint64_t audio_sample_play(ACAudio *audio, double freq, double base_freq, - double volume, double pan); + double volume, double pan, int loop); void audio_sample_kill(ACAudio *audio, uint64_t id, double fade); void audio_sample_update(ACAudio *audio, uint64_t id, double freq, double base_freq, double volume, double pan); diff --git a/fedac/native/src/js-bindings.c b/fedac/native/src/js-bindings.c index 9405c337c6..cdd7cfc82c 100644 --- a/fedac/native/src/js-bindings.c +++ b/fedac/native/src/js-bindings.c @@ -8,6 +8,10 @@ #include #include #include +#include +#include +#include +#include // Defined in ac-native.c — logs to USB mount extern void ac_log(const char *fmt, ...); @@ -551,7 +555,25 @@ static JSValue js_glitch_toggle(JSContext *ctx, JSValueConst this_val, int argc, return JS_UNDEFINED; } -// sound.microphone.rec() — start recording +// sound.microphone.open() — open device + start hot-mic thread +static JSValue js_mic_open(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { + (void)this_val; (void)argc; (void)argv; + if (!current_rt->audio) return JS_FALSE; + int ok = audio_mic_open(current_rt->audio); + ac_log("[js][mic] open -> %s\n", ok == 0 ? "ok" : "fail"); + return JS_NewBool(ctx, ok == 0); +} + +// sound.microphone.close() — stop hot-mic thread + close device +static JSValue js_mic_close(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { + (void)this_val; (void)argc; (void)argv; + if (!current_rt->audio) return JS_UNDEFINED; + audio_mic_close(current_rt->audio); + ac_log("[js][mic] close\n"); + return JS_UNDEFINED; +} + +// sound.microphone.rec() — start buffering (instant, device already open) static JSValue js_mic_rec(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { (void)this_val; (void)argc; (void)argv; if (!current_rt->audio) return JS_FALSE; @@ -560,7 +582,7 @@ static JSValue js_mic_rec(JSContext *ctx, JSValueConst this_val, int argc, JSVal return JS_NewBool(ctx, ok == 0); } -// sound.microphone.cut() — stop recording, return sample length +// sound.microphone.cut() — stop buffering, return sample length static JSValue js_mic_cut(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { (void)this_val; (void)argc; (void)argv; if (!current_rt->audio) return JS_NewInt32(ctx, 0); @@ -616,7 +638,12 @@ static JSValue js_sample_play(JSContext *ctx, JSValueConst this_val, int argc, J if (JS_IsNumber(v)) JS_ToFloat64(ctx, &pan, v); JS_FreeValue(ctx, v); - uint64_t id = audio_sample_play(audio, freq, base_freq, volume, pan); + int loop = 0; + v = JS_GetPropertyStr(ctx, opts, "loop"); + if (JS_IsBool(v)) loop = JS_ToBool(ctx, v); + JS_FreeValue(ctx, v); + + uint64_t id = audio_sample_play(audio, freq, base_freq, volume, pan, loop); if (id == 0) return JS_UNDEFINED; // Return object with id, kill(), update() @@ -1191,12 +1218,16 @@ static JSValue build_sound_obj(JSContext *ctx, ACRuntime *rt) { // microphone JSValue mic = JS_NewObject(ctx); + JS_SetPropertyStr(ctx, mic, "open", JS_NewCFunction(ctx, js_mic_open, "open", 0)); + JS_SetPropertyStr(ctx, mic, "close", JS_NewCFunction(ctx, js_mic_close, "close", 0)); JS_SetPropertyStr(ctx, mic, "rec", JS_NewCFunction(ctx, js_mic_rec, "rec", 0)); JS_SetPropertyStr(ctx, mic, "cut", JS_NewCFunction(ctx, js_mic_cut, "cut", 0)); JS_SetPropertyStr(ctx, mic, "recording", JS_NewBool(ctx, rt->audio ? rt->audio->recording : 0)); JS_SetPropertyStr(ctx, mic, "connected", JS_NewBool(ctx, rt->audio ? rt->audio->mic_connected : 0)); + JS_SetPropertyStr(ctx, mic, "hot", + JS_NewBool(ctx, rt->audio ? rt->audio->mic_hot : 0)); JS_SetPropertyStr(ctx, mic, "sampleLength", JS_NewInt32(ctx, rt->audio ? rt->audio->sample_len : 0)); JS_SetPropertyStr(ctx, mic, "sampleRate", @@ -1209,6 +1240,7 @@ static JSValue build_sound_obj(JSContext *ctx, ACRuntime *rt) { JS_NewString(ctx, (rt->audio && rt->audio->mic_device[0]) ? rt->audio->mic_device : "none")); JS_SetPropertyStr(ctx, mic, "lastError", JS_NewString(ctx, (rt->audio && rt->audio->mic_last_error[0]) ? rt->audio->mic_last_error : "")); + // Mic level is already exposed as mic.level (single float, no array overhead) JS_SetPropertyStr(ctx, sound, "microphone", mic); // sample playback @@ -1622,48 +1654,93 @@ static void detect_boot_device(char *out, size_t len) { ac_log("[flash] boot device: fallback (/dev/sda1)"); } +// Pure C file copy (no shell needed) +static long flash_copy_file(const char *src, const char *dst) { + FILE *in = fopen(src, "rb"); + if (!in) { + ac_log("[flash] fopen src failed: %s errno=%d (%s)", src, errno, strerror(errno)); + return -1; + } + // Delete destination first (vfat may block overwrite of in-use file) + unlink(dst); + FILE *out = fopen(dst, "wb"); + if (!out) { + ac_log("[flash] fopen dst failed: %s errno=%d (%s)", dst, errno, strerror(errno)); + fclose(in); + return -1; + } + char buf[65536]; + long total = 0; + size_t n; + while ((n = fread(buf, 1, sizeof(buf), in)) > 0) { + if (fwrite(buf, 1, n, out) != n) { + ac_log("[flash] fwrite failed at offset %ld errno=%d (%s)", total, errno, strerror(errno)); + total = -1; + break; + } + total += n; + } + fclose(out); + fclose(in); + return total; +} + // Flash update background thread: mount EFI, copy vmlinuz, sync, umount +// All operations use C syscalls — no shell commands (cp/mkdir/mount not in initramfs PATH) // NOTE: current_rt is __thread (thread-local); pass ACRuntime * via arg instead static void *flash_thread_fn(void *arg) { ACRuntime *rt = (ACRuntime *)arg; if (!rt) return NULL; ac_log("[flash] starting: src=%s device=%s", rt->flash_src, rt->flash_device); - if (system("mkdir -p /tmp/efi") != 0) { - ac_log("[flash] mkdir failed"); - rt->flash_ok = 0; - rt->flash_pending = 0; - rt->flash_done = 1; - return NULL; + + // The boot device is already mounted at /mnt (for logging). + // Try /mnt first; if the EFI directory exists there, copy directly. + // Otherwise fall back to mounting at /tmp/efi. + const char *efi_mount = NULL; + if (access("/mnt/EFI/BOOT", F_OK) == 0) { + efi_mount = "/mnt"; + ac_log("[flash] using existing /mnt mount"); + } else { + mkdir("/tmp/efi", 0755); + umount("/tmp/efi"); + if (mount(rt->flash_device, "/tmp/efi", "vfat", 0, NULL) != 0) { + ac_log("[flash] mount %s failed (errno=%d)", rt->flash_device, errno); + rt->flash_ok = 0; + rt->flash_pending = 0; + rt->flash_done = 1; + return NULL; + } + efi_mount = "/tmp/efi"; + ac_log("[flash] mounted %s at /tmp/efi", rt->flash_device); } - // Unmount if already mounted - system("umount /tmp/efi 2>/dev/null"); - char cmd[512]; - snprintf(cmd, sizeof(cmd), - "mount \"%s\" /tmp/efi -t vfat -o rw 2>/dev/null", rt->flash_device); - if (system(cmd) != 0) { - ac_log("[flash] mount %s failed", rt->flash_device); - rt->flash_ok = 0; - rt->flash_pending = 0; - rt->flash_done = 1; - return NULL; + + // If splash chainloader is present, kernel lives at KERNEL.EFI; else BOOTX64.EFI + char dst[512]; + char kernel_path[512]; + snprintf(kernel_path, sizeof(kernel_path), "%s/EFI/BOOT/KERNEL.EFI", efi_mount); + if (access(kernel_path, F_OK) == 0) { + snprintf(dst, sizeof(dst), "%s", kernel_path); + ac_log("[flash] chainloader detected, updating KERNEL.EFI"); + } else { + snprintf(dst, sizeof(dst), "%s/EFI/BOOT/BOOTX64.EFI", efi_mount); + ac_log("[flash] no chainloader, updating BOOTX64.EFI"); } - snprintf(cmd, sizeof(cmd), - "cp -f \"%s\" /tmp/efi/EFI/BOOT/BOOTX64.EFI 2>/dev/null", rt->flash_src); - int r = system(cmd); - system("sync"); - system("umount /tmp/efi 2>/dev/null"); - if (r != 0) { - ac_log("[flash] cp failed (r=%d)", r); + long copied = flash_copy_file(rt->flash_src, dst); + sync(); + if (efi_mount != NULL && strcmp(efi_mount, "/tmp/efi") == 0) { + umount("/tmp/efi"); + } + if (copied <= 0) { + ac_log("[flash] copy failed (copied=%ld)", copied); rt->flash_ok = 0; rt->flash_pending = 0; rt->flash_done = 1; return NULL; } // Remove downloaded file to free /tmp space - snprintf(cmd, sizeof(cmd), "rm -f \"%s\"", rt->flash_src); - system(cmd); - ac_log("[flash] done"); + unlink(rt->flash_src); + ac_log("[flash] done (%ld bytes written)", copied); rt->flash_ok = 1; rt->flash_pending = 0; rt->flash_done = 1; @@ -1709,11 +1786,17 @@ static JSValue js_flash_update(JSContext *ctx, JSValueConst this_val, int argc, return JS_UNDEFINED; } -// system.reboot() — triggers system reboot +// system.reboot() — triggers system reboot (direct syscall, no external binary needed) static JSValue js_reboot(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { (void)ctx; (void)this_val; (void)argc; (void)argv; - ac_log("[system] reboot requested"); - system("reboot"); + ac_log("[system] reboot requested — executing syscall"); + sync(); // flush all pending writes + if (getpid() == 1) { + reboot(LINUX_REBOOT_CMD_RESTART); + } else { + // Not PID 1 (dev/test mode) — try shell fallback + system("reboot"); + } return JS_UNDEFINED; }