unison/Handlers/MPDHandler.cs

129 lines
3.7 KiB
C#
Raw Normal View History

2021-08-16 00:13:47 +00:00
using System.Collections.Generic;
using System.Threading.Tasks;
using MPDCtrl.Models;
namespace unison
{
public class MPDHandler
{
2021-08-16 00:13:47 +00:00
private readonly MPC _mpd = new();
public bool _connected;
public int _currentVolume;
public bool _currentRandom;
public bool _currentRepeat;
public bool _currentSingle;
public bool _currentConsume;
public double _currentElapsed;
private Status _currentStatus = null;
private SongInfoEx _currentSong = null;
public MPDHandler()
{
}
2021-08-16 00:13:47 +00:00
public async void Connect()
{
_connected = await _mpd.MpdCommandConnectionStart(Properties.Settings.Default.mpd_host, Properties.Settings.Default.mpd_port, Properties.Settings.Default.mpd_password);
if (_connected)
{
await _mpd.MpdQueryStatus();
await Task.Delay(5);
_currentVolume = _mpd.MpdStatus.MpdVolume;
_currentRandom = _mpd.MpdStatus.MpdRandom;
_currentRepeat = _mpd.MpdStatus.MpdRepeat;
_currentSingle = _mpd.MpdStatus.MpdSingle;
_currentConsume = _mpd.MpdStatus.MpdConsume;
_currentElapsed = _mpd.MpdStatus.MpdSongElapsed;
}
}
public void CheckStatus<T>(ref T a, T b)
{
if (Comparer<T>.Default.Compare(a, b) != 0)
a = b;
}
public async void Loop()
{
if (!_connected)
return;
CommandResult status = await _mpd.MpdQueryStatus();
//Trace.WriteLine(status.ResultText);
await Task.Delay(5);
if (status != null)
{
_currentStatus = _mpd.MpdStatus;
CheckStatus(ref _currentVolume, _mpd.MpdStatus.MpdVolume);
CheckStatus(ref _currentRandom, _mpd.MpdStatus.MpdRandom);
CheckStatus(ref _currentRepeat, _mpd.MpdStatus.MpdRepeat);
CheckStatus(ref _currentSingle, _mpd.MpdStatus.MpdSingle);
CheckStatus(ref _currentConsume, _mpd.MpdStatus.MpdConsume);
CheckStatus(ref _currentElapsed, _mpd.MpdStatus.MpdSongElapsed);
}
CommandResult song = await _mpd.MpdQueryCurrentSong();
await Task.Delay(5);
if (song != null)
_currentSong = _mpd.MpdCurrentSong;
}
public SongInfoEx GetCurrentSong() => _currentSong;
public Status GetStatus() => _currentStatus;
public async void Prev()
{
await _mpd.MpdPlaybackPrev(_currentVolume);
}
public async void Next()
{
await _mpd.MpdPlaybackNext(_currentVolume);
}
public async void PlayPause()
{
if (_mpd.MpdStatus.MpdState == Status.MpdPlayState.Play)
await _mpd.MpdPlaybackPause();
else if (_mpd.MpdStatus.MpdState == Status.MpdPlayState.Pause)
await _mpd.MpdPlaybackPlay(_currentVolume);
}
public async void Random()
{
await _mpd.MpdSetRandom(!_currentRandom);
}
public async void Repeat()
{
await _mpd.MpdSetRepeat(!_currentRepeat);
}
public async void Single()
{
await _mpd.MpdSetSingle(!_currentSingle);
}
public async void Consume()
{
await _mpd.MpdSetConsume(!_currentConsume);
}
public async void SetVolume(int value)
{
await _mpd.MpdSetVolume(value);
}
public bool IsPlaying() => _currentStatus?.MpdState == MPDCtrl.Models.Status.MpdPlayState.Play;
}
}