From e317ce23101da5deb94fe4e2da6d63e5598b4026 Mon Sep 17 00:00:00 2001 From: Oleksandr Bezdieniezhnykh Date: Sun, 26 May 2024 15:11:16 +0300 Subject: [PATCH] add volume --- Azaion.Annotator/DTO/FormState.cs | 3 +- Azaion.Annotator/DTO/MediatrEvents.cs | 5 + Azaion.Annotator/DTO/PlaybackControlEnum.cs | 4 +- Azaion.Annotator/MainWindow.xaml | 101 ++++++++++++++++++-- Azaion.Annotator/MainWindow.xaml.cs | 14 ++- Azaion.Annotator/PlayerControlHandler.cs | 60 +++++++++++- 6 files changed, 167 insertions(+), 20 deletions(-) diff --git a/Azaion.Annotator/DTO/FormState.cs b/Azaion.Annotator/DTO/FormState.cs index e8d5d23..c0cbf7f 100644 --- a/Azaion.Annotator/DTO/FormState.cs +++ b/Azaion.Annotator/DTO/FormState.cs @@ -10,7 +10,8 @@ public class FormState public string CurrentFile { get; set; } = null!; public Size CurrentVideoSize { get; set; } public string VideoName => Path.GetFileNameWithoutExtension(CurrentFile).Replace(" ", ""); - public TimeSpan CurrentVideoLength { get; set; } + public TimeSpan CurrentVideoLength { get; set; } + public int CurrentVolume { get; set; } = 100; public string GetTimeName(TimeSpan ts) => $"{VideoName}_{ts:hmmssf}"; } diff --git a/Azaion.Annotator/DTO/MediatrEvents.cs b/Azaion.Annotator/DTO/MediatrEvents.cs index 1a818dd..36340fd 100644 --- a/Azaion.Annotator/DTO/MediatrEvents.cs +++ b/Azaion.Annotator/DTO/MediatrEvents.cs @@ -13,3 +13,8 @@ public class PlaybackControlEvent(PlaybackControlEnum playbackControlEnum) : INo { public PlaybackControlEnum PlaybackControl { get; set; } = playbackControlEnum; } + +public class VolumeChangedEvent(int volume) : INotification +{ + public int Volume { get; set; } = volume; +} diff --git a/Azaion.Annotator/DTO/PlaybackControlEnum.cs b/Azaion.Annotator/DTO/PlaybackControlEnum.cs index c2389b5..d0e76d7 100644 --- a/Azaion.Annotator/DTO/PlaybackControlEnum.cs +++ b/Azaion.Annotator/DTO/PlaybackControlEnum.cs @@ -10,5 +10,7 @@ public enum PlaybackControlEnum NextFrame = 5, SaveAnnotations = 6, RemoveSelectedAnns = 7, - RemoveAllAnns = 8 + RemoveAllAnns = 8, + TurnOffVolume = 9, + TurnOnVolume = 10 } \ No newline at end of file diff --git a/Azaion.Annotator/MainWindow.xaml b/Azaion.Annotator/MainWindow.xaml index 7f9a9d7..4f3097a 100644 --- a/Azaion.Annotator/MainWindow.xaml +++ b/Azaion.Annotator/MainWindow.xaml @@ -5,7 +5,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:wpf="clr-namespace:LibVLCSharp.WPF;assembly=LibVLCSharp.WPF" xmlns:controls="clr-namespace:Azaion.Annotator.Controls" mc:Ignorable="d" - Title="Azaion Annotator" Height="450" Width="1100"> + Title="Azaion Annotator" Height="450" Width="1100" + > + @@ -144,7 +154,13 @@ Width="*" Header="Назва" Binding="{Binding Path=Name}" - CanUserSort="False"/> + CanUserSort="False"> + + + + - + Grid.ColumnSpan="3" + Background="#252525" + Foreground="LightBlue"> + + + @@ -314,7 +382,8 @@ - + + @@ -324,14 +393,26 @@ - + + + + + - - - - + + + + diff --git a/Azaion.Annotator/MainWindow.xaml.cs b/Azaion.Annotator/MainWindow.xaml.cs index 4e4a450..d7dc3bd 100644 --- a/Azaion.Annotator/MainWindow.xaml.cs +++ b/Azaion.Annotator/MainWindow.xaml.cs @@ -74,7 +74,7 @@ public partial class MainWindow _helpWindow.Show(); } - public void BlinkHelp(string helpText, int times = 3) + public void BlinkHelp(string helpText, int times = 2) { _ = Task.Run(async () => { @@ -112,7 +112,7 @@ public partial class MainWindow _mediaPlayer.PositionChanged += (o, args) => { - Dispatcher.Invoke(() => videoSlider.Value = _mediaPlayer.Position * videoSlider.Maximum); + Dispatcher.Invoke(() => VideoSlider.Value = _mediaPlayer.Position * VideoSlider.Maximum); Dispatcher.Invoke(() => StatusClock.Text = $"{TimeSpan.FromMilliseconds(_mediaPlayer.Time):mm\\:ss} / {_formState.CurrentVideoLength:mm\\:ss}"); var curTime = _formState.GetTimeName(TimeSpan.FromMilliseconds(_mediaPlayer.Time)); @@ -149,11 +149,13 @@ public partial class MainWindow }; - videoSlider.ValueChanged += (value, newValue) => - _mediaPlayer.Position = (float)(newValue / videoSlider.Maximum); + VideoSlider.ValueChanged += (value, newValue) => + _mediaPlayer.Position = (float)(newValue / VideoSlider.Maximum); - videoSlider.KeyDown += (sender, args) => _mediator.Publish(new KeyEvent(sender, args)); + VideoSlider.KeyDown += (sender, args) => _mediator.Publish(new KeyEvent(sender, args)); + Volume.ValueChanged += (_, newValue) => _mediator.Publish(new VolumeChangedEvent((int)newValue)); + SizeChanged += (sender, args) => { if (!_suspendLayout) @@ -257,6 +259,8 @@ public partial class MainWindow private void RemoveSelectedClick(object sender, RoutedEventArgs e) => _mediator.Publish(new PlaybackControlEvent(PlaybackControlEnum.RemoveSelectedAnns)); private void RemoveAllClick(object sender, RoutedEventArgs e) => _mediator.Publish(new PlaybackControlEvent(PlaybackControlEnum.RemoveAllAnns)); + private void TurnOffVolume(object sender, RoutedEventArgs e) => _mediator.Publish(new PlaybackControlEvent(PlaybackControlEnum.TurnOffVolume)); + private void TurnOnVolume(object sender, RoutedEventArgs e) => _mediator.Publish(new PlaybackControlEvent(PlaybackControlEnum.TurnOnVolume)); private void OpenHelpWindowClick(object sender, RoutedEventArgs e) { diff --git a/Azaion.Annotator/PlayerControlHandler.cs b/Azaion.Annotator/PlayerControlHandler.cs index f520125..29abc8a 100644 --- a/Azaion.Annotator/PlayerControlHandler.cs +++ b/Azaion.Annotator/PlayerControlHandler.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Windows; using System.Windows.Input; using Azaion.Annotator.DTO; using LibVLCSharp.Shared; @@ -9,7 +10,8 @@ namespace Azaion.Annotator; public class PlayerControlHandler(LibVLC libVLC, MediaPlayer mediaPlayer, MainWindow mainWindow, FormState formState, Config config) : INotificationHandler, INotificationHandler, - INotificationHandler + INotificationHandler, + INotificationHandler { private const int STEP = 20; private const int LARGE_STEP = 5000; @@ -58,8 +60,35 @@ public class PlayerControlHandler(LibVLC libVLC, MediaPlayer mediaPlayer, MainWi if (KeysControlEnumDict.TryGetValue(key, out var value)) await ControlPlayback(value); + + await VolumeControl(key); } - + + private async Task VolumeControl(Key key) + { + switch (key) + { + case Key.VolumeMute when mediaPlayer.Volume == 0: + await ControlPlayback(PlaybackControlEnum.TurnOnVolume); + break; + case Key.VolumeMute: + await ControlPlayback(PlaybackControlEnum.TurnOffVolume); + break; + case Key.Up: + case Key.VolumeUp: + var vUp = Math.Min(100, mediaPlayer.Volume + 5); + ChangeVolume(vUp); + mainWindow.Volume.Value = vUp; + break; + case Key.Down: + case Key.VolumeDown: + var vDown = Math.Max(0, mediaPlayer.Volume - 5); + ChangeVolume(vDown); + mainWindow.Volume.Value = vDown; + break; + } + } + public async Task Handle(PlaybackControlEvent notification, CancellationToken cancellationToken) { await ControlPlayback(notification.PlaybackControl); @@ -87,10 +116,12 @@ public class PlayerControlHandler(LibVLC libVLC, MediaPlayer mediaPlayer, MainWi case PlaybackControlEnum.PreviousFrame: mediaPlayer.SetPause(true); mediaPlayer.Time -= step; + mainWindow.VideoSlider.Value = mediaPlayer.Position * 100; break; case PlaybackControlEnum.NextFrame: mediaPlayer.SetPause(true); mediaPlayer.Time += step; + mainWindow.VideoSlider.Value = mediaPlayer.Position * 100; break; case PlaybackControlEnum.SaveAnnotations: await SaveAnnotations(); @@ -101,6 +132,17 @@ public class PlayerControlHandler(LibVLC libVLC, MediaPlayer mediaPlayer, MainWi case PlaybackControlEnum.RemoveAllAnns: mainWindow.Editor.RemoveAllAnns(); break; + case PlaybackControlEnum.TurnOnVolume: + mainWindow.TurnOnVolumeBtn.Visibility = Visibility.Collapsed; + mainWindow.TurnOffVolumeBtn.Visibility = Visibility.Visible; + mediaPlayer.Volume = formState.CurrentVolume; + break; + case PlaybackControlEnum.TurnOffVolume: + mainWindow.TurnOffVolumeBtn.Visibility = Visibility.Collapsed; + mainWindow.TurnOnVolumeBtn.Visibility = Visibility.Visible; + formState.CurrentVolume = mediaPlayer.Volume; + mediaPlayer.Volume = 0; + break; case PlaybackControlEnum.None: break; default: @@ -108,6 +150,18 @@ public class PlayerControlHandler(LibVLC libVLC, MediaPlayer mediaPlayer, MainWi } } + public async Task Handle(VolumeChangedEvent notification, CancellationToken cancellationToken) + { + ChangeVolume(notification.Volume); + await Task.CompletedTask; + } + + private void ChangeVolume(int volume) + { + formState.CurrentVolume = volume; + mediaPlayer.Volume = volume; + } + private void Play() { if (mainWindow.LvFiles.SelectedItem == null) @@ -145,4 +199,4 @@ public class PlayerControlHandler(LibVLC libVLC, MediaPlayer mediaPlayer, MainWi mainWindow.Editor.RemoveAllAnns(); mediaPlayer.Play(); } -} \ No newline at end of file +}