Creator ruling (2026-10-30): TRAX is background music and is controlled separately from desktop and mic — so KISS it: - TRAX loses its own ladder and slider. It is one number plus ±5 dB buttons, disabled at the ends (−60 dB floor, +6 dB ceiling). - It STARTS at −50 dB, taken from the creator's own meter readings, and moves in 5 dB clicks. If that proves inaudible on their setup, six clicks lands at −20 — the buttons exist for exactly that, and `TraxDefaultDb` is one constant. - Layout follows: Desktop's volume now sits directly beneath its ladder, and the TRAX row (name, play/pause, level) sits beneath that, inside the GAME bay. The bays are MIC | GAME+TRAX | LIP-SYNC. - The metering tap on the player stays (it is how "is the music producing sound" is answered) but has no ladder of its own; the desktop bed already shows the music. Guards updated: TraxBayTests now asserts the stepper wiring and that the row has NO SegmentMeter; GameBayTests asserts the desktop fader sits below the desktop ladder.
52 lines
2.7 KiB
C#
52 lines
2.7 KiB
C#
using Xunit;
|
||
using ytLive.Helpers;
|
||
using ytLive.Services.Audio;
|
||
using ytLive.ViewModels;
|
||
|
||
namespace ytLive.Tests;
|
||
|
||
/// <summary>The TRAX bay shows the track, plays/pauses it, and carries a level — but no meter:
|
||
/// nothing measures the bed, and a decorative ladder would be a lie. Its fader moves a gain the
|
||
/// player actually applies, separate from the desktop-mute follow.
|
||
/// </summary>
|
||
public class TraxBayTests
|
||
{
|
||
[Fact]
|
||
public void The_trax_bay_binds_the_track_level_and_play_state_without_inventing_a_meter()
|
||
{
|
||
var dock = SourceAssert.Text("Controls", "AudioDock.xaml");
|
||
Assert.Contains("Text=\"{Binding TraxTrackLabel}\"", dock);
|
||
// KISS (creator 2026-10-30): background music is one number and two ±5 dB buttons, not a
|
||
// channel strip — and it has no ladder of its own, because the desktop bed already carries it.
|
||
Assert.Contains("Click=\"TraxStepDown_Click\"", dock);
|
||
Assert.Contains("Click=\"TraxStepUp_Click\"", dock);
|
||
Assert.Contains("IsEnabled=\"{Binding CanLowerTrax}\"", dock);
|
||
Assert.Contains("IsEnabled=\"{Binding CanRaiseTrax}\"", dock);
|
||
Assert.Contains("Text=\"{Binding TraxVolumeDbLabel}\"", dock);
|
||
Assert.Contains("Binding=\"{Binding IsMusicPlaying}\" Value=\"True\"", dock);
|
||
Assert.Contains("Click=\"TraxPlayPause_Click\"", dock);
|
||
|
||
// The bay DOES carry a ladder now — the player measures its own output, so "is music making
|
||
// sound" is answerable without hearing it (a play glyph cannot answer that).
|
||
// The TRAX row lives under the desktop volume, inside the GAME bay.
|
||
var traxRow = dock[dock.IndexOf("Text=\"TRAX\"", System.StringComparison.Ordinal)
|
||
..dock.IndexOf("Text=\"LIP-SYNC\"", System.StringComparison.Ordinal)];
|
||
Assert.Contains("TraxTrackLabel", traxRow);
|
||
Assert.DoesNotContain("SegmentMeter", traxRow);
|
||
|
||
foreach (var name in new[] { "TraxVolumeDb", "TraxVolumeDbLabel", "TraxTrackLabel", "CanRaiseTrax", "CanLowerTrax" })
|
||
Assert.NotNull(typeof(MainViewModel).GetProperty(name));
|
||
|
||
// The player gained a real user level, separate from the mute-follow LocalGain.
|
||
Assert.NotNull(typeof(ITraxPlayer).GetProperty("UserGain"));
|
||
Assert.NotNull(typeof(ITraxPlayer).GetProperty("Level"));
|
||
Assert.NotNull(typeof(MusicPlayer).GetProperty("UserGain"));
|
||
|
||
// It starts as background: −50 dB, and the ±5 dB steps are how it moves.
|
||
Assert.Equal(-50, MainViewModel.TraxDefaultDb);
|
||
Assert.Equal(5, MainViewModel.TraxStepDb);
|
||
Assert.Equal(0, GainDb.ToDb(1f), 6);
|
||
Assert.Contains("∞", GainDb.Label(GainDb.FloorDb)); // true silence, not "-60.0"
|
||
}
|
||
}
|