Classic desktop audio player — .NET 8 + WPF + NAudio.
Amp is a compact skinnable Windows player inspired by classic Winamp/VLC-era desktop controls. It supports local playback, tag/codec display, playlist persistence, M3U import/export, shuffle/repeat, volume, a small VU visualization, and a 10-band equalizer.
- .NET 8 SDK
- Windows 10/11 for the WPF app
dotnet build
dotnet run --project src\Amp.AppOn first launch, the playlist is seeded from samples/test.mp3 when that file is present. If the sample is missing, Amp starts with an empty playlist and still builds normally.
Later runs restore from %AppData%\Amp\profile.json.
- Playback: play, pause, resume, stop, previous, next, seek.
- Supported local file types:
.mp3,.wav,.aif,.aiff. - ID3/basic metadata display: artist/title/album/year/genre where available.
- Codec summaries: container/codec, bitrate, sample rate, channel layout, bit depth, duration where available.
- Explicit playlist import/export:
.m3uand.m3u8. - Automatic profile restore: playlist paths, current track, active skin, volume, EQ, shuffle, repeat.
- Missing-file safe playlists: missing restored/imported entries remain visible as
(not found). - Playback modes: shuffle, repeat all, repeat one.
- Audio controls: volume slider and 10-band equalizer.
- Small stereo VU visualization.
- Runtime-switchable skins:
- Compact Dark
- Classic Radio
- White Y2K
| Control | Action |
|---|---|
| ▶ / ⏸ | Play, pause, or resume |
| ■ | Stop |
| ◀◀ / ▶▶ | Previous / next track |
| Seek slider | Drag or click to seek within the current track |
| Volume slider | Adjust output volume |
| EQ sliders | Adjust 31 Hz through 16 kHz gains (-12 dB to +12 dB) |
| Reset EQ | Restore all EQ bands to 0 dB |
| Shuffle | Toggle random next-track selection |
| Repeat | Cycle Off → All → One |
| Add files / Add folder | Add supported audio files |
| Open playlist | Replace the current playlist from .m3u/.m3u8 |
| Save playlist | Export the current playlist to .m3u8/.m3u |
| Double-click row | Play that track |
| Drag audio files/folders onto window | Add supported audio files to playlist |
| Skin dropdown | Switch skins live |
Amp has two kinds of playlist persistence:
- Automatic profile restore at
%AppData%\Amp\profile.json. - User playlist files through Open/Save playlist (
.m3u/.m3u8).
M3U import ignores comments and #EXTINF lines, resolves relative paths from the playlist file directory, and preserves missing entries so moved/deleted files are visible instead of silently discarded.
M3U export writes #EXTM3U, optional #EXTINF duration/display lines, and relative paths when tracks are under the playlist file directory.
Saved to %AppData%\Amp\profile.json:
- Playlist file paths (in order)
- Current track index
- Active skin
- Volume
- Equalizer gains
- Shuffle enabled
- Repeat mode
Updated on playlist/skin/playback-mode changes and on exit.
If a saved/imported file was moved or deleted, it stays in the playlist and shows as name.ext (not found). Play/next skip unavailable tracks where possible; selecting a missing track shows File not found. without crashing.
Use the helper script from PowerShell:
.\scripts\publish-windows.ps1Default output:
artifacts\publish\win-x64\Amp.App.exe
Equivalent raw command:
dotnet publish src\Amp.App\Amp.App.csproj `
--configuration Release `
--runtime win-x64 `
--self-contained true `
--output artifacts\publish\win-x64 `
-p:PublishSingleFile=true `
-p:IncludeNativeLibrariesForSelfExtract=trueThe publish output includes the skins\ folder next to the executable.
| Variable | Purpose |
|---|---|
AMP_LOG_DIR |
Override log output directory (default: logs/ under repo root when running from source) |
AMP_SKINS_DIR |
Load skins from a custom folder instead of skins/ next to the executable |
$env:AMP_LOG_DIR = "D:\temp\amp-logs"
$env:AMP_SKINS_DIR = "D:\my-skins"
dotnet run --project src\Amp.AppEvery run writes timestamped logs to stdout and logs/amp_<timestamp>.log:
2026-06-27T12:05:07.490Z DEBUG [PlaybackService] open ok path=...\song.mp3 durationSec=59.7 sampleRate=44100 channels=2 bits=16 volume=1.00
Startup failures and unhandled UI exceptions are logged with exception details.
dotnet test tests\Amp.Core.Tests
dotnet run --project tests\Amp.SmokeThe core tests cover playlist behavior, missing-file restore, M3U import/export, metadata display fallbacks, player shuffle/repeat logic, seek behavior, and playback settings. The smoke test uses src/Amp.App/samples/test.mp3 when present; it exits successfully with a skip message if the sample is missing.
| Path | Purpose |
|---|---|
src/Amp.Core |
Playback, playlist, metadata, player orchestration, logging |
src/Amp.App |
WPF UI, skins, profile persistence |
src/Amp.App/samples/ |
Optional test.mp3 (first-run seed + smoke test) |
src/Amp.App/skins/ |
Theme packs (see skins/README.md) |
tests/Amp.Core.Tests |
Unit tests |
tests/Amp.Smoke |
Headless smoke test |
scripts/ |
Publish helpers |
logs/ |
Session logs (gitignored) |
Default skin: Compact Dark. Use the dropdown to switch to Classic Radio, White Y2K, or other installed skins.
Skin authoring: src/Amp.App/skins/README.md