mirror of
https://github.com/Stone-Red-Code/EchoHub.git
synced 2026-09-04 00:56:05 +02:00
86 lines
2.3 KiB
C#
86 lines
2.3 KiB
C#
using EchoHub.Client.Config;
|
|
using NetCoreAudio;
|
|
using Serilog;
|
|
|
|
namespace EchoHub.Client.Services;
|
|
|
|
public class NotificationSoundService
|
|
{
|
|
private readonly Player _player = new();
|
|
private readonly NotificationConfig _config;
|
|
private string? _resolvedSoundPath;
|
|
|
|
public NotificationSoundService(NotificationConfig config)
|
|
{
|
|
_config = config;
|
|
ResolveSoundPath();
|
|
}
|
|
|
|
public void SetEnabled(bool enabled) => _config.Enabled = enabled;
|
|
|
|
public void SetVolume(byte volume) => _config.Volume = Math.Min(volume, (byte)100);
|
|
|
|
public async Task PlayAsync()
|
|
{
|
|
if (!_config.Enabled || _resolvedSoundPath is null)
|
|
return;
|
|
|
|
await PlayInternal();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Plays the notification sound regardless of the Enabled setting (for /test-sound).
|
|
/// </summary>
|
|
public async Task PlayTestAsync()
|
|
{
|
|
if (_resolvedSoundPath is null)
|
|
return;
|
|
|
|
await PlayInternal();
|
|
}
|
|
|
|
private async Task PlayInternal()
|
|
{
|
|
try
|
|
{
|
|
if (_player.Playing)
|
|
await _player.Stop();
|
|
|
|
await _player.SetVolume(_config.Volume);
|
|
await _player.Play(_resolvedSoundPath!);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.Warning(ex, "Failed to play notification sound");
|
|
}
|
|
}
|
|
|
|
private void ResolveSoundPath()
|
|
{
|
|
// 1. Explicit path from config (~/.echohub/config.json)
|
|
if (!string.IsNullOrWhiteSpace(_config.SoundFile))
|
|
{
|
|
if (File.Exists(_config.SoundFile))
|
|
{
|
|
_resolvedSoundPath = Path.GetFullPath(_config.SoundFile);
|
|
Log.Debug("Notification sound: {Path} (from config)", _resolvedSoundPath);
|
|
return;
|
|
}
|
|
|
|
Log.Warning("Configured sound file not found: {Path}", _config.SoundFile);
|
|
}
|
|
|
|
// 2. Default: Notification.mp3 bundled next to the executable
|
|
var defaultPath = Path.Combine(AppContext.BaseDirectory, "Assets", "Notification.mp3");
|
|
|
|
if (File.Exists(defaultPath))
|
|
{
|
|
_resolvedSoundPath = defaultPath;
|
|
Log.Debug("Notification sound: {Path} (default)", _resolvedSoundPath);
|
|
return;
|
|
}
|
|
|
|
Log.Information("No notification sound file found — notifications will be silent");
|
|
}
|
|
}
|