Creator: "why is there no meter for when trax is playing?" Routing answer: TRAX rides the desktop loopback, so it already moved the GAME ladder — there was no separate TRAX signal in the mix. But that ladder cannot answer the question a deaf creator actually has: "is the music producing sound at all?" The play glyph cannot either — an open file with a dead decoder still reports Playing. So the player now measures its own output: \`MusicPlayer\` wraps the volume stage in an NAudio \`MeteringSampleProvider\` and exposes \`Level\`; \`ITraxPlayer.Level\` keeps the fake honest. The VM maps it through the same display scale (\`TraxMeterFraction\`), zeroed when not playing, and the TRAX bay carries a 24-segment ladder above its fader. This reverses my earlier "no ladder, nothing honest to show" — the honest thing arrived with a real measurement. TraxBayTests flipped accordingly (it now asserts the ladder AND its source).
23 lines
926 B
C#
23 lines
926 B
C#
namespace ytLive.Services.Audio;
|
|
|
|
/// <summary>Seam over the TRAX background-music player (<see cref="MusicPlayer"/>) so the
|
|
/// toggle/status-light logic is testable without a real audio device.</summary>
|
|
public interface ITraxPlayer : IDisposable
|
|
{
|
|
event Action<Exception?>? PlaybackEnded;
|
|
string? TrackName { get; }
|
|
bool IsPlaying { get; }
|
|
|
|
/// <summary>The player's OWN measured output level (0…1). A play glyph can lie — an open file
|
|
/// with a dead decoder still says "playing" — so the dock's TRAX ladder shows sound, not state.</summary>
|
|
float Level { get; }
|
|
float LocalGain { get; set; }
|
|
|
|
/// <summary>The creator's TRAX level (1 = the bed's fixed design level). Separate from
|
|
/// <see cref="LocalGain"/>, which follows the desktop mute; the dock's fader moves this.</summary>
|
|
float UserGain { get; set; }
|
|
void Load(string path);
|
|
void Play();
|
|
void Pause();
|
|
}
|