A network-enabled soundboard application for Windows with web interface and virtual audio cable integration.
RSoundBoard is a Windows application that lets you play sound effects from any device on your network. Control your soundboard from your phone, tablet, or another computer while the audio plays on your Windows PC. Perfect for streaming, gaming, and Discord calls!
- 🌐 Web Interface - Control from any device on your network via browser
- 🎵 Local Audio Playback - Sounds play on your Windows PC, not in the browser
- 🎮 Gaming & Streaming Ready - Works perfectly with Discord, OBS, games, and virtual audio cables
- 📱 Mobile Friendly - Responsive design works great on phones and tablets
- 🎯 Simple Management - Easy-to-use Windows interface for organizing sounds
- 🚀 No Installation Required - Single executable file, just download and run
- Download the latest
RSoundBoard.exefrom the Releases page - Run the executable - no installation needed
- Allow Firewall Access when Windows prompts you (required for network access)
- The application starts on port 5000 by default
- Launch
RSoundBoard.exe - The management window opens automatically
- Click "Add Button" to add your first sound:
- Enter a label (e.g., "Applause", "Airhorn")
- Select your sound file (WAV or MP3)
- Optionally set a group name for organization
- Set the order number (lower numbers appear first)
- Click "Open Web Interface" to view your soundboard
From the Web Interface:
- Open a browser and go to
http://localhost:5000 - Click any button to play that sound
- Playing a new sound stops the current one
From Other Devices:
- Find your PC's IP address (shown in the management window or use
ipconfigin CMD) - Open
http://YOUR-PC-IP:5000in any browser on your network - Example:
http://192.168.1.100:5000
To use RSoundBoard with games, Discord, or streaming software, you need to route the audio properly. Voicemeeter is a free virtual audio mixer that makes this easy.
- Download & Install Voicemeeter Banana (free)
- Restart your computer after installation
- Launch Voicemeeter Banana
Step 1: Set Windows Audio Output
- Right-click the speaker icon in Windows system tray
- Select "Sound Settings" → "Output Device"
- Choose "Voicemeeter Input (VB-Audio Voicemeeter VAIO)"
Step 2: Configure RSoundBoard Output
- In RSoundBoard, set the output device to a virtual cable (e.g., "Voicemeeter AUX Input (VB-Audio Voicemeeter VAIO)")
- Alternatively, you can keep the default output which is already routed to Voicemeeter (Step 1)
Step 3: Configure Voicemeeter
- Hardware Input 1: Your microphone
- Hardware Out A1: Your headphones/speakers (for you to hear)
- Hardware Out A2: VB-Audio Cable (for Discord/apps to receive)
- Set the routing in Voicemeeter:
- For your microphone: Enable A1 (you hear it) and A2 (Discord hears it)
- For RSoundBoard output: Enable A1 (you hear it) and disable A2 (Discord does NOT hear game audio + individual volume controle)
Step 4: Configure Discord/OBS
- In Discord: Settings → Voice & Video → Input Device → "Voicemeeter Output B2"
- In OBS: Add Audio Source → Select "Voicemeeter Output B2"
- ✅ You hear: Game audio + Discord voices + Soundboard
- ✅ Discord/Stream hears: Your microphone + Soundboard
- ✅ Discord/Stream does NOT hear: Your game audio (unless you want them to)
- Set RSoundBoard input to your microphone
- Set RSoundBoard output to VB-Audio Cable
- Set Discord input to VB-Audio Cable Output
No sound playing?
- Check if the correct output device is selected in Windows Sound Settings
- Verify the sound file path is correct in RSoundBoard
- Make sure Voicemeeter is running
Discord can't hear sounds?
- Check Discord input device is set to the virtual cable
- Ensure Voicemeeter's A2 output is enabled and routed correctly
- Test the virtual cable with Windows Sound Recorder
Web interface not loading?
- Check if Windows Firewall is blocking port 5000
- Verify you're using the correct IP address
- Try accessing from localhost first:
http://localhost:5000
RSoundBoard has no authentication and is designed for use on trusted local networks only. Anyone on your network can access and play sounds. Do not expose it to the public internet.
- Configuration File:
%APPDATA%\RSoundBoard\soundboard_data.json - Sound Files: Stored wherever you choose; the configuration only saves the path
- Organize with Groups: Use group names like "Music", "Effects", "Memes" to keep things tidy
- Mobile Bookmark: Save the web interface URL as a home screen bookmark on your phone
- Wireless Control: Perfect for streamers who want soundboard control away from the PC
- Framework: .NET 8 (net8.0-windows)
- Language: C# 12 with nullable reference types enabled
- Web Server: ASP.NET Core Minimal API (Kestrel)
- Audio Engine: NAudio 2.2.1
- Desktop UI: Windows Forms
- Deployment: Single-file self-contained executable (win-x64)
The application follows a service-based architecture with dependency injection:
- Presentation Layer: Windows Forms (management UI) + Static HTML/CSS/JS (web UI)
- API Layer: ASP.NET Core Minimal API endpoints
- Business Logic: Service classes (
SoundService,SettingsService) - Data Access: Repository pattern (
ButtonRepository) - Data Storage: JSON file persistence
RSoundBoard/
├── Program.cs # Entry point - configures DI, starts web server & WinForms
├── Models/
│ └── SoundButton.cs # Data model for sound buttons
├── Services/
│ ├── ButtonRepository.cs # JSON-based persistence
│ ├── SoundService.cs # NAudio wrapper for audio playback
│ └── SettingsService.cs # Application settings management
├── HostUI/
│ ├── MainForm.cs # Main management window
│ └── ButtonEditDialog.cs # Button add/edit dialog
└── wwwroot/
├── index.html # Web soundboard interface
└── style.css # Styling for web interface
Generated at runtime:
├── soundboard_data.json # Button configuration
└── settings.json # Application settings
- Windows 10/11
- .NET 8 SDK or later
- Visual Studio 2022 or VS Code with C# extension
Clone the repository:
git clone https://github.com/Indiana8000/RSoundBoard.git
cd RSoundBoardRestore dependencies:
dotnet restoreRun in development mode:
dotnet runBuild for release:
dotnet build -c ReleasePublish as single-file executable:
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=trueOutput location: bin/Release/net8.0-windows/win-x64/publish/RSoundBoard.exe
All API endpoints return JSON and follow REST conventions.
Returns all sound buttons.
Response:
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"label": "Applause",
"filePath": "C:\\Sounds\\applause.wav",
"group": "Effects",
"order": 0
}
]Plays the sound with the specified GUID.
Response: 200 OK or 404 Not Found
Stops the currently playing sound.
Response: 200 OK
Creates a new sound button.
Request Body:
{
"label": "New Sound",
"filePath": "C:\\path\\to\\sound.mp3",
"group": "Group Name",
"order": 10
}Response: 201 Created with created button object
Updates an existing button.
Request Body: Same as POST
Response: 200 OK or 404 Not Found
Deletes a button.
Response: 200 OK or 404 Not Found
SoundService
- Manages NAudio
IWavePlayerandAudioFileReaderinstances - Ensures only one sound plays at a time
- Thread-safe using
SemaphoreSlim - Implements proper disposal pattern
ButtonRepository
- CRUD operations for
SoundButtonentities - JSON file persistence
- Thread-safe read/write operations
SettingsService
- Stores and retrieves application settings (e.g., output device)
- JSON-based configuration file
Services are registered as singletons in Program.cs:
builder.Services.AddSingleton<ButtonRepository>();
builder.Services.AddSingleton<SoundService>();
builder.Services.AddSingleton<SettingsService>();Uses NAudio library:
WaveOutEventfor audio outputAudioFileReaderfor reading MP3/WAV files- Supports device selection via device number
- Listens on
http://0.0.0.0:5000(all network interfaces) - Serves static files from embedded resources
- Minimal API pattern for endpoints
- No HTTPS (designed for LAN use)
Follow the project's established conventions (see .github/copilot-instructions.md):
- Nullable Reference Types: Enabled - use
?for nullable types - Implicit Usings: Enabled - avoid redundant using statements
- Var keyword: Use
varwhen type is obvious - String initialization: Use
string.Emptyinstead of"" - Async/Await: Use async methods consistently
- Naming:
- Classes, Methods, Properties:
PascalCase - Private fields:
_camelCase - Parameters, locals:
camelCase
- Classes, Methods, Properties:
Currently, the project does not include automated tests. Contributions adding unit and integration tests are welcome.
- Add/Edit/Delete buttons via desktop UI
- Play sounds from web interface
- Test from mobile device on same network
- Verify only one sound plays at a time
- Check audio device selection (if multiple devices available)
- Verify JSON persistence after app restart
Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Follow code style guidelines (see above)
- Test your changes thoroughly
- Commit with clear messages in English
- Submit a pull request
- Audio format support (FLAC, OGG, etc.)
- Volume control per button
- Hotkey support
- Sound preview in management UI
- Authentication/authorization for web interface
- Automated tests
This project is licensed under a proprietary license that allows:
- ✅ Free personal and commercial use (integration, streaming, business operations)
- ✅ Modification and redistribution (non-commercial)
- ❌ Direct monetization (selling the software or charging for access)
See the LICENSE file for complete terms and conditions.
AI Training Restriction: This codebase may NOT be used for AI/ML training. See LICENSE-AI-RESTRICTION for details.
- NAudio - Audio playback library
- Voicemeeter - Virtual audio mixing (recommended companion software)
Repository: https://github.com/Indiana8000/RSoundBoard

