Add audible cues and optional spoken announcements for session events (join/leave, channel + PM sent/recv, login, logout/connection-lost, mic on/off, voice-activity, PTT) across all three clients, driven off the shared C ABI vc_event stream so the mapping stays consistent. TTS is off by default; when enabled it announces events and reads message/PM bodies aloud. Master toggles + a sound-volume slider; the per-utterance voice-activity and PTT cues default off. WAVs ship from assets/sounds/. Windows (built + verified): new VoiceCat.App/Notifications/ layer (FeedbackSettings -> %AppData%\VoiceCat\feedback.json, SoundPlayerPool via System.Media.SoundPlayer, SpeechAnnouncer via Prismatoid 0.3.0, EventFeedback dispatcher); MainForm hooks; NotificationSettingsForm under Settings > Notifications; csproj adds the Prismatoid PackageRef and copies the WAVs into sounds\. macOS + iOS (written, not yet built -- needs a Mac): shared VoiceCatCore/Feedback/ (SoundEvent, EventFeedback = AVAudioPlayer pool + native AVSpeechSynthesizer, FeedbackSettings over UserDefaults); WAVs bundled via Package.swift resources (.process). Hooks in SessionState/ AppState (iOS) and MainWindowController (macOS); settings UI in SettingsView (iOS) and SettingsWindowController (macOS). No core/server code touched; ctest --preset dev unaffected. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
59 lines
2.8 KiB
XML
59 lines
2.8 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\VoiceCat.Interop\VoiceCat.Interop.csproj" />
|
|
</ItemGroup>
|
|
|
|
<!-- Prismatoid — .NET bindings for the Prism speech library, used for spoken event
|
|
announcements (text-to-speech). net10.0, no transitive dependencies. -->
|
|
<ItemGroup>
|
|
<PackageReference Include="Prismatoid" Version="0.3.0" />
|
|
</ItemGroup>
|
|
|
|
<!-- Event-cue WAVs (shared with the macOS/iOS clients) copied into sounds\ next to the exe;
|
|
SoundPlayerPool loads them from AppContext.BaseDirectory\sounds. -->
|
|
<ItemGroup>
|
|
<Content Include="..\..\..\assets\sounds\*.wav">
|
|
<Link>sounds\%(Filename)%(Extension)</Link>
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
</Content>
|
|
</ItemGroup>
|
|
|
|
<PropertyGroup>
|
|
<OutputType>WinExe</OutputType>
|
|
<TargetFramework>net10.0-windows</TargetFramework>
|
|
<Nullable>enable</Nullable>
|
|
<UseWindowsForms>true</UseWindowsForms>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
|
<AssemblyName>VoiceCat.App</AssemblyName>
|
|
<RootNamespace>VoiceCat.App</RootNamespace>
|
|
<!-- Per-monitor v2 DPI awareness (correct scaling on multi-monitor/high-DPI — matters for
|
|
low-vision users as much as general UX). Set via this property, not app.manifest —
|
|
WinForms' own analyzer (WFO0003) flags manifest-based DPI settings as superseded by
|
|
this property in modern .NET. -->
|
|
<ApplicationHighDpiMode>PerMonitorV2</ApplicationHighDpiMode>
|
|
<!-- WASAPI process-loopback COM interop in Audio/ProcessLoopbackCapture.cs uses unsafe
|
|
pointer arithmetic for PROPVARIANT/AUDIOCLIENT_ACTIVATION_PARAMS marshaling. -->
|
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
</PropertyGroup>
|
|
|
|
<!-- System.Security.Cryptography.ProtectedData (PasswordProtector.cs's DPAPI wrapper) ships
|
|
as part of the Windows Desktop shared framework on net10.0-windows — no PackageReference
|
|
needed (one was tried and NuGet flagged it as redundant/unprunable, NU1510). -->
|
|
|
|
<!-- voicecat.dll must exist (build the `windows-client` CMake preset first — see
|
|
clients/windows/README.md). -->
|
|
<ItemGroup>
|
|
<Content Include="$(VoiceCatNativeDir)\voicecat.dll" Condition="Exists('$(VoiceCatNativeDir)\voicecat.dll')">
|
|
<Link>voicecat.dll</Link>
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
</Content>
|
|
</ItemGroup>
|
|
|
|
<Target Name="VoiceCatCheckNativeDll" BeforeTargets="Build">
|
|
<Error Condition="!Exists('$(VoiceCatNativeDir)\voicecat.dll')"
|
|
Text="voicecat.dll not found at '$(VoiceCatNativeDir)'. Build it first: cmake --preset windows-client && cmake --build --preset windows-client (see clients/windows/README.md)." />
|
|
</Target>
|
|
|
|
</Project> |