diff --git a/CUERipper/frmCUERipper.cs b/CUERipper/frmCUERipper.cs
index 9961c13..7e562d9 100644
--- a/CUERipper/frmCUERipper.cs
+++ b/CUERipper/frmCUERipper.cs
@@ -1018,7 +1018,7 @@ namespace CUERipper
{
trackBarEncoderMode.Maximum = modes.Length - 1;
trackBarEncoderMode.Value = encoder.DefaultModeIndex == -1 ? modes.Length - 1 : encoder.DefaultModeIndex;
- labelEncoderMode.Text = encoder.default_mode;
+ labelEncoderMode.Text = encoder.EncoderMode;
labelEncoderMinMode.Text = modes[0];
labelEncoderMaxMode.Text = modes[modes.Length - 1];
trackBarEncoderMode.Visible = true;
@@ -1032,8 +1032,8 @@ namespace CUERipper
{
CUEToolsUDC encoder = bnComboBoxEncoder.SelectedItem as CUEToolsUDC;
string[] modes = encoder.SupportedModes;
- encoder.default_mode = modes[trackBarEncoderMode.Value];
- labelEncoderMode.Text = encoder.default_mode;
+ encoder.EncoderMode = modes[trackBarEncoderMode.Value];
+ labelEncoderMode.Text = encoder.EncoderMode;
}
private void trackBarSecureMode_Scroll(object sender, EventArgs e)
diff --git a/CUETools.ALACEnc/Program.cs b/CUETools.ALACEnc/Program.cs
index dbb4bdd..8a173c8 100644
--- a/CUETools.ALACEnc/Program.cs
+++ b/CUETools.ALACEnc/Program.cs
@@ -176,8 +176,11 @@ namespace CUETools.ALACEnc
try
{
- if (level >= 0)
- alac.CompressionLevel = level;
+ var settings = new ALACWriterSettings();
+ settings.DoVerify = do_verify;
+ if (level >= 0)
+ settings.EncoderModeIndex = level;
+ alac.Settings = settings;
if (stereo_method != null)
alac.StereoMethod = Alac.LookupStereoMethod(stereo_method);
if (order_method != null)
diff --git a/CUETools.AccurateRip/AccurateRip.cs b/CUETools.AccurateRip/AccurateRip.cs
index 02856ab..670d35b 100644
--- a/CUETools.AccurateRip/AccurateRip.cs
+++ b/CUETools.AccurateRip/AccurateRip.cs
@@ -931,21 +931,15 @@ namespace CUETools.AccurateRip
throw new Exception("unsupported");
}
- public int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.AccurateRip/CDRepair.cs b/CUETools.AccurateRip/CDRepair.cs
index af43fc1..09558e6 100644
--- a/CUETools.AccurateRip/CDRepair.cs
+++ b/CUETools.AccurateRip/CDRepair.cs
@@ -413,21 +413,15 @@ namespace CUETools.AccurateRip
throw new Exception("unsupported");
}
- public int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.Codecs.ALAC/ALACWriter.cs b/CUETools.Codecs.ALAC/ALACWriter.cs
index f065c5a..5d20e69 100644
--- a/CUETools.Codecs.ALAC/ALACWriter.cs
+++ b/CUETools.Codecs.ALAC/ALACWriter.cs
@@ -33,16 +33,21 @@ using CUETools.Codecs;
namespace CUETools.Codecs.ALAC
{
- public class ALACWriterSettings
+ public class ALACWriterSettings: AudioEncoderSettings
{
- public ALACWriterSettings() { DoVerify = false; }
+ public ALACWriterSettings()
+ : base("0 1 2 3 4 5 6 7 8 9 10", "3")
+ {
+ DoVerify = false;
+ }
+
[DefaultValue(false)]
[DisplayName("Verify")]
[Description("Decode each frame and compare with original")]
public bool DoVerify { get; set; }
}
- [AudioEncoderClass("cuetools", "m4a", true, "0 1 2 3 4 5 6 7 8 9 10", "3", 1, typeof(ALACWriterSettings))]
+ [AudioEncoderClass("cuetools", "m4a", true, 1, typeof(ALACWriterSettings))]
public class ALACWriter : IAudioDest
{
Stream _IO = null;
@@ -81,7 +86,6 @@ namespace CUETools.Codecs.ALAC
float[] windowBuffer;
int samplesInBuffer = 0;
- int _compressionLevel = 5;
int _blocksize = 0;
int _totalSize = 0;
int _windowsize = 0, _windowcount = 0;
@@ -114,7 +118,7 @@ namespace CUETools.Codecs.ALAC
residualBuffer = new int[Alac.MAX_BLOCKSIZE * (_pcm.ChannelCount == 2 ? 6 : _pcm.ChannelCount + 1)];
windowBuffer = new float[Alac.MAX_BLOCKSIZE * 2 * Alac.MAX_LPC_WINDOWS];
- eparams.set_defaults(_compressionLevel);
+ eparams.set_defaults(5);
eparams.padding_size = 4096;
frame = new ALACFrame(_pcm.ChannelCount == 2 ? 5 : _pcm.ChannelCount);
@@ -134,24 +138,9 @@ namespace CUETools.Codecs.ALAC
}
}
- public int CompressionLevel
- {
- get
- {
- return _compressionLevel;
- }
- set
- {
- if (value < 0 || value > 10)
- throw new Exception("unsupported compression level");
- _compressionLevel = value;
- eparams.set_defaults(_compressionLevel);
- }
- }
-
ALACWriterSettings _settings = new ALACWriterSettings();
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
@@ -162,7 +151,11 @@ namespace CUETools.Codecs.ALAC
if (value as ALACWriterSettings == null)
throw new Exception("Unsupported options " + value);
_settings = value as ALACWriterSettings;
- }
+ var _compressionLevel = _settings.EncoderModeIndex;
+ if (_compressionLevel < 0 || _compressionLevel > 10)
+ throw new Exception("unsupported compression level");
+ eparams.set_defaults(_compressionLevel);
+ }
}
public long Padding
diff --git a/CUETools.Codecs.APE/CUETools.Codecs.APE.cpp b/CUETools.Codecs.APE/CUETools.Codecs.APE.cpp
index 4947ff0..1423b05 100644
--- a/CUETools.Codecs.APE/CUETools.Codecs.APE.cpp
+++ b/CUETools.Codecs.APE/CUETools.Codecs.APE.cpp
@@ -252,12 +252,22 @@ namespace CUETools { namespace Codecs { namespace APE {
}
};
- [AudioEncoderClass("MAC_SDK", "ape", true, "fast normal high extra insane", "high", 1, Object::typeid)]
+ public ref class APEWriterSettings : AudioEncoderSettings
+ {
+ public:
+ APEWriterSettings()
+ : AudioEncoderSettings("fast normal high extra insane", "high")
+ {
+ }
+ };
+
+ [AudioEncoderClass("MAC_SDK", "ape", true, 1, APEWriterSettings::typeid)]
public ref class APEWriter : IAudioDest
{
public:
APEWriter(String^ path, AudioPCMConfig^ pcm)
{
+ _settings = gcnew APEWriterSettings();
_pcm = pcm;
if (_pcm->ChannelCount != 1 && _pcm->ChannelCount != 2)
@@ -268,8 +278,6 @@ namespace CUETools { namespace Codecs { namespace APE {
_path = path;
_winFileIO = NULL;
- _compressionLevel = COMPRESSION_LEVEL_NORMAL;
-
int nRetVal;
pAPECompress = CreateIAPECompress (&nRetVal);
if (!pAPECompress)
@@ -286,7 +294,7 @@ namespace CUETools { namespace Codecs { namespace APE {
_gchBuffer.Free();
}
- virtual void Close()
+ void DoClose()
{
if (pAPECompress)
{
@@ -295,10 +303,6 @@ namespace CUETools { namespace Codecs { namespace APE {
pAPECompress = NULL;
}
- if ((_finalSampleCount != 0) && (_samplesWritten != _finalSampleCount)) {
- throw gcnew Exception("Samples written differs from the expected sample count.");
- }
-
if (_IO != nullptr)
{
_IO->Close ();
@@ -306,9 +310,19 @@ namespace CUETools { namespace Codecs { namespace APE {
}
}
+ virtual void Close()
+ {
+ DoClose();
+
+ if ((_finalSampleCount != 0) && (_samplesWritten != _finalSampleCount)) {
+ throw gcnew Exception("Samples written differs from the expected sample count.");
+ }
+ }
+
virtual void Delete()
{
- try { Close (); } catch (Exception^) {}
+ DoClose ();
+
File::Delete(_path);
}
@@ -361,34 +375,24 @@ namespace CUETools { namespace Codecs { namespace APE {
}
}
- virtual property Int32 CompressionLevel {
- Int32 get() {
- return _compressionLevel / 1000 - 1;
- }
- void set(Int32 value) {
- if (value < 0 || value > 4)
- throw gcnew Exception("Invalid compression mode.");
- _compressionLevel = (value + 1) * 1000;
- }
- }
-
virtual property __int64 Padding
{
void set(__int64 value) {
}
}
- virtual property Object^ Settings
+ virtual property AudioEncoderSettings^ Settings
{
- Object^ get()
+ AudioEncoderSettings^ get()
{
- return nullptr;
+ return _settings;
}
- void set(Object^ value)
+ void set(AudioEncoderSettings^ value)
{
- if (value != nullptr && value->GetType() != Object::typeid)
+ if (value != nullptr && value->GetType() != APEWriterSettings::typeid)
throw gcnew Exception(String::Format("Unsupported options: {0}", value));
+ _settings = (APEWriterSettings^)value;
}
}
@@ -397,7 +401,7 @@ namespace CUETools { namespace Codecs { namespace APE {
bool _initialized;
Int32 _finalSampleCount, _samplesWritten;
AudioPCMConfig^ _pcm;
- Int32 _compressionLevel;
+ APEWriterSettings^ _settings;
String^ _path;
Stream^ _IO;
GCHandle _gchIO, _gchBuffer;
@@ -416,6 +420,8 @@ namespace CUETools { namespace Codecs { namespace APE {
WAVEFORMATEX waveFormat;
FillWaveFormatEx (&waveFormat, _pcm->SampleRate, _pcm->BitsPerSample, _pcm->ChannelCount);
+ Int32 _compressionLevel = (_settings->EncoderModeIndex + 1) * 1000;
+
int res = pAPECompress->StartEx (_winFileIO,
&waveFormat,
(_finalSampleCount == 0) ? MAX_AUDIO_BYTES_UNKNOWN : _finalSampleCount * _pcm->BlockAlign,
diff --git a/CUETools.Codecs.CoreAudio/WasapiOut.cs b/CUETools.Codecs.CoreAudio/WasapiOut.cs
index 71a2792..d318b0c 100644
--- a/CUETools.Codecs.CoreAudio/WasapiOut.cs
+++ b/CUETools.Codecs.CoreAudio/WasapiOut.cs
@@ -494,21 +494,15 @@ namespace CUETools.Codecs.CoreAudio
set { ; }
}
- public int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp b/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp
index 2cdc518..7065a45 100644
--- a/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp
+++ b/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp
@@ -448,10 +448,11 @@ namespace CUETools { namespace Codecs { namespace FLAC {
}
};
- public ref class FLACWriterSettings
+ public ref class FLACWriterSettings: AudioEncoderSettings
{
public:
FLACWriterSettings()
+ : AudioEncoderSettings("0 1 2 3 4 5 6 7 8", "5")
{
_md5Sum = true;
_verify = false;
@@ -498,7 +499,7 @@ namespace CUETools { namespace Codecs { namespace FLAC {
bool _md5Sum, _verify, _disableAsm;
};
- [AudioEncoderClass("libFLAC", "flac", true, "0 1 2 3 4 5 6 7 8", "5", 2, FLACWriterSettings::typeid)]
+ [AudioEncoderClass("libFLAC", "flac", true, 2, FLACWriterSettings::typeid)]
public ref class FLACWriter : IAudioDest
{
public:
@@ -515,7 +516,6 @@ namespace CUETools { namespace Codecs { namespace FLAC {
_path = path;
_finalSampleCount = 0;
_samplesWritten = 0;
- _compressionLevel = 5;
_paddingLength = 8192;
_blockSize = 0;
@@ -608,25 +608,14 @@ namespace CUETools { namespace Codecs { namespace FLAC {
_samplesWritten += sampleBuffer->Length;
}
- virtual property Int32 CompressionLevel {
- Int32 get() {
- return _compressionLevel;
- }
- void set(Int32 value) {
- if ((value < 0) || (value > 8))
- throw gcnew Exception("invalid compression level");
- _compressionLevel = value;
- }
- }
-
- virtual property Object^ Settings
+ virtual property AudioEncoderSettings^ Settings
{
- Object^ get()
+ AudioEncoderSettings^ get()
{
return _settings;
}
- void set(Object^ value)
+ void set(AudioEncoderSettings^ value)
{
if (value == nullptr || value->GetType() != FLACWriterSettings::typeid)
throw gcnew Exception(String::Format("Unsupported options: {0}", value));
@@ -652,7 +641,6 @@ namespace CUETools { namespace Codecs { namespace FLAC {
String^ _path;
Int64 _finalSampleCount, _samplesWritten, _blockSize;
AudioPCMConfig^ _pcm;
- Int32 _compressionLevel;
__int64 _paddingLength;
FLAC__StreamMetadata **_metadataList;
int _metadataCount;
@@ -726,7 +714,7 @@ namespace CUETools { namespace Codecs { namespace FLAC {
FLAC__stream_encoder_set_total_samples_estimate(_encoder, _finalSampleCount);
}
- FLAC__stream_encoder_set_compression_level(_encoder, _compressionLevel);
+ FLAC__stream_encoder_set_compression_level(_encoder, _settings->EncoderModeIndex);
if (_blockSize > 0)
FLAC__stream_encoder_set_blocksize(_encoder, (unsigned)_blockSize);
diff --git a/CUETools.Codecs.FLACCL/FLACCLWriter.cs b/CUETools.Codecs.FLACCL/FLACCLWriter.cs
index ca10b42..be4c1cc 100644
--- a/CUETools.Codecs.FLACCL/FLACCLWriter.cs
+++ b/CUETools.Codecs.FLACCL/FLACCLWriter.cs
@@ -31,9 +31,10 @@ using OpenCLNet;
namespace CUETools.Codecs.FLACCL
{
- public class FLACCLWriterSettings
+ public class FLACCLWriterSettings: AudioEncoderSettings
{
public FLACCLWriterSettings()
+ : base("", "8")
{
this.DoVerify = false;
this.GPUOnly = true;
@@ -43,8 +44,14 @@ namespace CUETools.Codecs.FLACCL
this.GroupSize = 128;
this.TaskSize = 8;
this.DeviceType = OpenCLDeviceType.GPU;
+ this.AllowNonSubset = false;
}
+ public override string GetSupportedModes()
+ {
+ return this.AllowNonSubset ? "0 1 2 3 4 5 6 7 8 9 10 11" : "0 1 2 3 4 5 6 7 8";
+ }
+
[DefaultValue(false)]
[DisplayName("Verify")]
[SRDescription(typeof(Properties.Resources), "DoVerifyDescription")]
@@ -120,7 +127,12 @@ namespace CUETools.Codecs.FLACCL
padding = value;
}
}
- }
+
+ [DefaultValue(false)]
+ [DisplayName("Allow Non-subset")]
+ [SRDescription(typeof(Properties.Resources), "AllowNonSubsetDescription")]
+ public bool AllowNonSubset { get; set; }
+ }
public class FLACCLWriterSettingsPlatformConverter : TypeConverter
{
@@ -157,7 +169,7 @@ namespace CUETools.Codecs.FLACCL
GPU = DeviceType.GPU
}
- [AudioEncoderClass("FLACCL", "flac", true, "0 1 2 3 4 5 6 7 8 9 10 11", "8", 2, typeof(FLACCLWriterSettings))]
+ [AudioEncoderClass("FLACCL", "flac", true, 2, typeof(FLACCLWriterSettings))]
//[AudioEncoderClass("FLACCL nonsub", "flac", true, "9 10 11", "9", 1, typeof(FLACCLWriterSettings))]
public class FLACCLWriter : IAudioDest
{
@@ -200,7 +212,6 @@ namespace CUETools.Codecs.FLACCL
int samplesInBuffer = 0;
- int _compressionLevel = 7;
int _blocksize = 0;
int _totalSize = 0;
@@ -245,7 +256,7 @@ namespace CUETools.Codecs.FLACCL
_path = path;
_IO = IO;
- eparams.flake_set_defaults(_compressionLevel);
+ eparams.flake_set_defaults(7);
eparams.padding_size = _settings.Padding;
crc8 = new Crc8();
@@ -276,24 +287,9 @@ namespace CUETools.Codecs.FLACCL
}
}
- public int CompressionLevel
- {
- get
- {
- return _compressionLevel;
- }
- set
- {
- if (value < 0 || value > 11)
- throw new Exception("unsupported compression level");
- _compressionLevel = value;
- eparams.flake_set_defaults(_compressionLevel);
- }
- }
-
internal FLACCLWriterSettings _settings = new FLACCLWriterSettings();
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
@@ -304,6 +300,10 @@ namespace CUETools.Codecs.FLACCL
if (value as FLACCLWriterSettings == null)
throw new Exception("Unsupported options " + value);
_settings = value as FLACCLWriterSettings;
+ var _compressionLevel = _settings.EncoderModeIndex;
+ if (_compressionLevel < 0 || _compressionLevel > 11)
+ throw new Exception("unsupported compression level");
+ eparams.flake_set_defaults(_compressionLevel);
eparams.padding_size = _settings.Padding;
}
}
diff --git a/CUETools.Codecs.FLACCL/Properties/Resources.Designer.cs b/CUETools.Codecs.FLACCL/Properties/Resources.Designer.cs
index d709298..b43ad8e 100644
--- a/CUETools.Codecs.FLACCL/Properties/Resources.Designer.cs
+++ b/CUETools.Codecs.FLACCL/Properties/Resources.Designer.cs
@@ -60,6 +60,15 @@ namespace CUETools.Codecs.FLACCL.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Allow non-subset modes, which allow for greater compression, but are less compatible.
+ ///
+ internal static string AllowNonSubsetDescription {
+ get {
+ return ResourceManager.GetString("AllowNonSubsetDescription", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Use additional CPU threads.
///
diff --git a/CUETools.Codecs.FLACCL/Properties/Resources.resx b/CUETools.Codecs.FLACCL/Properties/Resources.resx
index 799dfbb..e2664c2 100644
--- a/CUETools.Codecs.FLACCL/Properties/Resources.resx
+++ b/CUETools.Codecs.FLACCL/Properties/Resources.resx
@@ -117,6 +117,9 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ Allow non-subset modes, which allow for greater compression, but are less compatible
+
Use additional CPU threads
diff --git a/CUETools.Codecs.FLAKE/FlakeWriter.cs b/CUETools.Codecs.FLAKE/FlakeWriter.cs
index 7d32bb8..8753e62 100644
--- a/CUETools.Codecs.FLAKE/FlakeWriter.cs
+++ b/CUETools.Codecs.FLAKE/FlakeWriter.cs
@@ -34,9 +34,21 @@ using CUETools.Codecs;
namespace CUETools.Codecs.FLAKE
{
- public class FlakeWriterSettings
+ public class FlakeWriterSettings: AudioEncoderSettings
{
- public FlakeWriterSettings() { DoVerify = false; DoMD5 = true; }
+ public FlakeWriterSettings()
+ : base("", "7")
+ {
+ DoVerify = false;
+ DoMD5 = true;
+ AllowNonSubset = false;
+ }
+
+ public override string GetSupportedModes()
+ {
+ return this.AllowNonSubset ? "0 1 2 3 4 5 6 7 8 9 10 11" : "0 1 2 3 4 5 6 7 8";
+ }
+
[DefaultValue(false)]
[DisplayName("Verify")]
[SRDescription(typeof(Properties.Resources), "DoVerifyDescription")]
@@ -46,9 +58,14 @@ namespace CUETools.Codecs.FLAKE
[DisplayName("MD5")]
[SRDescription(typeof(Properties.Resources), "DoMD5Description")]
public bool DoMD5 { get; set; }
- }
- [AudioEncoderClass("cuetools", "flac", true, "0 1 2 3 4 5 6 7 8 9 10 11", "7", 4, typeof(FlakeWriterSettings))]
+ [DefaultValue(false)]
+ [DisplayName("Allow Non-subset")]
+ [SRDescription(typeof(Properties.Resources), "AllowNonSubsetDescription")]
+ public bool AllowNonSubset { get; set; }
+ }
+
+ [AudioEncoderClass("cuetools", "flac", true, 4, typeof(FlakeWriterSettings))]
//[AudioEncoderClass("libFlake nonsub", "flac", true, "9 10 11", "9", 3, typeof(FlakeWriterSettings))]
public class FlakeWriter : IAudioDest
{
@@ -103,7 +120,6 @@ namespace CUETools.Codecs.FLAKE
double[] windowScale;
int samplesInBuffer = 0;
- int _compressionLevel = 7;
int _blocksize = 0;
int _totalSize = 0;
int _windowsize = 0, _windowcount = 0;
@@ -141,7 +157,7 @@ namespace CUETools.Codecs.FLAKE
windowBuffer = new float[Flake.MAX_BLOCKSIZE * 2 * lpc.MAX_LPC_WINDOWS];
windowScale = new double[lpc.MAX_LPC_WINDOWS];
- eparams.flake_set_defaults(_compressionLevel);
+ eparams.flake_set_defaults(7);
eparams.padding_size = 8192;
crc8 = new Crc8();
@@ -161,24 +177,9 @@ namespace CUETools.Codecs.FLAKE
}
}
- public int CompressionLevel
- {
- get
- {
- return _compressionLevel;
- }
- set
- {
- if (value < 0 || value > 11)
- throw new Exception("unsupported compression level");
- _compressionLevel = value;
- eparams.flake_set_defaults(_compressionLevel);
- }
- }
-
FlakeWriterSettings _settings = new FlakeWriterSettings();
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
@@ -188,7 +189,11 @@ namespace CUETools.Codecs.FLAKE
{
if (value as FlakeWriterSettings == null)
throw new Exception("Unsupported options " + value);
- _settings = value as FlakeWriterSettings;
+ _settings = value as FlakeWriterSettings;
+ var _compressionLevel = _settings.EncoderModeIndex;
+ if (_compressionLevel < 0 || _compressionLevel > 11)
+ throw new Exception("unsupported compression level");
+ eparams.flake_set_defaults(_compressionLevel);
}
}
diff --git a/CUETools.Codecs.FLAKE/Properties/Resources.Designer.cs b/CUETools.Codecs.FLAKE/Properties/Resources.Designer.cs
index 2341cf7..4e1afb2 100644
--- a/CUETools.Codecs.FLAKE/Properties/Resources.Designer.cs
+++ b/CUETools.Codecs.FLAKE/Properties/Resources.Designer.cs
@@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
-// Runtime Version:4.0.30319.239
+// Runtime Version:4.0.30319.18033
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -60,6 +60,15 @@ namespace CUETools.Codecs.FLAKE.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Allow non-subset modes, which allow for greater compression, but are less compatible.
+ ///
+ internal static string AllowNonSubsetDescription {
+ get {
+ return ResourceManager.GetString("AllowNonSubsetDescription", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Calculate MD5 hash for audio stream.
///
diff --git a/CUETools.Codecs.FLAKE/Properties/Resources.resx b/CUETools.Codecs.FLAKE/Properties/Resources.resx
index 55865cf..c7b522d 100644
--- a/CUETools.Codecs.FLAKE/Properties/Resources.resx
+++ b/CUETools.Codecs.FLAKE/Properties/Resources.resx
@@ -117,6 +117,9 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ Allow non-subset modes, which allow for greater compression, but are less compatible
+
Calculate MD5 hash for audio stream
diff --git a/CUETools.Codecs.HDCD/HDCDDotNet.cs b/CUETools.Codecs.HDCD/HDCDDotNet.cs
index aeaed15..86bf72d 100644
--- a/CUETools.Codecs.HDCD/HDCDDotNet.cs
+++ b/CUETools.Codecs.HDCD/HDCDDotNet.cs
@@ -104,13 +104,7 @@ namespace HDCDDotNet
set { throw new Exception("unsupported"); }
}
- public object Settings
- {
- get { throw new Exception("unsupported"); }
- set { throw new Exception("unsupported"); }
- }
-
- public int CompressionLevel
+ public AudioEncoderSettings Settings
{
get { throw new Exception("unsupported"); }
set { throw new Exception("unsupported"); }
diff --git a/CUETools.Codecs.Icecast/IcecastWriter.cs b/CUETools.Codecs.Icecast/IcecastWriter.cs
index e3abb9f..d01ce9e 100644
--- a/CUETools.Codecs.Icecast/IcecastWriter.cs
+++ b/CUETools.Codecs.Icecast/IcecastWriter.cs
@@ -210,21 +210,15 @@ namespace CUETools.Codecs.Icecast
set { ; }
}
- public int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.Codecs.LAME/LAMEEncoder.cs b/CUETools.Codecs.LAME/LAMEEncoder.cs
index 2791ca2..e63e1e0 100644
--- a/CUETools.Codecs.LAME/LAMEEncoder.cs
+++ b/CUETools.Codecs.LAME/LAMEEncoder.cs
@@ -22,28 +22,15 @@ namespace CUETools.Codecs.LAME
private long bytesWritten = 0;
private bool inited = false;
- public virtual int CompressionLevel
+ public virtual AudioEncoderSettings Settings
{
get
{
- return 0;
+ return new AudioEncoderSettings();
}
set
{
- if (value != 0)
- throw new Exception("unsupported compression level");
- }
- }
-
- public virtual object Settings
- {
- get
- {
- return null;
- }
- set
- {
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.Codecs.LAME/LAMEEncoderCBR.cs b/CUETools.Codecs.LAME/LAMEEncoderCBR.cs
index 9dedaef..d047ca8 100644
--- a/CUETools.Codecs.LAME/LAMEEncoderCBR.cs
+++ b/CUETools.Codecs.LAME/LAMEEncoderCBR.cs
@@ -4,15 +4,12 @@ using CUETools.Codecs.LAME.Interop;
namespace CUETools.Codecs.LAME
{
- //[AudioEncoderClass("lame CBR", "mp3", false, "96 128 192 256 320", "256", 2, typeof(LAMEEncoderCBRSettings))]
+ //[AudioEncoderClass("lame CBR", "mp3", false, 2, typeof(LAMEEncoderCBRSettings))]
public class LAMEEncoderCBR : LAMEEncoder
{
- private static readonly uint[] bps_table = new uint[] { 96, 128, 192, 256, 320 };
-
- private uint bps;
private LAMEEncoderCBRSettings _settings = new LAMEEncoderCBRSettings();
- public override object Settings
+ public override AudioEncoderSettings Settings
{
get
{
@@ -26,27 +23,6 @@ namespace CUETools.Codecs.LAME
}
}
- public override int CompressionLevel
- {
- get
- {
- for (int i = 0; i < bps_table.Length; i++)
- {
- if (bps == bps_table[i])
- {
- return i;
- }
- }
- return -1;
- }
- set
- {
- if (value < 0 || value > bps_table.Length)
- throw new Exception("unsupported compression level");
- bps = bps_table[value];
- }
- }
-
public LAMEEncoderCBR(string path, Stream IO, AudioPCMConfig pcm)
: base(path, IO, pcm)
{
@@ -59,7 +35,7 @@ namespace CUETools.Codecs.LAME
protected override BE_CONFIG MakeConfig()
{
- BE_CONFIG Mp3Config = new BE_CONFIG(PCM, _settings.CustomBitrate > 0 ? (uint)_settings.CustomBitrate : bps, 5);
+ BE_CONFIG Mp3Config = new BE_CONFIG(PCM, _settings.CustomBitrate > 0 ? (uint)_settings.CustomBitrate : LAMEEncoderCBRSettings.bps_table[_settings.EncoderModeIndex], 5);
Mp3Config.format.lhv1.bWriteVBRHeader = 1;
Mp3Config.format.lhv1.nMode = _settings.StereoMode;
//Mp3Config.format.lhv1.nVbrMethod = VBRMETHOD.VBR_METHOD_NONE; // --cbr
diff --git a/CUETools.Codecs.LAME/LAMEEncoderCBRSettings.cs b/CUETools.Codecs.LAME/LAMEEncoderCBRSettings.cs
index 199d24b..4d77830 100644
--- a/CUETools.Codecs.LAME/LAMEEncoderCBRSettings.cs
+++ b/CUETools.Codecs.LAME/LAMEEncoderCBRSettings.cs
@@ -3,8 +3,10 @@ using CUETools.Codecs.LAME.Interop;
namespace CUETools.Codecs.LAME
{
- public class LAMEEncoderCBRSettings
+ public class LAMEEncoderCBRSettings : AudioEncoderSettings
{
+ public static readonly uint[] bps_table = new uint[] { 96, 128, 192, 256, 320 };
+
[DefaultValue(0)]
public int CustomBitrate { get; set; }
@@ -12,12 +14,8 @@ namespace CUETools.Codecs.LAME
public MpegMode StereoMode { get; set; }
public LAMEEncoderCBRSettings()
+ : base("96 128 192 256 320", "256")
{
- // Iterate through each property and call ResetValue()
- foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
- {
- property.ResetValue(this);
- }
}
}
}
diff --git a/CUETools.Codecs.LAME/LAMEEncoderVBR.cs b/CUETools.Codecs.LAME/LAMEEncoderVBR.cs
index 0732ef2..731848b 100644
--- a/CUETools.Codecs.LAME/LAMEEncoderVBR.cs
+++ b/CUETools.Codecs.LAME/LAMEEncoderVBR.cs
@@ -4,27 +4,12 @@ using CUETools.Codecs.LAME.Interop;
namespace CUETools.Codecs.LAME
{
- //[AudioEncoderClass("lame VBR", "mp3", false, "V9 V8 V7 V6 V5 V4 V3 V2 V1 V0", "V2", 2, typeof(LAMEEncoderVBRSettings))]
+ //[AudioEncoderClass("lame VBR", "mp3", false, 2, typeof(LAMEEncoderVBRSettings))]
public class LAMEEncoderVBR : LAMEEncoder
{
- private int quality = 0;
private LAMEEncoderVBRSettings _settings = new LAMEEncoderVBRSettings();
- public override int CompressionLevel
- {
- get
- {
- return 9 - quality;
- }
- set
- {
- if (value < 0 || value > 9)
- throw new Exception("unsupported compression level");
- quality = 9 - value;
- }
- }
-
- public override object Settings
+ public override AudioEncoderSettings Settings
{
get
{
@@ -54,7 +39,7 @@ namespace CUETools.Codecs.LAME
Mp3Config.format.lhv1.bWriteVBRHeader = 1;
Mp3Config.format.lhv1.nMode = MpegMode.JOINT_STEREO;
Mp3Config.format.lhv1.bEnableVBR = 1;
- Mp3Config.format.lhv1.nVBRQuality = quality;
+ Mp3Config.format.lhv1.nVBRQuality = 9 - _settings.EncoderModeIndex;
Mp3Config.format.lhv1.nVbrMethod = VBRMETHOD.VBR_METHOD_NEW; // --vbr-new
return Mp3Config;
}
diff --git a/CUETools.Codecs.LAME/LAMEEncoderVBRSettings.cs b/CUETools.Codecs.LAME/LAMEEncoderVBRSettings.cs
index e77dfc0..01b7749 100644
--- a/CUETools.Codecs.LAME/LAMEEncoderVBRSettings.cs
+++ b/CUETools.Codecs.LAME/LAMEEncoderVBRSettings.cs
@@ -2,17 +2,14 @@
namespace CUETools.Codecs.LAME
{
- public class LAMEEncoderVBRSettings
+ public class LAMEEncoderVBRSettings : AudioEncoderSettings
{
[DefaultValue(LAMEEncoderVBRProcessingQuality.Normal)]
public LAMEEncoderVBRProcessingQuality Quality { get; set; }
public LAMEEncoderVBRSettings()
+ : base("V9 V8 V7 V6 V5 V4 V3 V2 V1 V0", "V2")
{
- // Iterate through each property and call ResetValue()
- foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this)) {
- property.ResetValue(this);
- }
}
}
}
diff --git a/CUETools.Codecs.LAME/LameWriter.cs b/CUETools.Codecs.LAME/LameWriter.cs
index aa4af3b..dae2433 100644
--- a/CUETools.Codecs.LAME/LameWriter.cs
+++ b/CUETools.Codecs.LAME/LameWriter.cs
@@ -61,12 +61,6 @@ namespace CUETools.Codecs.LAME
set { }
}
- public virtual int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
public long FinalSampleCount
{
set
@@ -94,11 +88,11 @@ namespace CUETools.Codecs.LAME
get { return this.outputPath; }
}
- public virtual object Settings
+ public virtual AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
diff --git a/CUETools.Codecs.LAME/LameWriterCBR.cs b/CUETools.Codecs.LAME/LameWriterCBR.cs
index 8dd3038..4812992 100644
--- a/CUETools.Codecs.LAME/LameWriterCBR.cs
+++ b/CUETools.Codecs.LAME/LameWriterCBR.cs
@@ -3,12 +3,9 @@ using System.IO;
namespace CUETools.Codecs.LAME
{
- [AudioEncoderClass("CBR (libmp3lame)", "mp3", false, "96 128 192 256 320", "256", 1, typeof(LameWriterCBRSettings))]
+ [AudioEncoderClass("CBR (libmp3lame)", "mp3", false, 1, typeof(LameWriterCBRSettings))]
public class LameWriterCBR : LameWriter
{
- private static readonly int[] bps_table = new int[] { 96, 128, 192, 256, 320 };
- private int bps;
-
public LameWriterCBR(string path, Stream IO, AudioPCMConfig pcm)
: base(IO, pcm)
{
@@ -19,30 +16,9 @@ namespace CUETools.Codecs.LAME
{
}
- public override int CompressionLevel
- {
- get
- {
- for (int i = 0; i < bps_table.Length; i++)
- {
- if (bps == bps_table[i])
- {
- return i;
- }
- }
- return -1;
- }
- set
- {
- if (value < 0 || value > bps_table.Length)
- throw new Exception("unsupported compression level");
- bps = bps_table[value];
- }
- }
-
LameWriterCBRSettings _settings = new LameWriterCBRSettings();
- public override object Settings
+ public override AudioEncoderSettings Settings
{
get
{
@@ -60,7 +36,7 @@ namespace CUETools.Codecs.LAME
{
get
{
- return LameWriterConfig.CreateCbr(this.bps, this._settings.Quality);
+ return LameWriterConfig.CreateCbr(LameWriterCBRSettings.bps_table[this._settings.EncoderModeIndex], this._settings.Quality);
}
}
}
diff --git a/CUETools.Codecs.LAME/LameWriterCBRSettings.cs b/CUETools.Codecs.LAME/LameWriterCBRSettings.cs
index c8a4789..3704be4 100644
--- a/CUETools.Codecs.LAME/LameWriterCBRSettings.cs
+++ b/CUETools.Codecs.LAME/LameWriterCBRSettings.cs
@@ -5,19 +5,16 @@ using System.Text;
namespace CUETools.Codecs.LAME
{
- public class LameWriterCBRSettings
+ public class LameWriterCBRSettings : AudioEncoderSettings
{
+ public static readonly int[] bps_table = new int[] { 96, 128, 192, 256, 320 };
+
[DefaultValue(LameQuality.High)]
public LameQuality Quality { get; set; }
public LameWriterCBRSettings()
+ : base("96 128 192 256 320", "256")
{
- // Iterate through each property and call ResetValue()
- foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
- {
- property.ResetValue(this);
- }
- this.Quality = LameQuality.High;
}
}
}
diff --git a/CUETools.Codecs.LAME/LameWriterVBR.cs b/CUETools.Codecs.LAME/LameWriterVBR.cs
index c97977e..dfb6ae7 100644
--- a/CUETools.Codecs.LAME/LameWriterVBR.cs
+++ b/CUETools.Codecs.LAME/LameWriterVBR.cs
@@ -3,11 +3,9 @@ using System.IO;
namespace CUETools.Codecs.LAME
{
- [AudioEncoderClass("VBR (libmp3lame)", "mp3", false, "V9 V8 V7 V6 V5 V4 V3 V2 V1 V0", "V2", 2, typeof(LameWriterVBRSettings))]
+ [AudioEncoderClass("VBR (libmp3lame)", "mp3", false, 2, typeof(LameWriterVBRSettings))]
public class LameWriterVBR : LameWriter
{
- private int quality = 0;
-
public LameWriterVBR(string path, Stream IO, AudioPCMConfig pcm)
: base(IO, pcm)
{
@@ -18,23 +16,9 @@ namespace CUETools.Codecs.LAME
{
}
- public override int CompressionLevel
- {
- get
- {
- return 9 - quality;
- }
- set
- {
- if (value < 0 || value > 9)
- throw new Exception("unsupported compression level");
- quality = 9 - value;
- }
- }
-
LameWriterVBRSettings _settings = new LameWriterVBRSettings();
- public override object Settings
+ public override AudioEncoderSettings Settings
{
get
{
@@ -52,7 +36,7 @@ namespace CUETools.Codecs.LAME
{
get
{
- return LameWriterConfig.CreateVbr(this.quality, this._settings.Quality);
+ return LameWriterConfig.CreateVbr(9 - this._settings.EncoderModeIndex, this._settings.Quality);
}
}
}
diff --git a/CUETools.Codecs.LAME/LameWriterVBRSettings.cs b/CUETools.Codecs.LAME/LameWriterVBRSettings.cs
index 37e3d0c..00ef9ec 100644
--- a/CUETools.Codecs.LAME/LameWriterVBRSettings.cs
+++ b/CUETools.Codecs.LAME/LameWriterVBRSettings.cs
@@ -5,18 +5,14 @@ using System.Text;
namespace CUETools.Codecs.LAME
{
- public class LameWriterVBRSettings
+ public class LameWriterVBRSettings: AudioEncoderSettings
{
[DefaultValue(LameQuality.High)]
public LameQuality Quality { get; set; }
public LameWriterVBRSettings()
+ : base("V9 V8 V7 V6 V5 V4 V3 V2 V1 V0", "V2")
{
- // Iterate through each property and call ResetValue()
- foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this)) {
- property.ResetValue(this);
- }
- this.Quality = LameQuality.High;
}
}
}
diff --git a/CUETools.Codecs.LossyWAV/LossyWAVWriter.cs b/CUETools.Codecs.LossyWAV/LossyWAVWriter.cs
index 8d42874..e4a23b8 100644
--- a/CUETools.Codecs.LossyWAV/LossyWAVWriter.cs
+++ b/CUETools.Codecs.LossyWAV/LossyWAVWriter.cs
@@ -76,21 +76,15 @@ namespace CUETools.Codecs.LossyWAV
set { }
}
- public int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.Codecs.TTA/CUETools.Codecs.TTA.cpp b/CUETools.Codecs.TTA/CUETools.Codecs.TTA.cpp
index 08eafe7..61929b6 100644
--- a/CUETools.Codecs.TTA/CUETools.Codecs.TTA.cpp
+++ b/CUETools.Codecs.TTA/CUETools.Codecs.TTA.cpp
@@ -205,7 +205,7 @@ namespace TTA {
}
};
- [AudioEncoderClass("ttalib", "tta", true, "", "", 1, Object::typeid)]
+ [AudioEncoderClass("ttalib", "tta", true, 1, AudioEncoderSettings::typeid)]
public ref class TTAWriter : public IAudioDest
{
public:
@@ -221,7 +221,6 @@ namespace TTA {
_path = path;
_finalSampleCount = 0;
_samplesWritten = 0;
- _compressionLevel = 5;
_blockSize = 0;
}
@@ -316,33 +315,22 @@ namespace TTA {
_samplesWritten += sampleBuffer->Length;
}
- virtual property Int32 CompressionLevel {
- Int32 get() {
- return _compressionLevel;
- }
- void set(Int32 value) {
- if (value > 0)
- throw gcnew Exception("Invalid compression level.");
- _compressionLevel = value;
- }
- }
-
virtual property __int64 Padding
{
void set(__int64 value) {
}
}
- virtual property Object^ Settings
+ virtual property AudioEncoderSettings^ Settings
{
- Object^ get()
+ AudioEncoderSettings^ get()
{
- return nullptr;
+ return gcnew AudioEncoderSettings();
}
- void set(Object^ value)
+ void set(AudioEncoderSettings^ value)
{
- if (value != nullptr && value->GetType() != Object::typeid)
+ if (value != nullptr && value->GetType() != AudioEncoderSettings::typeid)
throw gcnew Exception(String::Format("Unsupported options: {0}", value));
}
}
@@ -355,87 +343,12 @@ namespace TTA {
String^ _path;
Int64 _finalSampleCount, _samplesWritten, _blockSize;
AudioPCMConfig^ _pcm;
- Int32 _compressionLevel;
void Initialize()
{
if (!_finalSampleCount)
throw gcnew Exception("FinalSampleCount not set.");
- //FLAC__StreamMetadata *padding, *seektable, *vorbiscomment;
-
- //_metadataList = new FLAC__StreamMetadata*[8];
- //_metadataCount = 0;
-
- //if (_finalSampleCount != 0) {
- // seektable = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE);
- // FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(
- // seektable, _sampleRate * 10, _finalSampleCount);
- // FLAC__metadata_object_seektable_template_sort(seektable, true);
- // _metadataList[_metadataCount++] = seektable;
- //}
-
- //vorbiscomment = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT);
-
- //for (int tagno = 0; tagno < _tags->Count; tagno++)
- //{
- // String ^ tag_name = _tags->GetKey(tagno);
- // int tag_len = tag_name->Length;
- // char * tag = new char [tag_len + 1];
- // IntPtr nameChars = Marshal::StringToHGlobalAnsi(tag_name);
- // memcpy (tag, (const char*)nameChars.ToPointer(), tag_len);
- // Marshal::FreeHGlobal(nameChars);
- // tag[tag_len] = 0;
-
- // array^ tag_values = _tags->GetValues(tagno);
- // for (int valno = 0; valno < tag_values->Length; valno++)
- // {
- // UTF8Encoding^ enc = gcnew UTF8Encoding();
- // array^ value_array = enc->GetBytes (tag_values[valno]);
- // int value_len = value_array->Length;
- // char * value = new char [value_len + 1];
- // Marshal::Copy (value_array, 0, (IntPtr) value, value_len);
- // value[value_len] = 0;
-
- // FLAC__StreamMetadata_VorbisComment_Entry entry;
- // /* create and entry and append it */
- // if(!FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(&entry, tag, value)) {
- // throw gcnew Exception("Unable to add tags, must be valid utf8.");
- // }
- // if(!FLAC__metadata_object_vorbiscomment_append_comment(vorbiscomment, entry, /*copy=*/false)) {
- // throw gcnew Exception("Unable to add tags.");
- // }
- // delete [] value;
- // }
- // delete [] tag;
- //}
- //_metadataList[_metadataCount++] = vorbiscomment;
-
- //if (_paddingLength != 0) {
- // padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
- // padding->length = _paddingLength;
- // _metadataList[_metadataCount++] = padding;
- //}
-
- //FLAC__stream_encoder_set_metadata(_encoder, _metadataList, _metadataCount);
-
- //FLAC__stream_encoder_set_verify(_encoder, _verify);
-
- //if (_finalSampleCount != 0) {
- // FLAC__stream_encoder_set_total_samples_estimate(_encoder, _finalSampleCount);
- //}
-
- //FLAC__stream_encoder_set_compression_level(_encoder, _compressionLevel);
-
- //if (_blockSize > 0)
- // FLAC__stream_encoder_set_blocksize(_encoder, (unsigned)_blockSize);
-
- //if (FLAC__stream_encoder_init_FILE(_encoder, hFile, NULL, NULL) !=
- // FLAC__STREAM_ENCODER_INIT_STATUS_OK)
- //{
- // throw gcnew Exception("Unable to initialize the encoder.");
- //}
-
_IO = gcnew FileStream (_path, FileMode::Create, FileAccess::Write, FileShare::Read);
try
{
diff --git a/CUETools.Codecs.WMA/WMAWriter.cs b/CUETools.Codecs.WMA/WMAWriter.cs
index 41e359f..1cd495b 100644
--- a/CUETools.Codecs.WMA/WMAWriter.cs
+++ b/CUETools.Codecs.WMA/WMAWriter.cs
@@ -2,19 +2,18 @@
using System.Runtime.InteropServices;
using CUETools.Codecs;
using System.IO;
+using System.Text;
using WindowsMediaLib;
using WindowsMediaLib.Defs;
-using System.Runtime.InteropServices;
namespace CUETools.Codecs.WMA
{
- public class WMAWriterSettings
+ public class WMAWriterSettings : AudioEncoderSettings
{
public WMAWriterSettings() { }
}
-
- [AudioEncoderClass("windows", "wma", true, "", "", 1, typeof(WMAWriterSettings))]
+ [AudioEncoderClass("windows", "wma", true, 1, typeof(WMAWriterSettings))]
public class WMAWriter : IAudioDest
{
IWMProfileManager m_pProfileManager;
@@ -32,12 +31,6 @@ namespace CUETools.Codecs.WMA
set { }
}
- public virtual int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
public long FinalSampleCount
{
set
@@ -61,9 +54,20 @@ namespace CUETools.Codecs.WMA
get { return this.outputPath; }
}
- public virtual object Settings
+ AudioEncoderSettings m_settings = new AudioEncoderSettings();
+
+ public virtual AudioEncoderSettings Settings
{
- get; set;
+ get
+ {
+ return m_settings;
+ }
+ set
+ {
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
+ throw new Exception("Unsupported options " + value);
+ m_settings = value;
+ }
}
public WMAWriter(string path, AudioPCMConfig pcm)
@@ -81,6 +85,10 @@ namespace CUETools.Codecs.WMA
bool codecFound = false;
for (int iCodec = 0; iCodec < cCodecs; iCodec++)
{
+ int szCodecName = 0;
+ pCodecInfo3.GetCodecName(MediaType.Audio, iCodec, null, ref szCodecName);
+ var codecName = new StringBuilder(szCodecName);
+ pCodecInfo3.GetCodecName(MediaType.Audio, iCodec, codecName, ref szCodecName);
//if (codec != WMAvoice)
try
{
diff --git a/CUETools.Codecs.WavPack/CUETools.Codecs.WavPack.cpp b/CUETools.Codecs.WavPack/CUETools.Codecs.WavPack.cpp
index 2b14aa7..06a6c51 100644
--- a/CUETools.Codecs.WavPack/CUETools.Codecs.WavPack.cpp
+++ b/CUETools.Codecs.WavPack/CUETools.Codecs.WavPack.cpp
@@ -293,10 +293,11 @@ namespace CUETools { namespace Codecs { namespace WavPack {
}
};
- public ref class WavPackWriterSettings
+ public ref class WavPackWriterSettings : AudioEncoderSettings
{
public:
WavPackWriterSettings()
+ : AudioEncoderSettings("fast normal high high+", "normal")
{
_md5Sum = true;
_extraMode = 0;
@@ -333,7 +334,7 @@ namespace CUETools { namespace Codecs { namespace WavPack {
Int32 _extraMode;
};
- [AudioEncoderClass("libwavpack", "wv", true, "fast normal high high+", "normal", 1, WavPackWriterSettings::typeid)]
+ [AudioEncoderClass("libwavpack", "wv", true, 1, WavPackWriterSettings::typeid)]
public ref class WavPackWriter : IAudioDest
{
public:
@@ -350,7 +351,6 @@ namespace CUETools { namespace Codecs { namespace WavPack {
_path = path;
- _compressionMode = 1;
_blockSize = 0;
IntPtr pathChars = Marshal::StringToHGlobalUni(path);
@@ -452,33 +452,20 @@ namespace CUETools { namespace Codecs { namespace WavPack {
}
}
- virtual property int CompressionLevel
- {
- int get() {
- return _compressionMode;
- }
- void set(int value) {
- if ((value < 0) || (value > 3)) {
- throw gcnew Exception("Invalid compression mode.");
- }
- _compressionMode = value;
- }
- }
-
virtual property __int64 Padding
{
void set(__int64 value) {
}
}
- virtual property Object^ Settings
+ virtual property AudioEncoderSettings^ Settings
{
- Object^ get()
+ AudioEncoderSettings^ get()
{
return _settings;
}
- void set(Object^ value)
+ void set(AudioEncoderSettings^ value)
{
if (value == nullptr || value->GetType() != WavPackWriterSettings::typeid)
throw gcnew Exception(String::Format("Unsupported options: {0}", value));
@@ -500,7 +487,7 @@ namespace CUETools { namespace Codecs { namespace WavPack {
bool _initialized;
WavpackContext *_wpc;
Int32 _finalSampleCount, _samplesWritten;
- Int32 _compressionMode, _blockSize;
+ Int32 _blockSize;
String^ _path;
MD5^ _md5hasher;
array^ _shiftedSampleBuffer;
@@ -521,6 +508,7 @@ namespace CUETools { namespace Codecs { namespace WavPack {
config.num_channels = _pcm->ChannelCount;
config.channel_mask = 5 - _pcm->ChannelCount;
config.sample_rate = _pcm->SampleRate;
+ Int32 _compressionMode = _settings->EncoderModeIndex;
if (_compressionMode == 0) config.flags |= CONFIG_FAST_FLAG;
if (_compressionMode == 2) config.flags |= CONFIG_HIGH_FLAG;
if (_compressionMode == 3) config.flags |= CONFIG_HIGH_FLAG | CONFIG_VERY_HIGH_FLAG;
diff --git a/CUETools.Codecs/AudioEncoderClass.cs b/CUETools.Codecs/AudioEncoderClass.cs
index 9b59b08..32881f5 100644
--- a/CUETools.Codecs/AudioEncoderClass.cs
+++ b/CUETools.Codecs/AudioEncoderClass.cs
@@ -21,7 +21,7 @@ namespace CUETools.Codecs
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public sealed class AudioEncoderClass : Attribute
{
- private string _encoderName, _extension, _supportedModes, _defaultMode;
+ private string _encoderName, _extension;
private bool _lossless;
private int _priority;
private Type _settings;
@@ -36,16 +36,6 @@ namespace CUETools.Codecs
get { return _extension; }
}
- public string SupportedModes
- {
- get { return _supportedModes; }
- }
-
- public string DefaultMode
- {
- get { return _defaultMode; }
- }
-
public bool Lossless
{
get { return _lossless; }
@@ -61,12 +51,10 @@ namespace CUETools.Codecs
get { return _settings; }
}
- public AudioEncoderClass(string encoderName, string extension, bool lossless, string supportedModes, string defaultMode, int priority, Type settings)
+ public AudioEncoderClass(string encoderName, string extension, bool lossless, int priority, Type settings)
{
_encoderName = encoderName;
_extension = extension;
- _supportedModes = supportedModes;
- _defaultMode = defaultMode;
_lossless = lossless;
_priority = priority;
_settings = settings;
diff --git a/CUETools.Codecs/AudioEncoderSettings.cs b/CUETools.Codecs/AudioEncoderSettings.cs
new file mode 100644
index 0000000..57fc3b4
--- /dev/null
+++ b/CUETools.Codecs/AudioEncoderSettings.cs
@@ -0,0 +1,79 @@
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using System.Text;
+
+namespace CUETools.Codecs
+{
+ public class AudioEncoderSettings
+ {
+ public AudioEncoderSettings()
+ {
+ // Iterate through each property and call ResetValue()
+ foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
+ property.ResetValue(this);
+ this.supported_modes = "";
+ this.EncoderMode = "";
+ }
+
+ public AudioEncoderSettings(string _supported_modes, string _default_mode)
+ {
+ // Iterate through each property and call ResetValue()
+ foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
+ property.ResetValue(this);
+ this.supported_modes = _supported_modes;
+ this.EncoderMode = _default_mode;
+ }
+
+ private string supported_modes;
+
+ public virtual string GetSupportedModes()
+ {
+ return this.supported_modes;
+ }
+
+ [Browsable(false)]
+ public string EncoderMode
+ {
+ get;
+ set;
+ }
+
+ [XmlIgnore]
+ [Browsable(false)]
+ public string[] SupportedModes
+ {
+ get
+ {
+ return this.GetSupportedModes().Split(' ');
+ }
+ }
+
+ [XmlIgnore]
+ [Browsable(false)]
+ public int EncoderModeIndex
+ {
+ get
+ {
+ string[] modes = this.SupportedModes;
+ if (modes == null || modes.Length < 1)
+ return -1;
+ for (int i = 0; i < modes.Length; i++)
+ if (modes[i] == this.EncoderMode)
+ return i;
+ return -1;
+ }
+
+ set
+ {
+ string[] modes = this.SupportedModes;
+ if (modes.Length == 0 && value < 0)
+ return;
+ if (value < 0 || value >= modes.Length)
+ throw new InvalidOperationException();
+ this.EncoderMode = modes[value];
+ }
+ }
+ }
+}
diff --git a/CUETools.Codecs/CUETools.Codecs.csproj b/CUETools.Codecs/CUETools.Codecs.csproj
index 07feb74..22f4aab 100644
--- a/CUETools.Codecs/CUETools.Codecs.csproj
+++ b/CUETools.Codecs/CUETools.Codecs.csproj
@@ -64,6 +64,7 @@
+
diff --git a/CUETools.Codecs/DummyWriter.cs b/CUETools.Codecs/DummyWriter.cs
index 392d928..5bcefd6 100644
--- a/CUETools.Codecs/DummyWriter.cs
+++ b/CUETools.Codecs/DummyWriter.cs
@@ -24,21 +24,15 @@ namespace CUETools.Codecs
set { }
}
- public int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.Codecs/IAudioDest.cs b/CUETools.Codecs/IAudioDest.cs
index 24af0e3..14fa109 100644
--- a/CUETools.Codecs/IAudioDest.cs
+++ b/CUETools.Codecs/IAudioDest.cs
@@ -5,8 +5,7 @@
AudioPCMConfig PCM { get; }
string Path { get; }
- int CompressionLevel { get; set; }
- object Settings { get; set; }
+ AudioEncoderSettings Settings { get; set; }
long FinalSampleCount { set; }
long BlockSize { set; }
long Padding { set; }
diff --git a/CUETools.Codecs/UserDefinedWriter.cs b/CUETools.Codecs/UserDefinedWriter.cs
index 5f968e4..edd7483 100644
--- a/CUETools.Codecs/UserDefinedWriter.cs
+++ b/CUETools.Codecs/UserDefinedWriter.cs
@@ -33,21 +33,16 @@ namespace CUETools.Codecs
set { }
}
- public int CompressionLevel
- {
- get { return 0; }
- set { } // !!!! Must not start the process in constructor, so that we can set CompressionLevel!
- }
-
- public object Settings
+ // !!!! Must not start the process in constructor, so that we can set CompressionLevel via Settings!
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.Codecs/WAVWriter.cs b/CUETools.Codecs/WAVWriter.cs
index fd2be7e..43151e3 100644
--- a/CUETools.Codecs/WAVWriter.cs
+++ b/CUETools.Codecs/WAVWriter.cs
@@ -4,7 +4,7 @@ using System.IO;
namespace CUETools.Codecs
{
- [AudioEncoderClass("cuetools", "wav", true, "", "", 10, typeof(object))]
+ [AudioEncoderClass("cuetools", "wav", true, 10, typeof(AudioEncoderSettings))]
public class WAVWriter : IAudioDest
{
private Stream _IO;
@@ -36,21 +36,15 @@ namespace CUETools.Codecs
set { }
}
- public int CompressionLevel
- {
- get { return 0; }
- set { }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.DSP.Mixer/MixingWriter.cs b/CUETools.DSP.Mixer/MixingWriter.cs
index 5a352cc..2cda5bf 100644
--- a/CUETools.DSP.Mixer/MixingWriter.cs
+++ b/CUETools.DSP.Mixer/MixingWriter.cs
@@ -27,21 +27,15 @@ namespace CUETools.DSP.Mixer
set { throw new NotSupportedException(); }
}
- public int CompressionLevel
- {
- get { return 0; }
- set { throw new NotSupportedException(); }
- }
-
- public object Settings
+ public AudioEncoderSettings Settings
{
get
{
- return null;
+ return new AudioEncoderSettings();
}
set
{
- if (value != null && value.GetType() != typeof(object))
+ if (value != null && value.GetType() != typeof(AudioEncoderSettings))
throw new Exception("Unsupported options " + value);
}
}
diff --git a/CUETools.FLACCL.cmd/Program.cs b/CUETools.FLACCL.cmd/Program.cs
index 7d5fdb5..a3af729 100644
--- a/CUETools.FLACCL.cmd/Program.cs
+++ b/CUETools.FLACCL.cmd/Program.cs
@@ -187,12 +187,15 @@ namespace CUETools.FLACCL.cmd
blocksize = intarg;
else if ((args[arg] == "-p" || args[arg] == "--padding") && ++arg < args.Length && int.TryParse(args[arg], out intarg))
padding = intarg;
- else if (args[arg] != "-" && args[arg][0] == '-' && int.TryParse(args[arg].Substring(1), out level))
- ok = level >= 0 && level <= 11;
- else if ((args[arg][0] != '-' || args[arg] == "-") && input_file == null)
- input_file = args[arg];
- else
- ok = false;
+ else if (args[arg] != "-" && args[arg][0] == '-' && int.TryParse(args[arg].Substring(1), out level))
+ {
+ ok = level >= 0 && level <= 11;
+ settings.EncoderModeIndex = level;
+ }
+ else if ((args[arg][0] != '-' || args[arg] == "-") && input_file == null)
+ input_file = args[arg];
+ else
+ ok = false;
if (!ok)
break;
}
@@ -258,8 +261,6 @@ namespace CUETools.FLACCL.cmd
if (device_type != null)
settings.DeviceType = (OpenCLDeviceType)(Enum.Parse(typeof(OpenCLDeviceType), device_type, true));
encoder.Settings = settings;
- if (level >= 0)
- encoder.CompressionLevel = level;
if (stereo_method != null)
encoder.StereoMethod = Flake.LookupStereoMethod(stereo_method);
if (window_function != null)
diff --git a/CUETools.Flake/Program.cs b/CUETools.Flake/Program.cs
index 09d39f5..950592d 100644
--- a/CUETools.Flake/Program.cs
+++ b/CUETools.Flake/Program.cs
@@ -326,11 +326,16 @@ namespace CUETools.FlakeExe
flake.FinalSampleCount = audioSource.Length - skip_a - skip_b;
IAudioDest audioDest = flake;
AudioBuffer buff = new AudioBuffer(audioSource, 0x10000);
+ var settings = new FlakeWriterSettings();
try
{
if (level >= 0)
- flake.CompressionLevel = level;
+ settings.EncoderModeIndex = level;
+ settings.DoVerify = do_verify;
+ settings.DoMD5 = do_md5;
+
+ flake.Settings = settings;
if (prediction_type != null)
flake.PredictionType = Flake.LookupPredictionType(prediction_type);
if (stereo_method != null)
@@ -368,8 +373,6 @@ namespace CUETools.FlakeExe
if (magic >= 0)
flake.DevelopmentMode = magic;
flake.DoSeekTable = do_seektable;
- (flake.Settings as FlakeWriterSettings).DoVerify = do_verify;
- (flake.Settings as FlakeWriterSettings).DoMD5 = do_md5;
}
catch (Exception ex)
{
diff --git a/CUETools.Processor/AudioReadWrite.cs b/CUETools.Processor/AudioReadWrite.cs
index 833859c..63820d8 100644
--- a/CUETools.Processor/AudioReadWrite.cs
+++ b/CUETools.Processor/AudioReadWrite.cs
@@ -87,7 +87,7 @@ namespace CUETools.Processor
if (encoder == null)
throw new Exception("Unsupported audio type: " + path);
if (encoder.path != null)
- dest = new UserDefinedWriter(path, null, pcm, encoder.path, encoder.parameters, encoder.default_mode, padding);
+ dest = new UserDefinedWriter(path, null, pcm, encoder.path, encoder.parameters, encoder.EncoderMode, padding);
else if (encoder.type != null)
{
object o = Activator.CreateInstance(encoder.type, path, pcm);
@@ -97,10 +97,9 @@ namespace CUETools.Processor
}
else
throw new Exception("Unsupported audio type: " + path);
- dest.CompressionLevel = encoder.DefaultModeIndex;
+ dest.Settings = encoder.settings;
dest.FinalSampleCount = finalSampleCount;
dest.Padding = padding;
- dest.Settings = encoder.settings;
return dest;
}
diff --git a/CUETools.Processor/CUEConfig.cs b/CUETools.Processor/CUEConfig.cs
index 3865991..18c6543 100644
--- a/CUETools.Processor/CUEConfig.cs
+++ b/CUETools.Processor/CUEConfig.cs
@@ -325,13 +325,13 @@ return processor.Go();
foreach (CUEToolsUDC encoder in encoders)
{
sw.Save(string.Format("ExternalEncoder{0}Name", nEncoders), encoder.name);
- sw.Save(string.Format("ExternalEncoder{0}Modes", nEncoders), encoder.supported_modes);
- sw.Save(string.Format("ExternalEncoder{0}Mode", nEncoders), encoder.default_mode);
+ sw.Save(string.Format("ExternalEncoder{0}Extension", nEncoders), encoder.extension);
+ sw.Save(string.Format("ExternalEncoder{0}Lossless", nEncoders), encoder.lossless);
if (encoder.path != null)
{
- sw.Save(string.Format("ExternalEncoder{0}Extension", nEncoders), encoder.extension);
+ sw.Save(string.Format("ExternalEncoder{0}Modes", nEncoders), encoder.SupportedModesStr);
+ sw.Save(string.Format("ExternalEncoder{0}Mode", nEncoders), encoder.EncoderMode);
sw.Save(string.Format("ExternalEncoder{0}Path", nEncoders), encoder.path);
- sw.Save(string.Format("ExternalEncoder{0}Lossless", nEncoders), encoder.lossless);
sw.Save(string.Format("ExternalEncoder{0}Parameters", nEncoders), encoder.parameters);
}
else
@@ -493,6 +493,8 @@ return processor.Go();
encoder.path = path;
encoder.lossless = lossless;
encoder.parameters = parameters;
+ encoder.SupportedModesStr = supported_modes;
+ encoder.EncoderMode = default_mode;
}
else
{
@@ -500,14 +502,12 @@ return processor.Go();
try
{
using (TextReader reader = new StringReader(parameters))
- encoder.settings = encoder.settingsSerializer.Deserialize(reader);
+ encoder.settings = encoder.settingsSerializer.Deserialize(reader) as AudioEncoderSettings;
}
catch
{
}
}
- encoder.supported_modes = supported_modes;
- encoder.default_mode = default_mode;
}
}
diff --git a/CUETools.Processor/CUEToolsUDC.cs b/CUETools.Processor/CUEToolsUDC.cs
index 7d88ed7..babef7d 100644
--- a/CUETools.Processor/CUEToolsUDC.cs
+++ b/CUETools.Processor/CUEToolsUDC.cs
@@ -12,13 +12,14 @@ namespace CUETools.Processor
public string path = "";
public string parameters = "";
public Type type = null;
- public object settings = null;
+ public AudioEncoderSettings settings = null;
public XmlSerializer settingsSerializer = null;
- public string supported_modes = "";
- public string default_mode = "";
public bool lossless = false;
public int priority = 0;
+ private string supported_modes = "";
+ private string default_mode = "";
+
public event PropertyChangedEventHandler PropertyChanged;
public CUEToolsUDC(
@@ -47,18 +48,16 @@ namespace CUETools.Processor
name = enc.EncoderName;
extension = enc.Extension;
lossless = enc.Lossless;
- supported_modes = enc.SupportedModes;
- default_mode = enc.DefaultMode;
priority = enc.Priority;
path = null;
parameters = "";
type = enctype;
settingsSerializer = null;
settings = null;
- if (enc.Settings != null && enc.Settings != typeof(object))
+ if (enc.Settings != null && typeof(AudioEncoderSettings).IsAssignableFrom(enc.Settings))
{
settingsSerializer = new XmlSerializer(enc.Settings);
- settings = Activator.CreateInstance(enc.Settings);
+ settings = Activator.CreateInstance(enc.Settings) as AudioEncoderSettings;
}
}
@@ -67,8 +66,6 @@ namespace CUETools.Processor
name = dec.DecoderName;
extension = dec.Extension;
lossless = true;
- supported_modes = "";
- default_mode = "";
priority = dec.Priority;
path = null;
parameters = null;
@@ -105,26 +102,50 @@ namespace CUETools.Processor
get { return lossless; }
set { lossless = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Lossless")); }
}
+
public string Extension
{
get { return extension; }
set { extension = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Extension")); }
}
+
public string DotExtension
{
get { return "." + extension; }
}
+
public string SupportedModesStr
{
- get { return supported_modes; }
- set { supported_modes = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SupportedModesStr")); }
+ get
+ {
+ return this.settings == null ? this.supported_modes : this.settings.GetSupportedModes();
+ }
+ set
+ {
+ if (this.settings != null) throw new NotSupportedException();
+ supported_modes = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SupportedModesStr"));
+ }
+ }
+
+ public string EncoderMode
+ {
+ get
+ {
+ if (this.settings != null) return this.settings.EncoderMode;
+ else return this.default_mode;
+ }
+ set
+ {
+ if (this.settings != null) this.settings.EncoderMode = value;
+ else this.default_mode = value;
+ }
}
public string[] SupportedModes
{
get
{
- return supported_modes.Split(' ');
+ return this.SupportedModesStr.Split(' ');
}
}
@@ -132,11 +153,11 @@ namespace CUETools.Processor
{
get
{
- string[] modes = supported_modes.Split(' ');
+ string[] modes = this.SupportedModes;
if (modes == null || modes.Length < 2)
return -1;
for (int i = 0; i < modes.Length; i++)
- if (modes[i] == default_mode)
+ if (modes[i] == this.EncoderMode)
return i;
return -1;
}
diff --git a/CUETools/frmCUETools.cs b/CUETools/frmCUETools.cs
index 562539d..18537c9 100644
--- a/CUETools/frmCUETools.cs
+++ b/CUETools/frmCUETools.cs
@@ -2464,7 +2464,7 @@ namespace JDP
{
trackBarEncoderMode.Maximum = modes.Length - 1;
trackBarEncoderMode.Value = encoder.DefaultModeIndex == -1 ? modes.Length - 1 : encoder.DefaultModeIndex;
- labelEncoderMode.Text = encoder.default_mode;
+ labelEncoderMode.Text = encoder.EncoderMode;
labelEncoderMinMode.Text = modes[0];
labelEncoderMaxMode.Text = modes[modes.Length - 1];
trackBarEncoderMode.Visible = true;
@@ -2478,8 +2478,8 @@ namespace JDP
{
CUEToolsUDC encoder = comboBoxEncoder.SelectedItem as CUEToolsUDC;
string[] modes = encoder.SupportedModes;
- encoder.default_mode = modes[trackBarEncoderMode.Value];
- labelEncoderMode.Text = encoder.default_mode;
+ encoder.EncoderMode = modes[trackBarEncoderMode.Value];
+ labelEncoderMode.Text = encoder.EncoderMode;
}
//private void toolStripButton1_Click(object sender, EventArgs e)