Пример #1
0
        public unsafe bool WriteOutput(MpegConverterSettings settings)
        {
            AudioFileDataHeader audioFileDataHeader = new AudioFileDataHeader
            {
                CompressionType = AudioFileDataCompressionType.EALayer3_EL31,
                Channels        = settings.NumberOfChannels == 1 ? AudioFileDataChannels.Mono : AudioFileDataChannels.Stereo,
                SampleRate      = (short)settings.SampleRate
            };

            Endian.ByteSwapInt16((ushort *)&audioFileDataHeader.SampleRate);
            MpegFrameHeader frameHeader;

            while ((frameHeader = ReadFrameHeader()) != null)
            {
                BitStreamWriter writer = new BitStreamWriter();
                writer.Write(0, 8);
                writer.Write((byte)frameHeader.Version, 2);
                writer.Write(frameHeader.SampleRateIndex, 2);
                writer.Write((byte)frameHeader.ChannelMode, 2);
                writer.Write(frameHeader.ModeExtension, 2);
                // writer.Write(); // TODO: is granule index == 1
                // if granule index == 1 && version == mv_1
                //   for channels -> 4 bits scfsi
                // for channels -> channel info 12 + 32 + x bits
                // add up data size
                // data size += 8 - size % 8
                // data size /= 8
                // if data size > 0
                // copy data
            }
            return(true);
        }
Пример #2
0
        public unsafe bool WriteOutput(BlockInfo info, MpegConverterSettings settings)
        {
            AudioFileDataHeader audioFileDataHeader = new AudioFileDataHeader
            {
                CompressionType = AudioFileDataCompressionType.EALayer3_EL31,
                Channels        = settings.NumberOfChannels == 1 ? AudioFileDataChannels.Mono : AudioFileDataChannels.Stereo,
                SampleRate      = (short)settings.SampleRate,
                NumberOfSamples = info.NumberOfSamples,
                Size            = info.Size
            };

            Endian.ByteSwapInt16((ushort *)&audioFileDataHeader.SampleRate);
            Endian.ByteSwapInt32((uint *)&audioFileDataHeader.NumberOfSamples);
            Endian.ByteSwapInt32((uint *)&audioFileDataHeader.Size);
            if (settings.IsStreamed)
            {
                byte[] buffer = new byte[2];
                _outputSnr.Write(buffer, 0, buffer.Length);
            }
            else
            {
                byte[] buffer = new byte[sizeof(AudioFileDataHeader)];
                fixed(byte *pBuffer = &buffer[0])
                {
                    MarshalUtil.CopyMemory((IntPtr)pBuffer, (IntPtr)(byte *)&audioFileDataHeader, sizeof(AudioFileDataHeader));
                }

                _outputSnr.Write(buffer, 0, buffer.Length);
            }
            MpegFrameHeader frameHeader;

            while ((frameHeader = ReadFrameHeader()) != null)
            {
                BitStreamWriter writer = new BitStreamWriter();
                writer.Write(0, 8);
                writer.Write((byte)frameHeader.Version, 2);
                writer.Write(frameHeader.SampleRateIndex, 2);
                writer.Write((byte)frameHeader.ChannelMode, 2);
                writer.Write(frameHeader.ModeExtension, 2);
                // read frame data
                writer.Write(); // TODO: is granule index == 1
                // if granule index == 1 && version == mv_1
                //   for channels -> 4 bits scfsi
                // for channels -> channel info 12 + 32 + x bits
                // add up data size
                // data size += 8 - size % 8
                // data size /= 8
                // if data size > 0
                // copy data
            }
            return(true);
        }