117 lines
3.3 KiB
C#
117 lines
3.3 KiB
C#
|
using System;
|
|||
|
using Aurora.Backend.Models;
|
|||
|
using LibVLCSharp.Shared;
|
|||
|
|
|||
|
namespace Aurora.Backend.Services.PlayerService
|
|||
|
{
|
|||
|
public class PlayerService : BaseService<PlayerService>
|
|||
|
{
|
|||
|
private BaseMedia _currentMedia;
|
|||
|
private MediaPlayer _mediaPlayer;
|
|||
|
private LibVLC _libvlc;
|
|||
|
private PlaybackState _state;
|
|||
|
|
|||
|
public PlayerService()
|
|||
|
{
|
|||
|
_libvlc = new LibVLC();
|
|||
|
_state = PlaybackState.Stopped;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Event handler for changing playback states.
|
|||
|
/// </summary>
|
|||
|
public event PlaybackStateChangedEventHandler PlaybackStateChanged;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// The state of playback
|
|||
|
/// </summary>
|
|||
|
/// <value></value>
|
|||
|
public PlaybackState PlaybackState
|
|||
|
{
|
|||
|
get { return _state; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Load media into the media player.
|
|||
|
/// </summary>
|
|||
|
/// <param name="media">Media to load</param>
|
|||
|
public void LoadMedia(BaseMedia media)
|
|||
|
{
|
|||
|
if (_state == PlaybackState.Playing || _state == PlaybackState.Buffering)
|
|||
|
{
|
|||
|
Unload();
|
|||
|
}
|
|||
|
_currentMedia = media;
|
|||
|
_currentMedia.Load();
|
|||
|
var md = new Media(_libvlc, _currentMedia.DataStream);
|
|||
|
_mediaPlayer = new MediaPlayer(md);
|
|||
|
_mediaPlayer.Stopped += OnStopped;
|
|||
|
md.Dispose();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Play currently loaded media.
|
|||
|
/// </summary>
|
|||
|
public void Play()
|
|||
|
{
|
|||
|
PlaybackStateChanged.Invoke(this, new PlaybackStateChangedEventArgs(_state, PlaybackState.Playing));
|
|||
|
_state = PlaybackState.Playing;
|
|||
|
_mediaPlayer.Play();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Pause currently loaded media.
|
|||
|
/// </summary>
|
|||
|
public void Pause()
|
|||
|
{
|
|||
|
PlaybackStateChanged.Invoke(this, new PlaybackStateChangedEventArgs(_state, PlaybackState.Buffering));
|
|||
|
_state = PlaybackState.Buffering;
|
|||
|
_mediaPlayer.Pause();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Stop currently loaded media.
|
|||
|
/// </summary>
|
|||
|
public void Stop()
|
|||
|
{
|
|||
|
PlaybackStateChanged.Invoke(this, new PlaybackStateChangedEventArgs(_state, PlaybackState.Stopped));
|
|||
|
_state = PlaybackState.Stopped;
|
|||
|
_mediaPlayer.Stop();
|
|||
|
}
|
|||
|
|
|||
|
public void Enqueue(BaseMedia song)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
public void Dequeue(BaseMedia song)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Unload currently loaded media.
|
|||
|
/// </summary>
|
|||
|
private void Unload()
|
|||
|
{
|
|||
|
_currentMedia.Unload();
|
|||
|
_mediaPlayer.Media = null;
|
|||
|
_mediaPlayer = null;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Event fired when currently loaded media player stops.
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="args"></param>
|
|||
|
private void OnStopped(object sender, EventArgs args)
|
|||
|
{
|
|||
|
PlaybackStateChanged.Invoke(this, new PlaybackStateChangedEventArgs(_state, PlaybackState.Stopped));
|
|||
|
_state = PlaybackState.Stopped;
|
|||
|
this.Unload();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|