audio_win.ll implements audio.ll's snd_* contract over XAudio2 from IR: a source voice per clip, restart on play, LoopCount for loops, SetVolume, SetFrequencyRatio and a balance pan through SetOutputMatrix, with the COM slots taken from the SDK's xaudio2.h. Clips are RIFF WAVE read through lp_pak_open (weakly referenced), so a packed sound loads directly. ludicc links it with xaudio2 and ole32, and silences xinput.lib's importeddllmain warning. Verified: ludic-dev test 135/135, selfhost-test 32/32; on the PC a harness loads, plays, pans, loops and stops clips, and Maroon Lake windowed reports "sound: 31 of 31 clips loaded". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
bump: minor
type: feat
Windows target — ludicc builds and runs headless programs on Windows, and builds itself there.
--target <triple>— a triple namingwindowsselects the Windows runtime; without the flag the target is the host, read at run time fromOS=Windows_NT. The IR still carries no triple, so clang assembles it for the machine it runs on.- The libc surface, in IR — on Windows the header emits
emit_win.ludic, which defines the POSIX names the backend calls (fopen,ftell,rename,opendir,mmap,fmemopen,uname, …) over the UCRT and Win32. Three of them fixed silent breakage rather than link errors:renameonto an existing file (everyFs.write_textafter the first), a 32-bitftell, and text-modefopenrewriting\nas\r\n. - Known folders —
Os.save_dir/config_dirare%APPDATA%\<app>,cache_diris%LOCALAPPDATA%\<app>,temp_diris%TEMP%, all with forward slashes; a bundle'shomeline points at%APPDATA%\<name>. - The driver — finds
C:\Program Files\LLVM\bin\clang.exewhen clang is not on%PATH%, writes.exeoutputs, speaks cmd.exe for its directory and cleanup commands, and readsargv[0],%PATH%and$LUDIC_HOMEwith either separator. - A window —
win32.lliscocoa.ll's contract over user32: the held-key set and frame key in Ludic codes, the mouse in framebuffer pixels with raw input for cursor mode 2, cursor hide/lock/confine that lets go when the window loses the foreground, XInput pads in SDL order with rescaled deadzones, and the softwarewin_present.win32_gl.llputs the WGL context on that window with vsync and borderless full screen; a headless build linksgl_win_nowin.llinstead. The process is per-monitor DPI aware. - Sound —
audio_win.llisaudio.ll's contract over XAudio2: one source voice per clip, loops, volume, rate and a balance pan through the output matrix, RIFF WAVE in PCM or float. It reads a clip through the asset pack, so a bundled game's firstAudio.loadsucceeds - AVAudioPlayer takes a filesystem path, which is why macOS cannot. - Not yet — the splash and
App.set_icondo nothing, andHttp.*is still a macOS platform layer; a Windows build that uses it stops with a message saying so. Gl.*on Windows —gl_win.llmakes a WGL 4.1 core context on a hidden window's DC, andgl_thunks_win.ll(generated byludic-dev glgenbesidegl_thunks.ll) calls every entry point through a table@lgl_win_loadfills fromwglGetProcAddress, falling back toopengl32.dllfor the 1.1 functions it will not return. A headless GL program renders on the GPU there:gl_trianglematches the macOS frame to within one level per channel.