Skip to content

Add Windows ARM64 Build Support#80

Merged
chrisgleissner merged 31 commits into
mainfrom
feat/windows-arm
Jan 9, 2026
Merged

Add Windows ARM64 Build Support#80
chrisgleissner merged 31 commits into
mainfrom
feat/windows-arm

Conversation

@chrisgleissner

@chrisgleissner chrisgleissner commented Jan 8, 2026

Copy link
Copy Markdown
Owner

Summary

Add Windows ARM64 (Snapdragon) build support for Surface Pro and other ARM Windows devices.

see #75

Changes

  • CMake Presets: Added and presets
  • Dependencies: Updated buildspec.json with ARM64 hashes for OBS 31.1.1, obs-deps, and Qt6
  • Build Scripts: Extended PowerShell scripts to accept target parameter
  • CI/CD: Added job using GitHub's runner
  • Release: Added ARM64 artifacts to push workflow
  • Documentation: Created comprehensive doc/windows-arm64.md

Implementation Approach

  • Uses native ARM64 Windows runners (no cross-compilation)
  • Docker cross-compilation investigated but not feasible (no mature toolchain)
  • All ARM64 dependencies verified available from OBS project
  • Zero code changes required (architecture-neutral C code)

Testing

  • Format checks: ✅ Pass
  • Workflow validation: ✅ Pass
  • Runtime testing: Requires real ARM64 Windows hardware (beta testers needed)

Status

Experimental - per OBS ARM64 support status. Seeking beta testers with Snapdragon devices.

Related

- Add windows-arm64 and windows-ci-arm64 CMake presets
- Update buildspec.json with ARM64 dependency hashes (OBS 31.1.1, obs-deps, Qt6)
- Extend Build-Windows.ps1 and Package-Windows.ps1 to accept arm64 target
- Add windows-arm64-build CI job using windows-11-arm runner
- Add windows-arm64 artifacts to release workflow
- Create comprehensive doc/windows-arm64.md documentation

ARM64 support uses native GitHub Actions ARM64 Windows runners (no cross-compilation).
All dependencies verified available. Experimental status per OBS documentation.

Closes #TBD
Copilot AI review requested due to automatic review settings January 8, 2026 15:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This pull request adds comprehensive Windows ARM64 (Snapdragon) build support to enable the C64 Stream plugin to run natively on ARM-based Windows devices like Surface Pro. The implementation uses native ARM64 Windows runners rather than cross-compilation, with zero code changes required due to the architecture-neutral C codebase.

Key changes:

  • Added native ARM64 build infrastructure using GitHub's windows-11-arm runners
  • Updated dependency management with ARM64-specific hashes for OBS Studio 31.1.1, obs-deps, and Qt6
  • Extended release pipeline to produce ARM64 artifacts alongside existing x64 builds

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
doc/windows-arm64.md Comprehensive 359-line documentation covering installation, building, testing, and known limitations for ARM64 support
buildspec.json Added ARM64 dependency hashes for obs-studio, prebuilt obs-deps, and qt6 (including debug symbols)
CMakePresets.json Added windows-arm64 and windows-ci-arm64 configure presets with ARM64 architecture specification
.github/workflows/build-project.yaml Added windows-arm64-build job using windows-11-arm runner with ARM64-specific caching
.github/workflows/push.yaml Extended release artifacts to include windows-arm64 zip and exe packages
.github/scripts/Build-Windows.ps1 Updated parameter validation to accept 'arm64' target in addition to 'x64'
.github/scripts/Package-Windows.ps1 Updated parameter validation to accept 'arm64' target for packaging

Comment thread CMakePresets.json
Comment thread .github/workflows/push.yaml
Comment thread doc/windows-arm.md
Comment thread doc/windows-arm.md Outdated
Comment thread doc/windows-arm.md
chrisgleissner and others added 26 commits January 8, 2026 15:39
…LATFORM_NAME

Visual Studio sets CMAKE_VS_PLATFORM_NAME to 'ARM64' (not 'arm64'),
so the buildspec keys must match: windows-ARM64, not windows-arm64.
The issue was that when multiple detection clusters had overlapping onset
lookback windows, the same pop could be counted twice. For example:
- Cluster A detected at frame 30, looks back and finds onset at frame 28
- Cluster B detected at frame 32, looks back and finds onset at frame 30
- Both get reported, even though they're the same pop

