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); }
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); }