Mcaster1Studio

Broadcast Automation Software Suite — Project Plan & Status — Last updated: 2026-03-10 (v0.2.0)

Phase Status

#
Description
Key Deliverables
Status
1
Foundation — Shell + AudioEngine + VU Meters
Core.lib · Audio.lib · VUMeterModule · dark.qss · MainWindow · Surface paradigm
✓ Complete
2
Deck Module — Dual player, waveform, crossfader, BPM
DeckModule · DeckAModule · DeckBModule · WaveformView · CrossfaderWidget · DeckPlayer
✓ Complete
3
Media Library — MySQL/MariaDB, TagLib scanner, drag-to-deck
MediaLibraryModule · DatabaseManager · ScanWorker · LibraryModel · MusicBrainzLookup
✓ Complete
4
Encoder Module — 7 codecs, 7-state, DSP chain, list-view, reconnect watchdog
EncoderModule · EncoderSlot · AudioRingBuffer · IcyPusher · EncoderSlotWidget · QSplitter modules
✓ Complete
5
Effects Rack — 19" virtual rack DSP, IEffectUnit ABI, 6 DSP units
EffectsRackModule · RackSlotWidget · IEffectUnit C ABI · EQ31 · Sonic · Comp · AGC · MicPre · Stereo
✓ Complete
6
Metadata Module — ICY 2.2 full editor, 70+ fields, 8 groups
MetadataModule · Icy22EditorWidget · MetadataPusher (HTTP PUT)
✓ Complete
7
Playlist / AutoDJ — Clock templates, rotation engine, broadcast log
PlaylistModule · ClockTemplateEditor · AutoDJEngine · PlaylistWidget
✓ Complete
8
Podcast Surface — Multi-track recorder, WAV export, PTT module
PodcastModule · PTTModule · SPSC ring buffers · 20ms drain timer · WAV export
✓ Complete
9
Video / TV Surface — Video playlist, QMediaPlayer, RTMP stub
VideoModule · VideoWidget · VideoPlaylist · RTMP output stub
✓ Complete
10
Monitor Module — Icecast2/Shoutcast/DNAS polling, listener chart
MonitorModule · StatsPoller · ChartWidget (custom QPainter) · 60-sample ring
✓ Complete
A
UI Refinement — 3 themes, icons, tray, surface ribbon, event log, scheduler, clock, custom surface, drag-drop
ThemeManager · dark/classic/light QSS · SVG icons · SurfaceTray · SurfaceRibbon · SurfaceEventLog · SurfaceScheduler · ClockModule · CustomSurfaceDialog · ModuleDock float/pin
✓ Complete
B
AppRibbon — Drag-drop ribbon boxes, weather widget, compact VU meter, tab Add Module
AppRibbon · RibbonBox (drag MIME) · WeatherWidget (wttr.in) · VUMeterWidget compact mode · SurfaceTabBar right-click Add Module
✓ Complete
C
Refinement Pass — Visual polish, persistence, wiring, edge cases
Ribbon box persistence · ON AIR wiring · dock collapse · splitter size save · duplicate module guard · status bar live updates · Effects Rack default units
● In Progress
D
UI Enhancements — 3D Clock, Weather redesign, Deck history, Smart ▶, Sub-tab module add fix, Save Session, Ribbon polish
ClockWidget QPainter · WeatherWidget 3D + forecast dialog · DeckPanel track history list · Smart play button · Sub-tab “Add Module” wired · Save Session per surface · Ribbon 100px · NowPlaying removed
✓ Complete
E
Session Persistence v2 — Auto-save, rename-proof restore, sub-tab UX polish
saveAllSessionState() v2 keys · 1.5s debounce auto-save · stable index-based QSettings (rename-proof) · targetPanel→addModule() restore · double-click sub-tab renames · Save/Load removed from sub-tab menus · moduleLayoutChanged() signal · connectSurfaceAutoSave()
✓ Complete
F
Encoder Module Redesign — 7 codecs, 7-state machine, per-slot DSP, list-view UI, DNAS stats poller
EncoderConfig · EncoderDsp (10-band EQ + AGC) · EncoderListWidget · EncoderConfigDialog (5 tabs) · DnasPoller · EncoderSlot rewrite · EncoderModule rewrite
✓ Complete
G
UI Polish & Accessibility — Theme audit, DeckWidget polish, 3D SVG icons, SurfaceTray nav fix
Theme QSS audit · PTT mic fix · EncoderModule dark bleed strip · DeckWidget 12px fonts · SVG 3D icons (play/pause/stop/cue/loop/eject) · SurfaceTray tab nav · tooltips everywhere
✓ Complete
H
Audio Engine + SQLite DB — IDatabase, HTTP streaming, ICY 1.x/2.2, CartWall, Deck Browser Tabs
IDatabase · SqliteManager · StreamReader (FFmpeg+ICY) · DeckPlayer HTTP · CartWallModule · CartPlayer · Deck browser tabs (History/Library/Playlist/Queue)
✓ Complete
I
Metadata Flow + VU Meters — Rich ICY from both decks, encoder VU panel, deck VU redesign
Dual-deck metadata wiring · IcyMetadata enrichment (genre/year/BPM) · EncoderVuPanel (hi-res) · DeckInlineMeter smooth gradient redesign · Post-gain peak metering fix
✓ Complete
11
SDK — Public plugin API, DLL discovery, developer docs
ModuleRegistry public API · IModuleHost interface · Dynamic Add Module menus · SampleModule DLL · SampleEffect DLL · Plugin auto-deploy · Developer Guide
✓ Complete
CH
Church Surface — 12 domain-specific modules for live church services
TimerClockModule · GraphicsEngineModule · LyricsCasterModule · ScriptureCasterModule · AnnounceCasterModule · TelePromptModule · MediaCasterModule · StageMonModule · AudioMixModule · TranscribeRecModule · SwitchCasterModule · ServiceRunnerModule · wireChurchModules() cross-wiring
✓ Complete
PD
Podcast Surface — 13 professional podcast production modules
PodMixerModule · PodPTTModule · PodRecorderModule · PodSoundboardModule · PodFXModule · PodEditorModule · PodEncodeModule · PodTranscribeModule · PodShowNotesModule · PodRSSModule · PodPublisherModule · PodAnalyticsModule · PodRemoteModule · 13 SVG icons
✓ Complete
HL
System Health Module — CPU/memory/encoder monitoring + Prometheus metrics
HealthModule · HealthWidget · MetricsServer · health.svg icon
✓ Complete
DB
Database Architecture — 5-backend IDatabase, per-surface DB isolation, live wiring
DatabaseModule · 5 backends (SQLite/MySQL/PostgreSQL/Firebird/MSSQL) · DatabaseFactory registration · SqlDialect multi-backend DDL · DbServerRegistry (QObject + signals) · SurfaceDbContext live createConnection() · IDbAwareModule live injection · PreferencesDialog live push · MainWindow pushDbContextToSurface() · Integration tests (77 pass) · database.svg icon
✓ Complete
BF
Bug Fix — Module containment (floating docks escape canvas bounds)
ModuleDock qBound clamp · SubSurfacePanel float-transition clamp · ResizableWidget edge-resize clamp · Session restore clamp · 6 fix locations
✓ Complete
BF2
Bug Fix — Module dock positions/sizes not persisting across sessions
Column structure save/restore · Remove conflicting YAML override · 3 root causes fixed
✓ Complete
K
Surface Isolation, Multi-Monitor & Display Management
DbServerRegistry · SurfaceDbContext · Per-surface DB isolation · SurfaceCreationWizard · SurfaceWindow pop-out · MonitorManager · GPU/capture enum · "Send to Monitor" · YAML failover · Extended schema
Planned
12
Installer + Polish + AuxDeck — NSIS installer, test harnesses, AudioPipe integration
AuxDeckModule (per-deck audio routing) · NSIS installer (user-dir install) · Mcaster1AudioPipe prefs integration · Auto version bump · 6 test harnesses · Getting Started guide · 43 built-in modules
✓ Done

