public AudioFile Read(string fileName, out ArrayList ID3Frames) { AudioFile audioFile = new AudioFile(); byte[] vs = File.ReadAllBytes(fileName + ".mp3"); int index = 0; //Load ID3 readID3(vs, ref index); Console.WriteLine("ID3v2." + ID3Ver + " Header Loaded"); //Start Reading Frames AudioFileFormat format = new AudioFileFormat(); byte[] audioData; while (index < vs.Length) { //TODO: Implement MP3 File Reading //Read Frame Header byte[] headerBytes = new byte[4]; Array.Copy(vs, index, headerBytes, 0, 4); index += 4; MP3FrameHeader header = ReadFrameHeader(headerBytes); if (format.BitsPerSample != header.bps) { format.BitsPerSample = (ushort)header.bps; } if (format.SampleRate != header.sampleRate) { format.SampleRate = header.sampleRate; } if (format.nChannels != header.channels) { format.nChannels = (ushort)header.channels; } if (header.prot) { index += 2; } int bound = header.channelMode == 0b0 ? 4 : header.channelMode == 0b01 ? 8 : header.channelMode == 0b10 ? 12 : header.channelMode == 0b11 ? 16 : -1; } ID3Frames = frames; return(audioFile); }
private MP3FrameHeader ReadFrameHeader(byte[] headerBytes) { MP3FrameHeader frameHeader = new MP3FrameHeader(); BitArray header = new BitArray(headerBytes); int headerIndex = 11; int MPEGId = BitTools.BitArrayToInt(header, ref headerIndex, 2); if (MPEGId == 0) { throw new FileLoadException("MPEG-2.5 Not Supported"); } else if (MPEGId == 2) { throw new FileLoadException("MPEG-2 Not Supported"); } else if (MPEGId != 3) { throw new FileLoadException("Invalid Version ID"); } frameHeader.MPEGId = MPEGId; int MPEGLayr = BitTools.BitArrayToInt(header, ref headerIndex, 2); //0 = res, 1 = Layer 3, 2 = Layer 2, 3 = Layer 1 frameHeader.MPEGLayr = MPEGLayr; frameHeader.prot = header.Get(headerIndex++); uint bitrate = 0; if (MPEGId == 2) { bitrate = bitrateIndex[3 - MPEGLayr][BitTools.BitArrayToInt(header, ref headerIndex, 4)]; } else if (MPEGId == 2 || MPEGId == 0) { if (MPEGLayr == 1) { bitrate = bitrateIndex[4][BitTools.BitArrayToInt(header, ref headerIndex, 4)]; } else { bitrate = bitrateIndex[5][BitTools.BitArrayToInt(header, ref headerIndex, 4)]; } } bitrate *= 1000; frameHeader.bitrate = bitrate; uint sampleRate = 0; switch (MPEGId) { case 0: sampleRate = samplerateIndex[3][BitTools.BitArrayToInt(header, ref headerIndex, 2)]; break; case 2: sampleRate = samplerateIndex[0][BitTools.BitArrayToInt(header, ref headerIndex, 2)]; break; case 3: sampleRate = samplerateIndex[1][BitTools.BitArrayToInt(header, ref headerIndex, 2)]; break; } frameHeader.sampleRate = sampleRate; frameHeader.pad = header.Get(headerIndex++); headerIndex++; int channelMode = BitTools.BitArrayToInt(header, ref headerIndex, 2); if (channelMode == 1) { frameHeader.MSS = header.Get(headerIndex++); frameHeader.IS = header.Get(headerIndex++); } else { headerIndex += 2; } frameHeader.channelMode = channelMode; headerIndex += 2; frameHeader.emph = BitTools.BitArrayToInt(header, ref headerIndex, 2); int bitsPerSample = 0; if (channelMode == 1 || channelMode == 3) { bitsPerSample = (int)(bitrate / (sampleRate * 2)); } else if (channelMode == 0 || channelMode == 2) { bitsPerSample = (int)(bitrate / sampleRate); } frameHeader.bps = bitsPerSample; if (channelMode == 0b11) { frameHeader.channels = 1; } else { frameHeader.channels = 2; } return(frameHeader); }