Thank you for your interest in contributing to SoundSwitch! This document outlines the standards, conventions, and processes for contributing code, translations, and documentation.
Be respectful, constructive, and inclusive. SoundSwitch is a community tool used by audio enthusiasts, gamers, and professionals. Feedback and contributions are welcome from everyone.
- Search the existing issues to avoid duplicates.
- If no existing issue matches, create a new one with:
- A clear, descriptive title.
- Steps to reproduce.
- Expected vs. actual behavior.
- SoundSwitch version (
Help → Aboutin the app). - Windows version and audio device information.
- Log files (exported from Settings → Troubleshooting → Export Log Files).
- Search existing issues and discussions to avoid duplicates.
- Create a new issue describing:
- The problem you're trying to solve.
- How the proposed feature addresses it.
- Any alternative approaches you've considered.
- Fork the repository.
- Create a branch from
devwith a descriptive name (fix/audio-device-cleanup,feat/profile-restore). - Make your changes following the conventions described below.
- Build the solution (
dotnet build SoundSwitch.sln -c Debug) to verify compilation. - Run the test suite (
dotnet test SoundSwitch.sln) to ensure everything passes. - Submit a pull request targeting the
devbranch.
- C# across all projects.
- .NET 10 (see
global.jsonfor SDK version pinning). - WinForms for the user interface.
- Core Audio API (Windows) for audio device management.
- Follow the existing
.editorconfigand.DotSettingsfor style rules. - Use
NameCleanover raw device names when dealing with displayed audio device names. - Prefer small, targeted fixes over broad refactors.
- Keep user-facing strings in localization resources (
.resxfiles), not hardcoded. - Treat this as a Windows desktop app first; avoid cross-platform assumptions in WinForms and Windows integration code.
- Each project has a clear responsibility. See the Architecture Overview for details.
- Keep
SoundSwitch.Common/as the sole location for shared utilities. - Audio device management lives in
SoundSwitch.Audio.Manager/; the UI layer should not directly call Windows audio APIs. - Inter-process communication is handled by
SoundSwitch.IPC/; CLI and UI communicate through this layer.
SoundSwitch uses Conventional Commits with a custom configuration for automatic semantic versioning and changelog generation.
type(scope): description
[optional body explaining WHY, not what]
[optional footer with breaking changes or issue refs]
| Type | Effect |
|---|---|
feat |
Minor release version bump |
fix |
Patch version bump |
perf |
Patch version bump |
lang |
Patch version bump (translation updates) |
boost |
Patch version bump (performance improvements) |
revert |
Patch version bump |
tests |
No version bump (logged in release notes only) |
docs |
No version bump |
ci |
No version bump |
build |
No version bump |
Use module-style scopes to indicate which area of the codebase the change affects:
fix(localization): ...feat(audio-manager): ...perf(ui): ...lang(es-ES): ...(for Spanish translation)
To trigger a major release, append ! to the type:
feat(api)!: change device switching API signature
BREAKING CHANGE: The `SwitchDevice` method now requires a `DeviceType` enum parameter.
- Target the
devbranch for features and fixes. - Target
masterorbetafor release-related changes. - Include a clear description of what changed and why.
- Link to related issues using
#1234syntax. - For UI changes, include "before" and "after" screenshots.
- For new features, consider whether tests are needed and update test coverage accordingly.
SoundSwitch supports 20+ languages. Translations are community-maintained via Weblate.
- Visit Weblate to translate or improve existing languages.
- Translation changes from Weblate are periodically synced back to the repository as
lang(scope)commits. - If you want to add a new language, start by adding it on Weblate.
The live documentation site is built with VuePress and lives in website/. For contributions, edit the markdown files in website/src/ and run npm run docs:dev locally to preview.
This docs/ folder contains developer-facing guides. Update or add files here when contributing architectural changes.
First, build the solution to verify compilation:
dotnet build SoundSwitch.sln -c DebugThen run the test suite:
dotnet test SoundSwitch.sln -c Debug- Any change to
SoundSwitch.Audio.Manager/should have corresponding test coverage inSoundSwitch.Audio.Manager.Tests/. - Changes to UI logic should be tested manually; automated UI testing is limited.
- Localization changes should be validated by launching the app in the target language.
Releases are fully automated via semantic-release:
- Commits to
masterorbetatrigger the release GitHub Action. - The commit-analyzer determines the next version.
- Version numbers in
SoundSwitch/Properties/AssemblyInfo.csare updated. - The changelog is generated and committed.
- The solution is built, and installers are created.
- A GitHub Release draft is created with release notes.
Contributors don't need to worry about versioning — just follow the conventional commit format and the system handles the rest.