Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }