Skip to content

videowall: audio mixer beneath the canvas, audio/video/both source types, microphone source, and live VU meters#19

Draft
Copilot wants to merge 7 commits into
masterfrom
copilot/canvas-source-integration
Draft

videowall: audio mixer beneath the canvas, audio/video/both source types, microphone source, and live VU meters#19
Copilot wants to merge 7 commits into
masterfrom
copilot/canvas-source-integration

Conversation

Copilot AI commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

The videowall switcher kept the audio mixer in a separate tab, treated every source as video, had no audio-input source, couldn't show a full 1920×1080 canvas without scrolling, and its VU meters never moved.

Changes

  • Mixer under the canvas with a splitterdraw_stage() stacks the canvas tabs over the Audio Mixer with a draggable horizontal splitter (height persisted in AppState::mixer_height, clamped so neither pane collapses). The mixer is no longer a tab.
  • Fit-to-view canvasdraw_editable_canvas() scales by min(scale_w, scale_h) and centers the canvas, replacing the old width-only scale in a fixed scrolling box, so the whole wall/1080p bus is visible at once.
  • Source media type — new MediaType { Video, Audio, Both } per source, defaulted per kind (default_media_type) and overridable in the prepare form. source_has_video / source_has_audio route placement: audio → mixer, video → canvas, both → both. Canvas drops reject audio-only; mixer skips video-only.
  • Microphone source — new SourceKind::Microphone (audio-only) that enumerates and connects an audio capture device via pulse_device_session_connect_device, with matching teardown and no video pipeline.
  • VU meters — the mapping was already correct (matches pexninja); meters read silence because no source captured audio. A Microphone source now feeds pulse_register_device_audio_level_callback (PULSE_MEDIA_INPUT) real input, so its meter moves. Sources with no captured audio still read silence, as expected.

Notes

The VU answer is intrinsic to the API: PULSE_MEDIA_INPUT audio levels reflect a captured input device, not decoded stream audio — so RTMP/RTSP/MP4/conference strips marked Both will read flat even though they carry audio. Routing and the mixer strip still make sense for them; only the live-meter signal is mic-specific.

enum class MediaType { Video = 0, Audio, Both };

static bool source_has_video(const ActiveSource & s)
{ return s.media_type == MediaType::Video || s.media_type == MediaType::Both; }
static bool source_has_audio(const ActiveSource & s)
{ return s.media_type == MediaType::Audio || s.media_type == MediaType::Both; }

Copilot AI changed the title Add videowall: a multi-instance Pulse compositor demo videowall: production switcher with a source library, multi-canvas placement, and per-conference send/presentation buses Jun 5, 2026
Copilot AI changed the title videowall: production switcher with a source library, multi-canvas placement, and per-conference send/presentation buses videowall: interactive canvas tiles, conference PIN codes, and a clean macOS build Jun 8, 2026
Copilot AI changed the title videowall: interactive canvas tiles, conference PIN codes, and a clean macOS build videowall: 1080p send canvas, file picker, and an audio mixer Jun 8, 2026
Copilot AI changed the title videowall: 1080p send canvas, file picker, and an audio mixer videowall: audio mixer beneath the canvas, audio/video/both source types, microphone source, and live VU meters Jun 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants