Commit Description:
Various UI improvements.
Commit Description:
Various UI improvements.
File last commit:
Show/Diff file:
Action:
FNA/src/Media/Song.cs
195 lines | 3.1 KiB | text/x-csharp | CSharpLexer
#region License
/* FNA - XNA4 Reimplementation for Desktop Platforms
* Copyright 2009-2020 Ethan Lee and the MonoGame Team
*
* Released under the Microsoft Public License.
* See LICENSE for details.
*/
#endregion
#region Using Statements
using System;
using System.IO;
#endregion
namespace Microsoft.Xna.Framework.Media
{
public sealed class Song : IEquatable<Song>, IDisposable
{
#region Public Properties
public string Name
{
get;
private set;
}
public TimeSpan Duration
{
get;
internal set;
}
public bool IsProtected
{
get
{
return false;
}
}
public bool IsRated
{
get
{
return false;
}
}
public int PlayCount
{
get;
internal set;
}
public int Rating
{
get
{
return 0;
}
}
public int TrackNumber
{
get
{
return 0;
}
}
#endregion
#region Public IDisposable Properties
public bool IsDisposed
{
get;
private set;
}
#endregion
#region Internal Variables
internal string handle;
#endregion
#region Constructors, Deconstructor, Dispose()
internal Song(string fileName, string name = null)
{
if (!File.Exists(fileName))
{
throw new FileNotFoundException(fileName);
}
handle = fileName;
Name = name;
IsDisposed = false;
}
internal Song(string fileName, int durationMS) : this(fileName)
{
Duration = TimeSpan.FromMilliseconds(durationMS);
}
~Song()
{
Dispose();
}
public void Dispose()
{
IsDisposed = true;
}
#endregion
#region Public Comparison Methods/Operators
public bool Equals(Song song)
{
return (((object) song) != null) && (handle == song.handle);
}
public override bool Equals(Object obj)
{
if (obj == null)
{
return false;
}
return Equals(obj as Song);
}
public static bool operator ==(Song song1, Song song2)
{
if (((object) song1) == null)
{
return ((object) song2) == null;
}
return song1.Equals(song2);
}
public static bool operator !=(Song song1, Song song2)
{
return !(song1 == song2);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
#endregion
#region Public Static Methods
/// <summary>
/// Constructs a new Song object based on the specified URI.
/// </summary>
/// <remarks>
/// This method matches the signature of the one in XNA4, however we currently can't play remote songs, so
/// the URI is required to be a file name and the code uses the LocalPath property only.
/// </remarks>
/// <param name="name">Name of the song.</param>
/// <param name="uri">Uri object that represents the URI.</param>
/// <returns>Song object that can be used to play the song.</returns>
public static Song FromUri(string name, Uri uri)
{
string path;
if (uri.IsAbsoluteUri)
{
// If it's absolute, be sure we can actually get it...
if (!uri.IsFile)
{
throw new InvalidOperationException(
"Only local file URIs are supported for now"
);
}
path = uri.LocalPath;
}
else
{
path = Path.Combine(
TitleLocation.Path,
uri.ToString()
);
}
return new Song(path, name);
}
#endregion
}
}