mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
Refactored the LAME interop.
This commit is contained in:
130
CUETools.Codecs.LAME/Interop/LHV1.cs
Normal file
130
CUETools.Codecs.LAME/Interop/LHV1.cs
Normal file
@@ -0,0 +1,130 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CUETools.Codecs.LAME.Interop
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential, Size = 327), Serializable]
|
||||
public struct LHV1 // BE_CONFIG_LAME LAME header version 1
|
||||
{
|
||||
public const uint MPEG1 = 1;
|
||||
public const uint MPEG2 = 0;
|
||||
|
||||
// STRUCTURE INFORMATION
|
||||
public uint dwStructVersion;
|
||||
public uint dwStructSize;
|
||||
// BASIC ENCODER SETTINGS
|
||||
public uint dwSampleRate; // SAMPLERATE OF INPUT FILE
|
||||
public uint dwReSampleRate; // DOWNSAMPLERATE, 0=ENCODER DECIDES
|
||||
public MpegMode nMode; // STEREO, MONO
|
||||
public uint dwBitrate; // CBR bitrate, VBR min bitrate
|
||||
public uint dwMaxBitrate; // CBR ignored, VBR Max bitrate
|
||||
public LAME_QUALITY_PRESET nPreset; // Quality preset
|
||||
public uint dwMpegVersion; // MPEG-1 OR MPEG-2
|
||||
public uint dwPsyModel; // FUTURE USE, SET TO 0
|
||||
public uint dwEmphasis; // FUTURE USE, SET TO 0
|
||||
// BIT STREAM SETTINGS
|
||||
public int bPrivate; // Set Private Bit (TRUE/FALSE)
|
||||
public int bCRC; // Insert CRC (TRUE/FALSE)
|
||||
public int bCopyright; // Set Copyright Bit (TRUE/FALSE)
|
||||
public int bOriginal; // Set Original Bit (TRUE/FALSE)
|
||||
// VBR STUFF
|
||||
public int bWriteVBRHeader; // WRITE XING VBR HEADER (TRUE/FALSE)
|
||||
public int bEnableVBR; // USE VBR ENCODING (TRUE/FALSE)
|
||||
public int nVBRQuality; // VBR QUALITY 0..9
|
||||
public uint dwVbrAbr_bps; // Use ABR in stead of nVBRQuality
|
||||
public VBRMETHOD nVbrMethod;
|
||||
public int bNoRes; // Disable Bit resorvoir (TRUE/FALSE)
|
||||
// MISC SETTINGS
|
||||
public int bStrictIso; // Use strict ISO encoding rules (TRUE/FALSE)
|
||||
public ushort nQuality; // Quality Setting, HIGH BYTE should be NOT LOW byte, otherwhise quality=5
|
||||
// FUTURE USE, SET TO 0, align strucutre to 331 bytes
|
||||
//[ MarshalAs( UnmanagedType.ByValArray, SizeConst=255-4*4-2 )]
|
||||
//public byte[] btReserved;//[255-4*sizeof(DWORD) - sizeof( WORD )];
|
||||
|
||||
public LHV1(AudioPCMConfig format, uint MpeBitRate, uint quality)
|
||||
{
|
||||
dwStructVersion = 1;
|
||||
dwStructSize = (uint)Marshal.SizeOf(typeof(BE_CONFIG));
|
||||
switch (format.SampleRate)
|
||||
{
|
||||
case 16000:
|
||||
case 22050:
|
||||
case 24000:
|
||||
dwMpegVersion = MPEG2;
|
||||
break;
|
||||
case 32000:
|
||||
case 44100:
|
||||
case 48000:
|
||||
dwMpegVersion = MPEG1;
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException("format", "Unsupported sample rate");
|
||||
}
|
||||
dwSampleRate = (uint)format.SampleRate; // INPUT FREQUENCY
|
||||
dwReSampleRate = 0; // DON'T RESAMPLE
|
||||
switch (format.ChannelCount)
|
||||
{
|
||||
case 1:
|
||||
nMode = MpegMode.MONO;
|
||||
break;
|
||||
case 2:
|
||||
nMode = MpegMode.STEREO;
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException("format", "Invalid number of channels");
|
||||
}
|
||||
switch (MpeBitRate)
|
||||
{
|
||||
case 0:
|
||||
case 32:
|
||||
case 40:
|
||||
case 48:
|
||||
case 56:
|
||||
case 64:
|
||||
case 80:
|
||||
case 96:
|
||||
case 112:
|
||||
case 128:
|
||||
case 160: //Allowed bit rates in MPEG1 and MPEG2
|
||||
break;
|
||||
case 192:
|
||||
case 224:
|
||||
case 256:
|
||||
case 320: //Allowed only in MPEG1
|
||||
if (dwMpegVersion != MPEG1)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException("MpsBitRate", "Bit rate not compatible with input format");
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
case 16:
|
||||
case 24:
|
||||
case 144: //Allowed only in MPEG2
|
||||
if (dwMpegVersion != MPEG2)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException("MpsBitRate", "Bit rate not compatible with input format");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException("MpsBitRate", "Unsupported bit rate");
|
||||
}
|
||||
dwBitrate = MpeBitRate; // MINIMUM BIT RATE
|
||||
nPreset = LAME_QUALITY_PRESET.LQP_NORMAL_QUALITY; // QUALITY PRESET SETTING
|
||||
dwPsyModel = 0; // USE DEFAULT PSYCHOACOUSTIC MODEL
|
||||
dwEmphasis = 0; // NO EMPHASIS TURNED ON
|
||||
bOriginal = 1; // SET ORIGINAL FLAG
|
||||
bWriteVBRHeader = 0;
|
||||
bNoRes = 0; // No Bit resorvoir
|
||||
bCopyright = 0;
|
||||
bCRC = 0;
|
||||
bEnableVBR = 0;
|
||||
bPrivate = 0;
|
||||
bStrictIso = 0;
|
||||
dwMaxBitrate = 0;
|
||||
dwVbrAbr_bps = 0;
|
||||
nQuality = (ushort)(quality | ((~quality) << 8));
|
||||
nVbrMethod = VBRMETHOD.VBR_METHOD_NONE;
|
||||
nVBRQuality = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user