Bug Fix — Module Containment (2026-03-10)

Fixed: Floating module docks escaping sub-surface canvas bounds

Bug Fix 2 — Module Dock Layout Persistence (2026-03-10)

Fixed: Module dock positions, sizes, and column groupings not saving/restoring across sessions

Phase K — Surface Isolation, Multi-Monitor & Display Management (Planned)

Planned — Full architectural plan →

Phase I — Metadata Flow + VU Meters Completed (2026-03-08)

Completed in Phase I:

Phase CH — Church Surface Completed (2026-03-09)

Completed in Phase CH:

Phase PD — Podcast Surface Completed (2026-03-10)

Completed in Phase PD:

Phase DB — Database Module Completed (2026-03-10)

Completed in Phase DB:

Phase 12 — Installer + Polish + AuxDeck Completed (2026-03-14)

Completed in Phase 12:

Golden Path — Per-Surface Thread Pools + CPU Affinity (2026-03-14)

Completed in Golden Path:

Phase E — Session Persistence v2 Completed (2026-03-05)

Completed in Phase E:

Phase F — Encoder Module Redesign Completed (2026-03-06)

Completed in Phase F:

Phase 11 — SDK & Public Plugin System Completed (2026-03-06)

Completed in Phase 11:

Phase H — Audio Engine + SQLite DB Completed (2026-03-06)

Completed in Phase H (H.1–H.7):

Phase G — UI Polish & Accessibility Completed (2026-03-06)

Completed in Phase G:

Phase D — UI Enhancements Completed (2026-03-05)

Completed in Phase D:

Phase C — Refinement Backlog

Remaining items for Phase C refinement pass:

Resolved in Phase E: Sub-surface session save/restore (v2 auto-save + stable keys + rename-proof restore)

Resolved in Phase G: Theme dark-bleed from Encoder/PTT modules; DeckWidget font sizes; PTT mic always-on; SurfaceTray navigation to correct sub-tab

Technology Stack

ComponentChoice
LanguageC++20 · MSVC v143 · /MP parallel build
UIQt 6.8.3 LTS (Widgets + Network + Multimedia + Svg)
BuildCMake 3.28+ · VS2022 generator · vcpkg x64-windows
Audio I/OPortAudio 19.7 + ASIO SDK (vcpkg portaudio[asio])
Codecslibopusenc · libvorbis · libFLAC · fdk-aac · LAME (external)
VideoFFmpeg 8.0.1
DatabaseSQLite3 · MySQL/MariaDB · PostgreSQL · Firebird · SQL Server (ODBC) — 5-backend architecture via DatabaseFactory
Tag ReadingTagLib 2.1.1 (compiled /EHa)
HTTPQt6::Network (weather, ICY) · libcurl 8.18 (monitor, metadata push)
Plugin ABIDLL C ABI factory functions
Qt lock: Always use C:/Qt/6.8.3/msvc2022_64.
Qt 6.9.1 and 6.10.2 MSVC are missing Qt6Config.cmake.
CMake configure:
cmake -B build -G "Visual Studio 17 2022" -A x64 \
  -DCMAKE_TOOLCHAIN_FILE=.../vcpkg/scripts/buildsystems/vcpkg.cmake \
  -DVCPKG_TARGET_TRIPLET=x64-windows \
  -DCMAKE_PREFIX_PATH="C:/Qt/6.8.3/msvc2022_64"
Build: cmake --build build --config Debug
Run: build\bin\Debug\Mcaster1Studio.exe

Surface Paradigm

SurfaceIntentDefault Modules
AlphaPrimary radio broadcastVU Meter · Deck A+B · Media Library · Encoder · Playlist
BetaSecondary / backup broadcastDeck A+B · Encoder · VU Meter
CompanyCorporate streamingPlaylist · Encoder · Metadata · Monitor
DJLive DJ performanceDeck A+B · Crossfader · Effects Rack · VU Meter
EntertainmentTV / Video automationVideo · Encoder · Playlist
SocialSocialcasting + RTMPEncoder · Metadata · Monitor
PodcastProfessional podcast productionPTT · Podcast · Effects Rack · Media Library + 13 podcast modules (Mixer · PTT · Recorder · Soundboard · FX · Editor · Encode · Transcribe · ShowNotes · RSS · Publisher · Analytics · Remote)
ChurchChurch AV + stream + podcastPTT · Encoder · VU Meter · Video · Media Library + 12 church modules (TimerClock · Graphics · Lyrics · Scripture · Announce · TelePrompt · MediaCaster · StageMon · AudioMix · TranscribeRec · SwitchCaster · ServiceRunner)
CustomUser-definedAny modules — chosen via Custom Surface dialog

Module Catalog

ModulePlugin IDPhaseStatus
VUMeterModulecom.mcaster1.vumeter1✓ Done
DeckModule (Combined)com.mcaster1.deck2✓ Done
DeckAModulecom.mcaster1.deck.a2✓ Done
DeckBModulecom.mcaster1.deck.b2✓ Done
MediaLibraryModulecom.mcaster1.library3✓ Done
EncoderModulecom.mcaster1.encoder4✓ Done
EffectsRackModulecom.mcaster1.effects5✓ Done
MetadataModulecom.mcaster1.metadata6✓ Done
PlaylistModulecom.mcaster1.playlist7✓ Done
PodcastModulecom.mcaster1.podcast8✓ Done
PTTModulecom.mcaster1.ptt8✓ Done
VideoModulecom.mcaster1.video9✓ Done
MonitorModulecom.mcaster1.monitor10✓ Done
ClockModulecom.mcaster1.clockA✓ Done
QueueModule (AutoDJ)com.mcaster1.queueB✓ Done
CartWallModulecom.mcaster1.cartwallH✓ Done
Church Surface Modules
TimerClockModulecom.mcaster1.church.timerclockCH✓ Done
GraphicsEngineModulecom.mcaster1.church.graphicsCH✓ Done
LyricsCasterModulecom.mcaster1.church.lyricsCH✓ Done
ScriptureCasterModulecom.mcaster1.church.scriptureCH✓ Done
AnnounceCasterModulecom.mcaster1.church.announceCH✓ Done
TelePromptModulecom.mcaster1.church.telepromptCH✓ Done
MediaCasterModulecom.mcaster1.church.mediacasterCH✓ Done
StageMonModulecom.mcaster1.church.stagemonCH✓ Done
AudioMixModulecom.mcaster1.church.audiomixCH✓ Done
TranscribeRecModulecom.mcaster1.church.transcriberecCH✓ Done
SwitchCasterModulecom.mcaster1.church.switchcasterCH✓ Done
ServiceRunnerModulecom.mcaster1.church.servicerunnerCH✓ Done
Podcast Surface Modules
PodMixerModulecom.mcaster1.podcast.mixerPD✓ Done
PodPTTModulecom.mcaster1.podcast.pttPD✓ Done
PodRecorderModulecom.mcaster1.podcast.recorderPD✓ Done
PodSoundboardModulecom.mcaster1.podcast.soundboardPD✓ Done
PodFXModulecom.mcaster1.podcast.fxPD✓ Done
PodEditorModulecom.mcaster1.podcast.editorPD✓ Done
PodEncodeModulecom.mcaster1.podcast.encodePD✓ Done
PodTranscribeModulecom.mcaster1.podcast.transcribePD✓ Done
PodShowNotesModulecom.mcaster1.podcast.shownotesPD✓ Done
PodRSSModulecom.mcaster1.podcast.rssPD✓ Done
PodPublisherModulecom.mcaster1.podcast.publisherPD✓ Done
PodAnalyticsModulecom.mcaster1.podcast.analyticsPD✓ Done
PodRemoteModulecom.mcaster1.podcast.remotePD✓ Done
System Modules
HealthModulecom.mcaster1.healthHL✓ Done
DatabaseModulecom.mcaster1.databaseDB✓ Done

ICY Protocol Compliance

Non-negotiable rule: ALL encoder targets MUST send ICY 1.x StreamTitle= even when also sending ICY 2.2. Backward compatibility is mandatory.
ServerICY 1.xICY 2.2Method
Icecast2✓ Required✗ N/AHTTP GET /admin/metadata?mode=updinfo&song=…
Shoutcast v1/v2✓ Required✗ N/AIn-stream at icy-metaint boundaries
Mcaster1DNAS✓ Required✓ RequiredHTTP PUT + Icy-Version: 2.2 header

ICY 2.2 Field Groups

