﻿Public Class Audio
    Implements IDisposable

    Private booAbortMusic As Boolean
    Private Filename As String
    Private IsPlaying As Integer 'Used to check for playing music: 0 is NO 1 is YES 2 is PAUSED
    Private t As Threading.Thread

    Dim intLength As Long 'Used by music playback
    Dim stream As IntPtr 'Used by music playback
    Dim dstream As IntPtr 'Used to read tags
    Dim sstream As IntPtr 'Used to read tags
    Dim xstream As IntPtr 'Used to read tags

    Private Const BASS_POS_BYTE As UInteger = 0

    Private dSounds As New Dictionary(Of Integer, IntPtr)

    Private Function SecondsToTime(ByVal dSeconds As Double) As String
        If dSeconds = -1 Then dSeconds = 1
        SecondsToTime = Format(DateAdd("s", dSeconds, "00:00"), "mm:ss")
    End Function

    Public Sub New()
        'Registers Bass.Net to disable splash
        Un4seen.Bass.BassNet.Registration("email", "regcode") 'Visit http://www.bass.radio42.com/bass_register.html
        Un4seen.Bass.Bass.BASS_PluginLoadDirectory(IO.Path.Combine(Application.StartupPath, "Plugins\"))
        'Initialises playback stream
        Un4seen.Bass.Bass.BASS_Init(-1, 44100, Un4seen.Bass.BASSInit.BASS_DEVICE_DEFAULT, System.IntPtr.Zero, Nothing)
    End Sub

    Public Sub PlayMusic(ByVal file As String)
        'Start up the music.
        Filename = file
        booAbortMusic = False
        If IsPlaying = 0 Then 'Limit to 1 set of playback
            t = New Threading.Thread(AddressOf MusicThread)
            t.Name = "BackgroundMusic"
            t.IsBackground = True
            t.Start()
        ElseIf IsPlaying = 2 Then
            PauseMusic()
        End If
    End Sub

    Public Sub StopMusic()
        'Stop the music.
        booAbortMusic = True
        If t.IsAlive Then t.Join(1000)
    End Sub

    Public Sub Dispose() Implements System.IDisposable.Dispose
        'Get rid of the Audio object.
        For Each d As KeyValuePair(Of Integer, IntPtr) In dSounds
            Un4seen.Bass.Bass.BASS_SampleFree(d.Value)
        Next
        'StopMusic()
        'Un4seen.Bass.Bass.BASS_Free()
    End Sub

    Public Function ReadTagArtist(ByVal Filename As String)
        sstream = Un4seen.Bass.Bass.BASS_StreamCreateFile(Filename, 0, 0, Un4seen.Bass.BASSFlag.BASS_STREAM_AUTOFREE)
        Un4seen.Bass.Bass.BASS_ChannelPause(sstream)
        Dim ReturnValue As String = ""
        Dim Tags() As String
        Dim Extension As String = System.IO.Path.GetExtension(Filename)

        Select Case Extension.ToUpper
            Case ".FLAC"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(sstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                            If s.Substring(0, 7) = "artist=" Then
                                ReturnValue = s.Substring(Len("artist="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".OGG"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(sstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                            If s.Substring(0, 7) = "artist=" Then
                                ReturnValue = s.Substring(Len("artist="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".WMA"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsWMA(sstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                            If s.Substring(0, 7) = "Author=" Then
                                ReturnValue = s.Substring(Len("author="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".MP3"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(sstream)
                If Tags.Count > 1 Then
                    ReturnValue = Tags(1)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V2(sstream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 5 Then 'Check the returned string is even long enough to hold the artist
                                If s.Substring(0, 5) = "TPE1=" Then
                                    ReturnValue = s.Substring(Len("TPE1="))
                                    Exit Select
                                End If
                            End If
                        Next
                    End If
                End If
                Return ""

            Case ".AAC"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(sstream)
                If Not Tags Is Nothing Then
                    ReturnValue = Tags(1)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(sstream)
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                            If s.Substring(0, 7) = "artist=" Then
                                ReturnValue = s.Substring(Len("artist="))
                                Exit Select
                            End If
                        End If
                    Next
                End If

            Case ".M4A"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(sstream)
                If Not Tags Is Nothing Then
                    ReturnValue = Tags(1)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(sstream)
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                            If s.Substring(0, 7) = "artist=" Then
                                ReturnValue = s.Substring(Len("artist="))
                                Exit Select
                            End If
                        End If
                    Next
                End If

        End Select

        Un4seen.Bass.Bass.BASS_ChannelStop(sstream)
        Return ReturnValue
    End Function

    Public Function ReadTagTitle(ByVal Filename As String)
        dstream = Un4seen.Bass.Bass.BASS_StreamCreateFile(Filename, 0, 0, Un4seen.Bass.BASSFlag.BASS_STREAM_AUTOFREE)
        Un4seen.Bass.Bass.BASS_ChannelPause(dstream)
        Dim ReturnValue As String = ""
        Dim Tags() As String
        Dim Extension As String = System.IO.Path.GetExtension(Filename)

        Select Case Extension.ToUpper
            Case ".FLAC"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(dstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                            If s.Substring(0, 6) = "title=" Then
                                ReturnValue = s.Substring(Len("title="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".OGG"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(dstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                            If s.Substring(0, 6) = "title=" Then
                                ReturnValue = s.Substring(Len("title="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".WMA"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsWMA(dstream)
                For Each s As String In Tags
                    Debug.Print(s)
                Next
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                            If s.Substring(0, 6) = "Title=" Then
                                ReturnValue = s.Substring(Len("Title="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".MP3"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(dstream)
                If Tags.Count > 1 Then
                    ReturnValue = Tags(0)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V2(dstream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 5 Then 'Check the returned string is even long enough to hold the title
                                If s.Substring(0, 5) = "TIT2=" Then
                                    ReturnValue = s.Substring(Len("TIT2="))
                                    Exit Select
                                End If
                            End If
                        Next
                    End If
                End If
                Return ""

            Case ".AAC"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(dstream)
                If Not Tags Is Nothing Then
                    ReturnValue = Tags(0)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(dstream)
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                            If s.Substring(0, 6) = "title=" Then
                                ReturnValue = s.Substring(Len("title="))
                                Exit Select
                            End If
                        End If
                    Next
                End If

            Case ".M4A"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(dstream)
                If Not Tags Is Nothing Then
                    ReturnValue = Tags(0)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(dstream)
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                            If s.Substring(0, 6) = "title=" Then
                                ReturnValue = s.Substring(Len("title="))
                                Exit Select
                            End If
                        End If
                    Next
                End If
        End Select

        Un4seen.Bass.Bass.BASS_ChannelStop(dstream)
        Return ReturnValue
    End Function

    Public Function ReadTagAlbum(ByVal Filename As String)
        xstream = Un4seen.Bass.Bass.BASS_StreamCreateFile(Filename, 0, 0, Un4seen.Bass.BASSFlag.BASS_STREAM_AUTOFREE)
        Un4seen.Bass.Bass.BASS_ChannelPause(xstream)
        Dim ReturnValue As String = ""
        Dim Tags() As String
        Dim Extension As String = System.IO.Path.GetExtension(Filename)

        Select Case Extension.ToUpper
            Case ".FLAC"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(xstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 6 Then 'Check the returned string is even long enough to hold the album
                            If s.Substring(0, 6) = "album=" Then
                                ReturnValue = s.Substring(Len("album="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".OGG"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(xstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 6 Then 'Check the returned string is even long enough to hold the album
                            If s.Substring(0, 6) = "album=" Then
                                ReturnValue = s.Substring(Len("album="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".WMA"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsWMA(xstream)
                If Tags.Count > 1 Then
                    For Each s As String In Tags
                        If s.Length > 14 Then 'Check the returned string is even long enough to hold the album
                            If s.Substring(0, 14) = "WM/AlbumTitle=" Then
                                ReturnValue = s.Substring(Len("WM/AlbumTitle="))
                                Exit Select
                            End If
                        End If
                    Next
                Else
                    Return ""
                End If

            Case ".MP3"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(xstream)
                If Tags.Count > 1 Then
                    ReturnValue = Tags(2)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V2(xstream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 5 Then 'Check the returned string is even long enough to hold the album
                                If s.Substring(0, 5) = "TALB=" Then
                                    ReturnValue = s.Substring(Len("TALB="))
                                    Exit Select
                                End If
                            End If
                        Next
                    End If
                End If
                Return ""

            Case ".AAC"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(xstream)
                If Not Tags Is Nothing Then
                    ReturnValue = Tags(2)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(xstream)
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the album
                            If s.Substring(0, 6) = "album=" Then
                                ReturnValue = s.Substring(Len("album="))
                                Exit Select
                            End If
                        End If
                    Next
                End If

            Case ".M4A"

                Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(xstream)
                If Not Tags Is Nothing Then
                    ReturnValue = Tags(2)
                    Exit Select
                Else
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(xstream)
                    For Each s As String In Tags
                        If s.Length > 7 Then 'Check the returned string is even long enough to hold the album
                            If s.Substring(0, 6) = "album=" Then
                                ReturnValue = s.Substring(Len("album="))
                                Exit Select
                            End If
                        End If
                    Next
                End If

        End Select

        Un4seen.Bass.Bass.BASS_ChannelStop(dstream)
        Return ReturnValue
    End Function


    Private Sub MusicThread()
        'This is the actual routine that's playing the music.  I use a background thread to play it.

        IsPlaying = 1

        stream = Un4seen.Bass.Bass.BASS_StreamCreateFile(Filename, 0, 0, Un4seen.Bass.BASSFlag.BASS_STREAM_AUTOFREE)

        intLength = Un4seen.Bass.Bass.BASS_ChannelGetLength(stream, BASS_POS_BYTE)

        If stream <> IntPtr.Zero Then
            Un4seen.Bass.Bass.BASS_ChannelPlay(stream, False)

            Do Until Un4seen.Bass.Bass.BASS_ChannelGetPosition(stream, BASS_POS_BYTE) = intLength OrElse booAbortMusic
                Threading.Thread.Sleep(1000)
            Loop
        End If
        Un4seen.Bass.Bass.BASS_StreamFree(stream)
        Un4seen.Bass.Bass.BASS_ChannelStop(stream)

        IsPlaying = 0
    End Sub

    Public Sub Volume(ByVal Percentage As Integer)
        Un4seen.Bass.Bass.BASS_SetVolume(Percentage / 100)
    End Sub

    Public Sub PauseMusic()
        'Pause Music, handling whether stopped, playing or paused
        If IsPlaying = 1 Then
            Un4seen.Bass.Bass.BASS_ChannelPause(stream)
            IsPlaying = 2
        ElseIf IsPlaying = 0 Then
            Exit Sub
        ElseIf IsPlaying = 2 Then
            Un4seen.Bass.Bass.BASS_ChannelPlay(stream, 0)
            IsPlaying = 1
        End If
    End Sub

    Public Function GetPlaybackPosition(Optional ByVal Fmat As Boolean = False)
        'Gets it in seconds.
        If Fmat = True Then
            If IsPlaying = 1 Or IsPlaying = 2 Then
                Dim Position As Double = Format(Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(stream, Un4seen.Bass.Bass.BASS_ChannelGetPosition(stream, Un4seen.Bass.BASSMode.BASS_POS_BYTES)), "0.00")
                Dim tempstr As String = SecondsToTime(Position)
                Return tempstr
            Else
                Return "00:00"
            End If
        Else
            If IsPlaying = 1 Or IsPlaying = 2 Then
                Return Format(Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(stream, Un4seen.Bass.Bass.BASS_ChannelGetPosition(stream, Un4seen.Bass.BASSMode.BASS_POS_BYTES)), "0.00")
            Else
                Return 1
            End If
        End If
        Return 0
    End Function

    Public Function GetTrackLength()
        If IsPlaying = 1 Or IsPlaying = 2 Then
            Dim i As Integer = Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(stream, Un4seen.Bass.Bass.BASS_ChannelGetLength(stream, Un4seen.Bass.BASSMode.BASS_POS_BYTES))
            Dim tempstr As String
            tempstr = SecondsToTime(i)
            Return tempstr
        Else
            Return "00:00"
        End If
    End Function

    Public Function GetTrackLengthSeconds()
        If IsPlaying = 1 Or IsPlaying = 2 Then
            Return Un4seen.Bass.Bass.BASS_ChannelBytes2Seconds(stream, Un4seen.Bass.Bass.BASS_ChannelGetLength(stream, Un4seen.Bass.BASSMode.BASS_POS_BYTES))
        Else
            Return 0
        End If
    End Function

    Public Function TrackTitle()
        Dim Tags() As String
        Dim Extension As String = System.IO.Path.GetExtension(Filename)
        If IsPlaying = 1 Or IsPlaying = 2 Then

            Select Case Extension.ToUpper
                Case ".FLAC"
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                                If s.Substring(0, 6) = "title=" Then
                                    Return s.Substring(Len("title="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If
                Case ".OGG"
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                                If s.Substring(0, 6) = "title=" Then
                                    Return s.Substring(Len("title="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If
                Case ".WMA"
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsWMA(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                                If s.Substring(0, 6) = "Title=" Then
                                    Return s.Substring(Len("Title="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If
                Case ".MP3"
                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Tags.Count > 1 Then
                        Return Tags(0)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V2(stream)
                        If Tags.Count > 1 Then
                            For Each s As String In Tags
                                If s.Length > 5 Then 'Check the returned string is even long enough to hold the title
                                    If s.Substring(0, 5) = "TIT2=" Then
                                        Return s.Substring(Len("TIT2="))
                                    End If
                                End If
                            Next
                        End If
                    End If
                    Return ""

                Case ".AAC"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Not Tags Is Nothing Then
                        Return Tags(0)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(stream)
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                                If s.Substring(0, 6) = "title=" Then
                                    Return s.Substring(Len("title="))
                                End If
                            End If
                        Next
                    End If

                Case ".M4A"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Not Tags Is Nothing Then
                        Return Tags(0)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(stream)
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the title
                                If s.Substring(0, 6) = "title=" Then
                                    Return s.Substring(Len("title="))
                                End If
                            End If
                        Next
                    End If
            End Select
            Return ""
        Else
            Return ""
        End If

    End Function

    Public Function TrackArtist()
        Dim Tags() As String
        Dim Extension As String = System.IO.Path.GetExtension(Filename)
        If IsPlaying = 1 Or IsPlaying = 2 Then

            Select Case Extension.ToUpper
                Case ".FLAC"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                                If s.Substring(0, 7) = "artist=" Then
                                    Return s.Substring(Len("artist="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If

                Case ".OGG"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                                If s.Substring(0, 7) = "artist=" Then
                                    Return s.Substring(Len("artist="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If

                Case ".WMA"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsWMA(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                                If s.Substring(0, 7) = "Author=" Then
                                    Return s.Substring(Len("author="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If

                Case ".MP3"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Tags.Count > 1 Then
                        Return Tags(1)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V2(stream)
                        If Tags.Count > 1 Then
                            For Each s As String In Tags
                                If s.Length > 5 Then 'Check the returned string is even long enough to hold the artist
                                    If s.Substring(0, 5) = "TPE1=" Then
                                        Return s.Substring(Len("TPE1="))
                                    End If
                                End If
                            Next
                        End If
                    End If
                    Return ""

                Case ".AAC"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Not Tags Is Nothing Then
                        Return Tags(1)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(stream)
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                                If s.Substring(0, 7) = "artist=" Then
                                    Return s.Substring(Len("artist="))
                                End If
                            End If
                        Next
                    End If

                Case ".M4A"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Not Tags Is Nothing Then
                        Return Tags(1)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(stream)
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the artist
                                If s.Substring(0, 7) = "artist=" Then
                                    Return s.Substring(Len("artist="))
                                End If
                            End If
                        Next
                    End If

            End Select
            Return ""
        Else
            Return ""
        End If
    End Function

    Public Function TrackAlbum()
        Dim Tags() As String
        Dim Extension As String = System.IO.Path.GetExtension(Filename)
        If IsPlaying = 1 Or IsPlaying = 2 Then

            Select Case Extension.ToUpper
                Case ".FLAC"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 6 Then 'Check the returned string is even long enough to hold the album
                                If s.Substring(0, 6) = "album=" Then
                                    Return s.Substring(Len("album="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If

                Case ".OGG"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsOGG(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 6 Then 'Check the returned string is even long enough to hold the album
                                If s.Substring(0, 6) = "album=" Then
                                    Return s.Substring(Len("album="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If

                Case ".WMA"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsWMA(stream)
                    If Tags.Count > 1 Then
                        For Each s As String In Tags
                            If s.Length > 14 Then 'Check the returned string is even long enough to hold the album
                                If s.Substring(0, 14) = "WM/AlbumTitle=" Then
                                    Return s.Substring(Len("WM/AlbumTitle="))
                                End If
                            End If
                        Next
                    Else
                        Return ""
                    End If

                Case ".MP3"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Tags.Count > 1 Then
                        Return Tags(2)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V2(stream)
                        If Tags.Count > 1 Then
                            For Each s As String In Tags
                                If s.Length > 5 Then 'Check the returned string is even long enough to hold the album
                                    If s.Substring(0, 5) = "TALB=" Then
                                        Return s.Substring(Len("TALB="))
                                    End If
                                End If
                            Next
                        End If
                    End If
                    Return ""

                Case ".AAC"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Not Tags Is Nothing Then
                        Return Tags(2)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(stream)
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the album
                                If s.Substring(0, 6) = "album=" Then
                                    Return s.Substring(Len("album="))
                                End If
                            End If
                        Next
                    End If

                Case ".M4A"

                    Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsID3V1(stream)
                    If Not Tags Is Nothing Then
                        Return Tags(2)
                    Else
                        Tags = Un4seen.Bass.Bass.BASS_ChannelGetTagsMP4(stream)
                        For Each s As String In Tags
                            If s.Length > 7 Then 'Check the returned string is even long enough to hold the album
                                If s.Substring(0, 6) = "album=" Then
                                    Return s.Substring(Len("album="))
                                End If
                            End If
                        Next
                    End If

            End Select
            Return ""
        Else
            Return ""
        End If

    End Function

    Public Sub SkipTo(ByVal time As Integer)
        If IsPlaying = 1 Or IsPlaying = 2 Then
            Un4seen.Bass.Bass.BASS_ChannelSetPosition(CInt(stream), Un4seen.Bass.Bass.BASS_ChannelSeconds2Bytes(stream, time), Un4seen.Bass.BASSMode.BASS_POS_BYTES)
        Else
        End If
    End Sub

    Public Sub SkipToPercent(ByVal Percent As Integer)
        If IsPlaying = 1 Or IsPlaying = 2 Then
            SkipTo((GetTrackLengthSeconds() / 100) * Percent)
        Else
        End If
    End Sub

    Public Function MusicStatus()
        Return IsPlaying
    End Function

End Class
