Add Windows ARM64 Build Support#80
Merged
Merged
Conversation
- 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
Contributor
There was a problem hiding this comment.
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 |
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add Windows ARM64 (Snapdragon) build support for Surface Pro and other ARM Windows devices.
see #75
Changes
Implementation Approach
Testing
Status
Experimental - per OBS ARM64 support status. Seeking beta testers with Snapdragon devices.
Related