GroupPrefixKey Fields
1 — Stationicy2-station-*id · name · logo · genre · url · language
2 — Showicy2-show-*title · host · start · end · next · description
3 — Trackicy2-track-*title · artist · album · year · genre · artwork · bpm · key · isrc · mbid · label
4 — DJicy2-dj-*handle · name · bio · avatar · website · email
GroupPrefixKey Fields
5 — Socialicy2-social-*twitter · instagram · tiktok · youtube · facebook · twitch · linktree · hashtags
6 — Podcasticy2-podcast-*title · episode · season · feed · guid · duration · chapter
7 — Broadcasticy2-broadcast-*mode · relay · cdn · lufs · codec · samplerate · channels
8 — Contenticy2-content-*explicit · live · type (radio|tv|podcast|socialcast) · rating

Encoder Architecture (Phase F)

7 Codecs: MP3 (LAME, if found), Opus (libopusenc), Vorbis (libvorbis), FLAC (libFLAC), AAC-LC / HE-AAC-v1 / HE-AAC-v2 (fdk-aac, if found)

7-State Machine: Idle → Starting → Connecting → Streaming → Reconnecting → Sleep → Error
  • wake() transitions Sleep → Connecting
  • setPttActive(bool) forwards to EncoderDsp for duck attenuation

Input Sources: LiveDeckMix (ring buffer from onAudioBlock), PortAudio device, WASAPI loopback

Per-slot DSP chain (EncoderDsp, runs in encoder thread):
Input Gain → 10-band biquad EQ (RBJ, 6 presets) → Feedforward AGC + hard limiter → PTT duck (50ms ramp)

RT threadEncoderModule::onAudioBlock()AudioRingBuffer::write() (lock-free)
Encoder threadEncoderDsp::process()encodePcm()IcyPusher::push() → TCP socket

DnasPoller — QThread background, polls /admin/stats XML every 15s, emits statsUpdated signal
EncoderListWidget — QTableWidget with 2s refresh timer, double-click → EncoderConfigDialog (5 tabs)

Icecast2 SOURCE Handshake

SOURCE /stream HTTP/1.0
Authorization: Basic base64(source:password)
Content-Type: audio/ogg   (or audio/mpeg, audio/flac, audio/aac per codec)
ice-name: Station Name
ice-genre: Various
ice-bitrate: 128
ice-public: 0
User-Agent: Mcaster1Studio/1.0.0
[Icy-Version: 2.2]   ← DNAS targets only

→ HTTP/1.0 200 OK
→ [raw encoded bytestream…]

Critical Rules

RuleReason
Never #include <version> or create file named VERSIONCollides with C++20 header on Windows case-insensitive FS
TagLib: .to8Bit(true) + QString::fromStdString()Never call .toWString() across DLL boundary
TagLib: compile with /EHaSEH exception safety on corrupt files
onAudioBlock(): no Qt, no alloc, no mutex waitCalled from PortAudio RT callback — hard latency constraint
QApplication::setStyle("Fusion")Windows11 style ignores QSS; Fusion is required for all theming
ICY 1.x StreamTitle= always sent even with ICY 2.2Backward compat — all clients need ICY 1.x
qt_add_executable() not add_executable()Triggers MOC/RCC/UIC auto-generation
Never use slots as variable/member nameQt macro #define slots — use clockSlots, encoderSlots, etc.
VUMeterWidget compact mode via setCompact(true)Same class; switches rendering path + sizeHint; wire EventBus separately for compact instances
RibbonBox drag MIME: application/x-m1-ribbon-boxPointer as hex string; distinct from module dock MIME application/x-m1-module-dock

Ecosystem Siblings

ProjectPathRelation to Studio
Mcaster1DNAS../mcaster1dnas/ICY 2.2 streaming server — DNAS encoder target
Mcaster1DSPEncoder../Mcaster1DSPEncoder/Encoder reference (LAME/Opus/AAC/FLAC patterns)
Mcaster1TagStack../Mcaster1TagStack/MySQL schema reference · ICY 2.2 editor reference
Mcaster1Castit../Mcaster1CastIt/Stats monitor reference for Phase 10
Mcaster1AudioPipe../Mcaster1AudioPipe/Virtual audio routing — zero-latency pipe devices for AUX Deck + encoder chaining