aurora/Aurora/Backend/Services/PlayerService/PlayerService.cs

117 lines
3.3 KiB
C#
Raw Normal View History

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();
}
}
}