a11b15e444
TASK 43's alert box grows a real video celebration. Per-alert IAlertClipDecoder
(ffmpeg bgra + f32le pipes, real-time paced, disposed at drain) plays the shipped
Assets/alert-default.mp4 (stamped into the Asset table at startup) unless the
creator picks their own file — path reference only, never stored in the DB; the
six AlertRenderer animations stay the fallback. ~0.3s fade rides the alpha
envelope on straight-source copies (EOF freeze-frames then fades out); audio
forwards to a new AudioMixer alert ring (8s, 48k stereo) drained at unity — no
duck, creator ruling — scaled by volume × fade. An auto-composed marquee ticker
('Funder — Super Chat · $10.00', 140px/s) scrolls top-of-frame via a
FramePump._alertTicker seam through Render/CompositeLayers, mixed into the cache
signature (dynamic overlay, never baked). New Stream Alerts section in LeftPanel.
Derivative-work references (how OBS/Streamlabs alert boxes do per-alert video):
- https://support.streamlabs.com/hc/en-us/articles/217741147-Setting-Up-Your-Streamlabs-Alerts (custom image/video per alert type + variations)
- https://obsproject.com/kb/stream-tutorial-2-alerts (alert overlay as an on-screen zone)
- https://streamlabs.com/content-hub/widgets/alert-box (per-event alert playback)
Good Dog: AlertLayerVideoTests drives a fake IAlertClipDecoder through the whole
lifecycle in one pass (custom path wins, decoder spawns/disposes, fade envelope
0→127→255, audio volume×fade, ticker scrolls, EOF fade-drain to idle). It caught
the clip branch of Advance not clearing _current before AdvanceToNext — the layer
stayed IsPlaying after drain (MyMistakes post-mortem).
Full vstest 319/319; clean build 0 warnings; scope check green.
96 lines
5.1 KiB
XML
96 lines
5.1 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
||
|
||
<PropertyGroup>
|
||
<OutputType>WinExe</OutputType>
|
||
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
|
||
<Nullable>enable</Nullable>
|
||
<ImplicitUsings>enable</ImplicitUsings>
|
||
<UseWPF>true</UseWPF>
|
||
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
||
<ApplicationIcon>Assets\llamacasty-icon.ico</ApplicationIcon>
|
||
<AssemblyName>ytLive</AssemblyName>
|
||
<RootNamespace>ytLive</RootNamespace>
|
||
</PropertyGroup>
|
||
|
||
<ItemGroup>
|
||
<Compile Remove="ytLive.Tests\**" />
|
||
<EmbeddedResource Remove="ytLive.Tests\**" />
|
||
<None Remove="ytLive.Tests\**" />
|
||
<Page Remove="ytLive.Tests\**" />
|
||
</ItemGroup>
|
||
|
||
<!-- Per-build identity stamp (2026-09-04): takes 1–6 could not be attributed to an
|
||
exact binary — render perf "fixes" were being judged against builds we could not
|
||
prove were running. A fresh GUID per build makes an incremental compile impossible
|
||
(that is the point: every exe you launch was compiled NOW), the wordmark shows the
|
||
id, and startup.log records id + build time. -->
|
||
<Target Name="GenerateBuildStamp" BeforeTargets="CoreCompile">
|
||
<PropertyGroup>
|
||
<BuildStampFile>$(IntermediateOutputPath)BuildStamp.g.cs</BuildStampFile>
|
||
<BuildStampId>$([System.Guid]::NewGuid().ToString('N').Substring(0,8))</BuildStampId>
|
||
<BuildStampTime>$([System.DateTime]::Now.ToString('yyyy-MM-dd HH:mm:ss'))</BuildStampTime>
|
||
<!-- RELEASE COUNTER (creator ruling 2026-09-04): the UI shows a sequential number that
|
||
ticks +1 per COMMIT, starting at 13 — a per-BUILD GUID changed on every launch and read
|
||
as noise (rightly). Derived from git rev-list count (stable per commit, no bookkeeping).
|
||
Baseline 241 = count at introduction, first display 13. Missing git or unparsed output
|
||
falls back to the start (build never breaks). GUID + compile time stay in startup.log,
|
||
where build-identity forensics actually live. -->
|
||
<BuildNumberBaseline>241</BuildNumberBaseline>
|
||
<BuildNumberStart>13</BuildNumberStart>
|
||
</PropertyGroup>
|
||
<Exec Command=""C:\Program Files\Git\cmd\git.exe" rev-list --count HEAD"
|
||
WorkingDirectory="$(ProjectDir)" ConsoleToMSBuild="true" IgnoreExitCode="true">
|
||
<Output TaskParameter="ConsoleOutput" PropertyName="CommitCountRaw" />
|
||
</Exec>
|
||
<PropertyGroup>
|
||
<CommitCount>$(CommitCountRaw.Trim())</CommitCount>
|
||
<BuildNumber>$([MSBuild]::Add($(BuildNumberStart), $([MSBuild]::Subtract($(CommitCount), $(BuildNumberBaseline)))))</BuildNumber>
|
||
<BuildNumber Condition="! $([System.Text.RegularExpressions.Regex]::IsMatch('$(BuildNumber)', '^[0-9]+$'))">$(BuildNumberStart)</BuildNumber>
|
||
</PropertyGroup>
|
||
<ItemGroup>
|
||
<BuildStampLines Include="// <auto-generated> Per-build identity (ytLive.csproj GenerateBuildStamp)."/>
|
||
<BuildStampLines Include="// Release/Label = the sequential UI stamp (+1 per commit, started at 13)."/>
|
||
<BuildStampLines Include="// Id/BuiltLocal = per-build forensic identity, logged to startup.log only. Never edit by hand."/>
|
||
<BuildStampLines Include="namespace ytLive.Helpers%3B"/>
|
||
<BuildStampLines Include="public static class BuildStamp { public const int Release = $(BuildNumber)%3B public const string Label = "#$(BuildNumber)"%3B public const string Id = "$(BuildStampId)"%3B public const string BuiltLocal = "$(BuildStampTime)"%3B }"/>
|
||
</ItemGroup>
|
||
<WriteLinesToFile File="$(BuildStampFile)" Lines="@(BuildStampLines)" Overwrite="true" WriteOnlyWhenDifferent="false" />
|
||
<ItemGroup>
|
||
<Compile Include="$(BuildStampFile)" />
|
||
</ItemGroup>
|
||
</Target>
|
||
|
||
<ItemGroup>
|
||
<Resource Include="Assets\llamacasty-icon.png" />
|
||
<Resource Include="Assets\llamacasty-logo.jpg" />
|
||
<Resource Include="Assets\starting-background.jpg" />
|
||
<Resource Include="Assets\brb-background.jpg" />
|
||
<Resource Include="Assets\live-background.jpg" />
|
||
<Resource Include="Assets\ending-background.jpg" />
|
||
<Resource Include="Assets\chat-background.jpg" />
|
||
<Resource Include="Assets\alert-default.mp4" />
|
||
</ItemGroup>
|
||
|
||
<ItemGroup>
|
||
<None Include="THIRD-PARTY-NOTICES.txt" CopyToOutputDirectory="PreserveNewest" />
|
||
</ItemGroup>
|
||
|
||
<ItemGroup>
|
||
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
|
||
<_Parameter1>ytLive.Tests</_Parameter1>
|
||
</AssemblyAttribute>
|
||
</ItemGroup>
|
||
|
||
<ItemGroup>
|
||
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.10" />
|
||
<PackageReference Include="NAudio.Wasapi" Version="2.2.1" />
|
||
<PackageReference Include="NAudio.WinMM" Version="2.2.1" />
|
||
<PackageReference Include="Notification.Wpf" Version="11.0.0" />
|
||
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.12" />
|
||
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="8.0.0" />
|
||
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2903.40" />
|
||
<PackageReference Include="Velopack" Version="1.2.0" />
|
||
</ItemGroup>
|
||
|
||
</Project>
|