Public Class GlobalMembersFlac
''' <summary>
''' Lit les métadonnées du fichier FLAC.
''' </summary>
''' <param name = "fileName">Chemin d'accès du fichier FLAC à analyser</param>
Public Shared Public override Sub ReadMetadata(ByVal fileName As String)
FileName = fileName
ClearTags()
ClearArts()
metadataBlocks.Clear()
Dim fs As FileStream = Nothing
Try
fs = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
Length = fs.Length
If Length = 0 Then
Throw New FileFormatException("The file is not a valid FLAC file because it is empty.")
End If
Dim br As var = New BinaryReader(fs)
If Not fLaC.ArrayEquals(br.ReadBytes(4)) Then
Throw New FileFormatException("The file is not a valid FLAC file.")
End If
fs.Position = 18
Dim buffer() As [byte] = br.ReadBytes(8)
SampleRate = buffer(0)
SampleRate = (SampleRate << 8) Or buffer(1)
SampleRate = (SampleRate << 4) Or (buffer(2) >> 4)
Channels = CType(((buffer(2) >> 1) And 7) + 1, [byte])
BitsPerSample = CType((((buffer(2) And 1) << 4) Or (buffer(3) >> 4)) + 1, [byte])
Samples = (buffer(3) And 15)
Samples = (Samples << 8) Or buffer(4)
Samples = (Samples << 8) Or buffer(5)
Samples = (Samples << 8) Or buffer(6)
Samples = (Samples << 8) Or buffer(7)
fs.Position = 42 ' first metadata block following STREAM_INFO
Dim last_metadata_block As Boolean
Do
Dim startHeader As [byte] = br.ReadByte()
last_metadata_block = (startHeader >> 7) = 1
Dim blockType As var = CType(startHeader And 127, FlacMetadataBlock)
buffer = br.ReadBytes(3)
Dim size As Integer = buffer(0)
size = (size << 8) Or buffer(1)
size = (size << 8) Or buffer(2)
Select Case blockType
Case FlacMetadataBlock.StreamInfo
Throw New FileFormatException("The file contains several Stream Info blocks.")
Case FlacMetadataBlock.Padding
fs.Position += size
Case FlacMetadataBlock.VorbisComment
ReadVorbisComment(fs, False)
Case FlacMetadataBlock.Picture
buffer = br.ReadBytes(size)
AddArt(New ID3PictureFrame(buffer))
Case Else ' APPLICATION, SEEKTABLE, CUESHEET, other blocks
Dim metadata As var = New [byte](size + 4 - 1){}
metadata(0) = CType(blockType, [byte])
buffer.CopyTo(metadata, 1)
buffer = br.ReadBytes(size)
buffer.CopyTo(metadata, 4)
metadataBlocks.Add(metadata)
End Select
Loop While Not last_metadata_block
If Vendor Is Nothing Then
Throw New FileFormatException("The Vorbis comment header cannot be found in the file.")
End If
offsetAudioFrameStart = fs.Position
Finally
If fs IsNot Nothing Then
fs.Close()
End If
End Try
End Sub
End Class