// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using autoShell.Handlers.Generated;
using autoShell.Services;
namespace autoShell.Handlers;
///
/// Handles audio commands: Mute, RestoreVolume, and Volume.
///
internal class AudioActionHandler : ActionHandlerBase
{
private readonly IAudioService _audio;
private double _savedVolumePct;
public AudioActionHandler(IAudioService audio)
{
_audio = audio;
AddAction("AdjustVolume", HandleAdjustVolume);
AddAction("Mute", HandleMute);
AddAction("RestoreVolume", HandleRestoreVolume);
AddAction("Volume", HandleVolume);
}
private ActionResult HandleMute(MuteParams p)
{
bool mute = p.On;
_audio.SetMute(mute);
return ActionResult.Ok($"Audio {(mute ? "muted" : "unmuted")}");
}
private ActionResult HandleAdjustVolume(AdjustVolumeParams p)
{
int current = _audio.GetVolume();
int amount = p.Amount is > 0 ? p.Amount.Value : 10;
int target = p.Direction.Equals("down", StringComparison.OrdinalIgnoreCase)
? current - amount
: current + amount;
target = Math.Clamp(target, 0, 100);
if (current > 0)
{
_savedVolumePct = current;
}
_audio.SetVolume(target);
return ActionResult.Ok($"Volume adjusted from {current}% to {target}%");
}
private ActionResult HandleRestoreVolume(RestoreVolumeParams p)
{
_audio.SetVolume((int)_savedVolumePct);
return ActionResult.Ok($"Volume restored to {(int)_savedVolumePct}%");
}
private ActionResult HandleVolume(VolumeParams p)
{
int pct = p.TargetVolume;
if (pct < 0)
{
return ActionResult.Fail("Invalid volume: targetVolume required");
}
int currentVolume = _audio.GetVolume();
if (currentVolume > 0)
{
_savedVolumePct = currentVolume;
}
_audio.SetVolume(pct);
return ActionResult.Ok($"Volume set to {pct}%");
}
}