Fix: Deduplicate by true_idx AFTER onset lookback, not before.
This ensures overlapping lookbacks don't create duplicate events.
- Add windows-x64-smoke-test job after windows-build
- Add windows-arm64-smoke-test job after windows-arm64-build
- Both jobs install OBS, install plugin, launch OBS with logging
- Verify plugin loads without errors by parsing OBS logs
- Ensures plugin is loadable on both architectures
- Remove docker image dependency (Windows builds don't use Docker)
- Add 3 explicit assertions per smoke test:
  1. Plugin DLL loaded (check for c64stream.dll in logs)
  2. Plugin registered (check for source registration)
  3. No critical errors (check error patterns)
- Combine stdout and stderr for complete log coverage
- Increase startup wait time to 10s for reliable plugin loading
- Add clear pass/fail messages for each assertion
- Create windows-smoke-test.yaml reusable workflow
- Eliminate 200+ lines of duplicated test code
- Both x64 and ARM64 smoke tests now call the same workflow
- Pass architecture-specific parameters (runner, artifact pattern, etc.)
- Maintains all assertions and functionality
- OBS 31.1.1 installers no longer available (404 error)
- Update to latest OBS 32.0.4
- Fix ARM64 suffix: -arm64 (lowercase) not -ARM64
- ARM64 has no installer, only zip file
- x64 uses installer as before
- Extract ARM64 zip directly to Program Files
- OBS crashes when --portable flag used without config dir
- Create obs-portable/config/obs-studio directory structure
- Set working directory to portable dir when launching OBS
OBS was failing with sentinel file directory errors in portable mode.
Switch to normal mode with --disable-shutdown-check flag.
OBS was failing to create sentinel file in AppData\Roaming\obs-studio.
Pre-create the directory to avoid the error.
Start-Process with RedirectStandardOutput wasn't capturing logs.
Switch to cmd /c with background start and output redirection.
OBS is a GUI app that never exits - it was hanging the tests.
Now start OBS async, monitor log for plugin loading activity,
and kill OBS once we detect plugins are loaded (or timeout).
Monitor logs specifically for c64stream plugin.
Only terminate OBS when:
- c64stream is detected without errors/warnings, OR
- 30 second timeout is reached

Provides progress updates every 5 seconds.
- Print OBS log output in real-time as it's generated
- Track file size and only print new content
- Prefix monitoring messages with [Monitor] for clarity
- Remove duplicate log output after completion
- Makes debugging much easier by seeing logs as they happen
OBS doesn't write to stdout/stderr when launched as GUI app.
Instead, it creates log files in $APPDATA/obs-studio/logs/.

Changes:
- Remove RedirectStandardOutput (doesn't capture OBS logs)
- Find the most recent .txt file in obs-studio/logs directory
- Wait 3 seconds for OBS to start and create log file
- Monitor the actual OBS log file for c64stream plugin loading
OBS creates its own log file with its own timestamp format,
not the one we pre-generate. The fix:

1. Start OBS without pre-generating a log filename
2. Poll the logs directory for up to 10 seconds
3. Find the most recent .txt file (created in last 15 seconds)
4. Monitor that file for c64stream plugin loading

This matches the approach used in Linux e2e tests (e2e.py:1828-1850).
Fixed missing '}' and uninitialized variables that caused parser error.
Converted multi-line here-string to single-line string literal
to avoid YAML parser confusion with colons in C# attributes.
- Set working directory to C:\Program Files\obs-studio\bin\64bit before LoadLibrary
- Install plugin to C:\ProgramData\obs-studio\plugins per Windows x64 instructions
- Use SetDllDirectory to add OBS bin to DLL search path
- Add detailed diagnostics for dependency resolution
- Verify obs.dll and w32-pthreads.dll are present before LoadLibrary

This fixes LoadLibrary error 126 (ERROR_MOD_NOT_FOUND) by ensuring the
Windows DLL loader can find obs.dll and other OBS runtime dependencies.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Updated instructions for firewall settings and plugin installation.
Change header format for Windows (ARM64 - Experimental) section.
Updated Linux compatibility information to include Fedora 40 and Arch Linux.
Updated verification information for Linux distributions.
@chrisgleissner chrisgleissner merged commit 4020d52 into main Jan 9, 2026
12 checks passed
@chrisgleissner chrisgleissner deleted the feat/windows-arm branch January 9, 2026 17:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants