Added logic for tags and audio engine.
This commit is contained in:
9
Harmonia.Core/Engine/AudioPlaybackState.cs
Normal file
9
Harmonia.Core/Engine/AudioPlaybackState.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace Harmonia.Core.Engine;
|
||||
|
||||
public enum AudioPlaybackState
|
||||
{
|
||||
Stopped,
|
||||
Playing,
|
||||
Stalled,
|
||||
Paused
|
||||
}
|
||||
22
Harmonia.Core/Engine/IAudioEngine.cs
Normal file
22
Harmonia.Core/Engine/IAudioEngine.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
namespace Harmonia.Core.Engine;
|
||||
|
||||
public interface IAudioEngine
|
||||
{
|
||||
string[] SupportedFormats { get; }
|
||||
string Source { get; }
|
||||
TimeSpan Position { get; set; }
|
||||
TimeSpan Length { get; }
|
||||
float Volume { get; set; }
|
||||
bool CanPause { get; }
|
||||
bool IsMuted { get; set; }
|
||||
AudioPlaybackState State { get; }
|
||||
|
||||
Task<bool> LoadAsync(string fileName);
|
||||
void Play();
|
||||
void Pause();
|
||||
void Stop();
|
||||
|
||||
event EventHandler<PlaybackStoppedEventArgs> PlaybackStopped;
|
||||
event EventHandler StreamFinished;
|
||||
event EventHandler<PlaybackStateChangedEventArgs> StateChanged;
|
||||
}
|
||||
7
Harmonia.Core/Engine/PlaybackStateChangedEventArgs.cs
Normal file
7
Harmonia.Core/Engine/PlaybackStateChangedEventArgs.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace Harmonia.Core.Engine;
|
||||
|
||||
public class PlaybackStateChangedEventArgs(AudioPlaybackState oldState, AudioPlaybackState newState) : EventArgs
|
||||
{
|
||||
public AudioPlaybackState OldState { get; } = oldState;
|
||||
public AudioPlaybackState State { get; } = newState;
|
||||
}
|
||||
6
Harmonia.Core/Engine/PlaybackStoppedEventArgs.cs
Normal file
6
Harmonia.Core/Engine/PlaybackStoppedEventArgs.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Harmonia.Core.Engine;
|
||||
|
||||
public class PlaybackStoppedEventArgs(string message) : EventArgs
|
||||
{
|
||||
public string Message { get; } = message;
|
||||
}
|
||||
@@ -6,4 +6,8 @@
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="TagLibSharp" Version="2.3.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
13
Harmonia.Core/Playlists/IPlaylistManager.cs
Normal file
13
Harmonia.Core/Playlists/IPlaylistManager.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public interface IPlaylistManager
|
||||
{
|
||||
Playlist? CurrentPlaylist { get; set; }
|
||||
|
||||
void AddPlaylist();
|
||||
void RemovePlaylist(Playlist playlist);
|
||||
|
||||
event EventHandler? CurrentPlaylistChanged;
|
||||
event EventHandler<PlaylistAddedEventArgs> PlaylistAdded;
|
||||
event EventHandler<PlaylistRemovedEventArgs> PlaylistRemoved;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
using Harmonia.Core.Events;
|
||||
using Harmonia.Core.Extensions;
|
||||
using Harmonia.Core.Extensions;
|
||||
using Harmonia.Core.Models;
|
||||
|
||||
namespace Harmonia.Core.Models;
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public class Playlist
|
||||
{
|
||||
6
Harmonia.Core/Playlists/PlaylistAddedEventArgs.cs
Normal file
6
Harmonia.Core/Playlists/PlaylistAddedEventArgs.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public class PlaylistAddedEventArgs(Playlist playlist) : EventArgs
|
||||
{
|
||||
public readonly Playlist Playlist = playlist;
|
||||
}
|
||||
43
Harmonia.Core/Playlists/PlaylistManager.cs
Normal file
43
Harmonia.Core/Playlists/PlaylistManager.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using Harmonia.Core.Data;
|
||||
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public class PlaylistManager(IRepository<Playlist> playlistRepository) : IPlaylistManager
|
||||
{
|
||||
private Playlist? _currentPlaylist;
|
||||
public Playlist? CurrentPlaylist
|
||||
{
|
||||
get
|
||||
{
|
||||
return _currentPlaylist;
|
||||
}
|
||||
set
|
||||
{
|
||||
_currentPlaylist = value;
|
||||
CurrentPlaylistChanged?.Invoke(this, new());
|
||||
}
|
||||
}
|
||||
|
||||
public event EventHandler? CurrentPlaylistChanged;
|
||||
public event EventHandler<PlaylistAddedEventArgs>? PlaylistAdded;
|
||||
public event EventHandler<PlaylistRemovedEventArgs>? PlaylistRemoved;
|
||||
|
||||
public void AddPlaylist()
|
||||
{
|
||||
Playlist playlist = new()
|
||||
{
|
||||
Name = "New Playlist"
|
||||
};
|
||||
|
||||
playlistRepository.Save(playlist);
|
||||
|
||||
PlaylistAdded?.Invoke(this, new(playlist));
|
||||
}
|
||||
|
||||
public void RemovePlaylist(Playlist playlist)
|
||||
{
|
||||
playlistRepository.Delete(playlist);
|
||||
|
||||
PlaylistRemoved?.Invoke(this, new(playlist));
|
||||
}
|
||||
}
|
||||
6
Harmonia.Core/Playlists/PlaylistRemovedEventArgs.cs
Normal file
6
Harmonia.Core/Playlists/PlaylistRemovedEventArgs.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public class PlaylistRemovedEventArgs(Playlist playlist) : EventArgs
|
||||
{
|
||||
public readonly Playlist Playlist = playlist;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using Harmonia.Core.Models;
|
||||
using Harmonia.Core.Data;
|
||||
|
||||
namespace Harmonia.Core.Data;
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public class PlaylistRepository : JsonFileRepository<Playlist>
|
||||
{
|
||||
@@ -1,4 +1,6 @@
|
||||
namespace Harmonia.Core.Models;
|
||||
using Harmonia.Core.Models;
|
||||
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public class PlaylistSong(Song song)
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Harmonia.Core.Events;
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public enum PlaylistUpdateAction
|
||||
{
|
||||
@@ -1,6 +1,4 @@
|
||||
using Harmonia.Core.Models;
|
||||
|
||||
namespace Harmonia.Core.Events;
|
||||
namespace Harmonia.Core.Playlists;
|
||||
|
||||
public class PlaylistUpdatedEventArgs : EventArgs
|
||||
{
|
||||
6
Harmonia.Core/Tags/ITagResolver.cs
Normal file
6
Harmonia.Core/Tags/ITagResolver.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Harmonia.Core.Tags;
|
||||
|
||||
public interface ITagResolver
|
||||
{
|
||||
SongTagInfo GetSongTagInfo(string fileName);
|
||||
}
|
||||
8
Harmonia.Core/Tags/PictureTag.cs
Normal file
8
Harmonia.Core/Tags/PictureTag.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace Harmonia.Core.Tags;
|
||||
|
||||
public class PictureTag
|
||||
{
|
||||
public required string MimeType;
|
||||
public required PictureType PictureType;
|
||||
public required byte[] Data;
|
||||
}
|
||||
96
Harmonia.Core/Tags/PictureType.cs
Normal file
96
Harmonia.Core/Tags/PictureType.cs
Normal file
@@ -0,0 +1,96 @@
|
||||
namespace Harmonia.Core.Tags;
|
||||
|
||||
//
|
||||
// Summary:
|
||||
// Picture Types.
|
||||
public enum PictureType
|
||||
{
|
||||
//
|
||||
// Summary:
|
||||
// Other.
|
||||
Other = 0,
|
||||
//
|
||||
// Summary:
|
||||
// File Icon.
|
||||
FileIcon = 1,
|
||||
//
|
||||
// Summary:
|
||||
// Other File Icon.
|
||||
OtherFileIcon = 2,
|
||||
//
|
||||
// Summary:
|
||||
// Front Cover.
|
||||
FrontCover = 3,
|
||||
//
|
||||
// Summary:
|
||||
// Back Cover.
|
||||
BackCover = 4,
|
||||
//
|
||||
// Summary:
|
||||
// Leaflet Page.
|
||||
LeafletPage = 5,
|
||||
//
|
||||
// Summary:
|
||||
// Media.
|
||||
Media = 6,
|
||||
//
|
||||
// Summary:
|
||||
// Soloist.
|
||||
Soloist = 7,
|
||||
//
|
||||
// Summary:
|
||||
// Artist.
|
||||
Artist = 8,
|
||||
//
|
||||
// Summary:
|
||||
// Conductor.
|
||||
Conductor = 9,
|
||||
//
|
||||
// Summary:
|
||||
// Band.
|
||||
Band = 10,
|
||||
//
|
||||
// Summary:
|
||||
// Composer.
|
||||
Composer = 11,
|
||||
//
|
||||
// Summary:
|
||||
// Lyricist.
|
||||
Lyricist = 12,
|
||||
//
|
||||
// Summary:
|
||||
// Recording Location.
|
||||
RecordingLocation = 13,
|
||||
//
|
||||
// Summary:
|
||||
// During Recording.
|
||||
DuringRecording = 14,
|
||||
//
|
||||
// Summary:
|
||||
// During Performance.
|
||||
DuringPerformance = 15,
|
||||
//
|
||||
// Summary:
|
||||
// Movie.
|
||||
Movie = 16,
|
||||
//
|
||||
// Summary:
|
||||
// A Bright Coloured Fish.
|
||||
ABrightColouredFish = 17,
|
||||
//
|
||||
// Summary:
|
||||
// Illustration.
|
||||
Illustration = 18,
|
||||
//
|
||||
// Summary:
|
||||
// Band Logo.
|
||||
BandLogo = 19,
|
||||
//
|
||||
// Summary:
|
||||
// Publisher Logo.
|
||||
PublisherLogo = 20,
|
||||
//
|
||||
// Summary:
|
||||
// Not A Picture
|
||||
NotAPicture = 255
|
||||
}
|
||||
18
Harmonia.Core/Tags/SongTagInfo.cs
Normal file
18
Harmonia.Core/Tags/SongTagInfo.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
namespace Harmonia.Core.Tags;
|
||||
|
||||
public class SongTagInfo
|
||||
{
|
||||
public string? Title { get; set; }
|
||||
public string? Album { get; set; }
|
||||
public List<string> Artists { get; set; } = [];
|
||||
public List<string> AlbumArtists { get; set; } = [];
|
||||
public int? DiscNumber { get; set; }
|
||||
public int? TrackNumber { get; set; }
|
||||
public TimeSpan Length { get; set; } = TimeSpan.Zero;
|
||||
public int? Year { get; set; }
|
||||
public string? Genre { get; set; }
|
||||
public int BitRate { get; set; }
|
||||
public int SampleRate { get; set; }
|
||||
public List<PictureTag> Pictures { get; set; } = [];
|
||||
public Dictionary<string, string> Other { get; set; } = [];
|
||||
}
|
||||
54
Harmonia.Core/Tags/TagLibTagResolver.cs
Normal file
54
Harmonia.Core/Tags/TagLibTagResolver.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
namespace Harmonia.Core.Tags;
|
||||
|
||||
public class TagLibTagResolver : ITagResolver
|
||||
{
|
||||
public SongTagInfo GetSongTagInfo(string fileName)
|
||||
{
|
||||
var songTagInfo = new SongTagInfo();
|
||||
|
||||
using (var tagFile = TagLib.File.Create(fileName))
|
||||
{
|
||||
int? discNumber = null;
|
||||
int? trackNumber = null;
|
||||
int? year = null;
|
||||
|
||||
if (tagFile.Tag.Track > 0)
|
||||
trackNumber = Convert.ToInt32(tagFile.Tag.Track);
|
||||
|
||||
if (tagFile.Tag.Disc > 0)
|
||||
discNumber = Convert.ToInt32(tagFile.Tag.Disc);
|
||||
|
||||
if (tagFile.Tag.Year > 0)
|
||||
year = Convert.ToInt32(tagFile.Tag.Year);
|
||||
|
||||
songTagInfo.Title = tagFile.Tag.Title;
|
||||
songTagInfo.Album = tagFile.Tag.Album;
|
||||
songTagInfo.Artists = tagFile.Tag.Performers.Select(x => x.Trim()).ToList();
|
||||
songTagInfo.AlbumArtists = tagFile.Tag.AlbumArtists.Select(x => x.Trim()).ToList();
|
||||
songTagInfo.DiscNumber = discNumber;
|
||||
songTagInfo.TrackNumber = trackNumber;
|
||||
songTagInfo.Length = tagFile.Properties.Duration;
|
||||
songTagInfo.Year = year;
|
||||
songTagInfo.Genre = tagFile.Tag.JoinedGenres;
|
||||
songTagInfo.BitRate = tagFile.Properties.AudioBitrate;
|
||||
songTagInfo.SampleRate = tagFile.Properties.AudioSampleRate;
|
||||
|
||||
foreach (var picture in tagFile.Tag.Pictures)
|
||||
{
|
||||
if (picture.Type == TagLib.PictureType.NotAPicture)
|
||||
continue;
|
||||
|
||||
var pictureTag = new PictureTag()
|
||||
{
|
||||
MimeType = picture.MimeType,
|
||||
PictureType = (PictureType)picture.Type,
|
||||
Data = picture.Data.Data
|
||||
};
|
||||
|
||||
songTagInfo.Pictures.Add(pictureTag);
|
||||
};
|
||||
}
|
||||
|
||||
return songTagInfo;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user