From a6941bc51b4bb918d123587825ed3b1485ea4d4a Mon Sep 17 00:00:00 2001 From: chudov Date: Fri, 6 May 2011 20:22:21 +0000 Subject: [PATCH] CTDB: send drivename separately from userAgent CTDB: include OS version in userAgent CTDB: send rip quality LAME: fix VBR options CTDB: optimize chienSearch --- CUERipper/frmCUERipper.cs | 26 +--- CUETools.AccurateRip/CDRepair.cs | 13 +- .../CUETools.CTDB.EACPlugin.csproj | 1 + CUETools.CTDB.EACPlugin/Plugin.cs | 38 ++---- CUETools.CTDB/CUEToolsDB.cs | 36 +++-- .../CUETools.Codecs.LAME.csproj | 1 + CUETools.Codecs.LAME/Encoder.cs | 123 +++++++++++------- CUETools.Codecs.LAME/Lame.cs | 50 ++++--- CUETools.Parity/RsDecode.cs | Bin 19410 -> 22618 bytes CUETools.Parity/RsEncode.cs | Bin 5960 -> 6126 bytes CUETools.Processor/Processor.cs | 17 +-- CUETools/frmCUETools.cs | 2 +- 12 files changed, 167 insertions(+), 140 deletions(-) diff --git a/CUERipper/frmCUERipper.cs b/CUERipper/frmCUERipper.cs index d953744..f95c607 100644 --- a/CUERipper/frmCUERipper.cs +++ b/CUERipper/frmCUERipper.cs @@ -376,24 +376,12 @@ namespace CUERipper try { cueSheet.Go(); - - if ((cueSheet.CTDB.AccResult == HttpStatusCode.NotFound || cueSheet.CTDB.AccResult == HttpStatusCode.OK) - && audioSource.CorrectionQuality > 0 && audioSource.ErrorsCount == 0) - { - DBEntry confirm = null; - foreach (DBEntry entry in cueSheet.CTDB.Entries) - if (entry.toc.TrackOffsets == selectedDriveInfo.drive.TOC.TrackOffsets && !entry.hasErrors) - confirm = entry; - - if (confirm != null) - cueSheet.CTDB.Confirm(confirm); - else - cueSheet.CTDB.Submit( - (int)cueSheet.ArVerify.WorstConfidence() + 1, - cueSheet.Artist, - cueSheet.Title); - } - + cueSheet.CTDB.Submit( + (int)cueSheet.ArVerify.WorstConfidence() + 1, + audioSource.CorrectionQuality == 0 ? 0 : + 100 - (int)(7 * Math.Log(audioSource.ErrorsCount + 1)), // ErrorsCount==1 ~= 95, ErrorsCount==max ~= 5; + cueSheet.Artist, + cueSheet.Title); bool canFix = false; if (cueSheet.CTDB.AccResult == HttpStatusCode.OK && audioSource.ErrorsCount != 0) { @@ -628,7 +616,7 @@ namespace CUERipper cueSheet.Action = CUEAction.Encode; this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " CTDB..."; }); - cueSheet.UseCUEToolsDB(true, "CUERipper " + CUESheet.CUEToolsVersion + ": " + selectedDriveInfo.drive.ARName); + cueSheet.UseCUEToolsDB(true, "CUERipper " + CUESheet.CUEToolsVersion, selectedDriveInfo.drive.ARName); cueSheet.CTDB.UploadHelper.onProgress += new EventHandler(UploadProgress); this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " AccurateRip..."; }); cueSheet.UseAccurateRip(); diff --git a/CUETools.AccurateRip/CDRepair.cs b/CUETools.AccurateRip/CDRepair.cs index 6a20bc6..4af6344 100644 --- a/CUETools.AccurateRip/CDRepair.cs +++ b/CUETools.AccurateRip/CDRepair.cs @@ -308,6 +308,7 @@ namespace CUETools.AccurateRip // find offset fixed (byte* par2ptr = &parity2[pos]) + fixed (ushort* chT = rs.chienTable) { ushort* par2 = (ushort*)par2ptr; int* _sigma = stackalloc int[npar]; @@ -354,7 +355,7 @@ namespace CUETools.AccurateRip err |= synI; } int err_count = err == 0 ? 0 : rs.calcSigmaMBM(_sigma, syn); - if (err_count == allowed_errors && (err_count == 0 || rs.chienSearch(_errpos, stridecount + npar, err_count, _sigma))) + if (err_count == allowed_errors && (err_count == 0 || rs.chienSearch(_errpos, stridecount + npar, err_count, _sigma, chT))) { actualOffset = offset; hasErrors = err_count != 0 || ar.CTDBCRC(-offset) != expectedCRC; @@ -386,7 +387,8 @@ namespace CUETools.AccurateRip fix.errors = new int[stride]; fixed (byte* par = &parity2[pos]) - fixed (ushort* exp = galois.ExpTbl, log = galois.LogTbl) + fixed (ushort* exp = galois.ExpTbl, log = galois.LogTbl, chT = rs.chienTable) + fixed (int* sf = fix.sigma, of = fix.omega, ef = fix.errpos) { int* syn = stackalloc int[npar]; int offset = fix.actualOffset; @@ -437,12 +439,15 @@ namespace CUETools.AccurateRip if (err != 0) { - fixed (int* s = &fix.sigma[part, 0], o = &fix.omega[part, 0], e = &fix.errpos[part, 0]) + int* s = sf + part * fix.sigma.GetLength(1); + int* o = of + part * fix.omega.GetLength(1); + int* e = ef + part * fix.errpos.GetLength(1); + //fixed (int* s = &fix.sigma[part, 0], o = &fix.omega[part, 0], e = &fix.errpos[part, 0]) { fix.errors[part] = rs.calcSigmaMBM(s, syn); fix.hasErrors = true; fix.correctableErrors += fix.errors[part]; - if (fix.errors[part] <= 0 || !rs.chienSearch(e, stridecount + npar, fix.errors[part], s)) + if (fix.errors[part] <= 0 || !rs.chienSearch(e, stridecount + npar, fix.errors[part], s, chT)) fix.canRecover = false; else galois.mulPoly(o, s, syn, npar / 2 + 1, npar, npar); diff --git a/CUETools.CTDB.EACPlugin/CUETools.CTDB.EACPlugin.csproj b/CUETools.CTDB.EACPlugin/CUETools.CTDB.EACPlugin.csproj index d4da4c6..d311785 100644 --- a/CUETools.CTDB.EACPlugin/CUETools.CTDB.EACPlugin.csproj +++ b/CUETools.CTDB.EACPlugin/CUETools.CTDB.EACPlugin.csproj @@ -36,6 +36,7 @@ False .\Interop.HelperFunctionsLib.dll + False diff --git a/CUETools.CTDB.EACPlugin/Plugin.cs b/CUETools.CTDB.EACPlugin/Plugin.cs index d7faba0..d904088 100644 --- a/CUETools.CTDB.EACPlugin/Plugin.cs +++ b/CUETools.CTDB.EACPlugin/Plugin.cs @@ -155,7 +155,7 @@ namespace AudioDataPlugIn #if USEAR ar.ContactAccurateRip(ArId); #endif - ctdb.ContactDB("EAC" + m_data.HostVersion + " CTDB 2.1.1: " + m_drivename); + ctdb.ContactDB("EAC" + m_data.HostVersion + " CTDB 2.1.1", m_drivename); ctdb.Init(true, ar); this.sequence_ok = true; this.m_start_pos = 0; @@ -241,33 +241,20 @@ namespace AudioDataPlugIn return ""; if (this.sequence_ok) { - bool is_accurate = (arTest.Position == 0 && this.is_secure_mode) || arTest.CRC32(0) == ar.CRC32(0); - DBEntry confirm = null; - if (ctdb.AccResult == HttpStatusCode.OK) - ctdb.DoVerify(); - if ((ctdb.AccResult == HttpStatusCode.NotFound || ctdb.AccResult == HttpStatusCode.OK) - && is_accurate) - { - foreach (DBEntry entry in ctdb.Entries) - if (entry.toc.TrackOffsets == TOC.TrackOffsets && !entry.hasErrors) - confirm = entry; - - if (confirm != null) - ctdb.Confirm(confirm); - else - ctdb.Submit( + ctdb.DoVerify(); + ctdb.Submit( #if USEAR - (int)ar.WorstConfidence() + 1, + (int)ar.WorstConfidence() + 1, #else - 1, + 1, #endif - m_data.AlbumArtist, - m_data.AlbumTitle); - } + (arTest.Position == 0 && this.is_secure_mode) || arTest.CRC32(0) == ar.CRC32(0) ? 100 : 0, + m_data.AlbumArtist, + m_data.AlbumTitle); sw.WriteLine("[CTDB TOCID: {0}] {1}{2}.", TOC.TOCID, ctdb.DBStatus ?? "found", - (confirm != null || ctdb.SubStatus == null) ? "" : (", Submit result: " + ctdb.SubStatus)); + (ctdb.SubStatus == null) ? "" : (", Submit result: " + ctdb.SubStatus)); foreach (DBEntry entry in ctdb.Entries) { string confFormat = (ctdb.Total < 10) ? "{0:0}/{1:0}" : @@ -284,14 +271,13 @@ namespace AudioDataPlugIn entry.canRecover ? string.Format("Differs in {0} samples @{1}", entry.repair.CorrectableErrors, entry.repair.AffectedSectors) : (entry.httpStatus == 0 || entry.httpStatus == HttpStatusCode.OK) ? "No match" : entry.httpStatus.ToString()); - sw.WriteLine("[{0:x8}] ({1}) {2}{3}", + sw.WriteLine("[{0:x8}] ({1}) {2}", entry.crc, conf, - status, - (confirm != entry || ctdb.SubStatus == null) ? "" : (", Submit result: " + ctdb.SubStatus)); + status); } bool canFix = false; - if (ctdb.AccResult == HttpStatusCode.OK && !is_accurate) + if (ctdb.AccResult == HttpStatusCode.OK) { foreach (DBEntry entry in ctdb.Entries) if (entry.hasErrors && entry.canRecover) diff --git a/CUETools.CTDB/CUEToolsDB.cs b/CUETools.CTDB/CUEToolsDB.cs index 36d78f1..b00f0d0 100644 --- a/CUETools.CTDB/CUEToolsDB.cs +++ b/CUETools.CTDB/CUEToolsDB.cs @@ -18,6 +18,7 @@ namespace CUETools.CTDB { const string urlbase = "http://db.cuetools.net"; string userAgent; + string driveName; private CDRepairEncode verify; private CDImageLayout toc; @@ -38,9 +39,10 @@ namespace CUETools.CTDB this.uploadHelper = new HttpUploadHelper(); } - public void ContactDB(string userAgent) + public void ContactDB(string userAgent, string driveName) { - this.userAgent = userAgent; + this.driveName = driveName; + this.userAgent = userAgent + " (" + Environment.OSVersion.VersionString + ")" + (driveName != null ? " (" + driveName + ")" : ""); this.total = 0; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase + "/lookup.php?tocid=" + toc.TOCID); @@ -184,17 +186,22 @@ namespace CUETools.CTDB return uuidInfo; } - public string Confirm(DBEntry entry) + public string Submit(int confidence, int quality, string artist, string title) { - return Submit(1, null, null, !entry.hasParity /*&& entry.conf > 100*/, true, entry.id); + if (this.AccResult != HttpStatusCode.NotFound && this.AccResult != HttpStatusCode.OK) + return this.DBStatus; + DBEntry confirm = null; + foreach (DBEntry entry in this.Entries) + if (entry.toc.TrackOffsets == this.toc.TrackOffsets && !entry.hasErrors) + confirm = entry; + if (confirm != null) confidence = 1; + DoSubmit(confidence, quality, artist, title, false, confirm); + if (subResult == "parity needed") + DoSubmit(confidence, quality, artist, title, true, confirm); + return subResult; } - public string Submit(int confidence, string artist, string title) - { - return Submit(confidence, artist, title, confidence > 1, false, null); - } - - public string Submit(int confidence, string artist, string title, bool upload, bool confirm, string confirmid) + protected string DoSubmit(int confidence, int quality, string artist, string title, bool upload, DBEntry confirm) { UploadFile[] files; if (upload) @@ -229,8 +236,8 @@ namespace CUETools.CTDB NameValueCollection form = new NameValueCollection(); if (upload) form.Add("parityfile", "1"); - if (confirm) - form.Add("confirmid", confirmid); + if (confirm != null) + form.Add("confirmid", confirm.id); form.Add("tocid", toc.TOCID); form.Add("crc32", ((int)verify.CRC).ToString()); form.Add("trackcrcs", verify.TrackCRCs); @@ -241,6 +248,9 @@ namespace CUETools.CTDB form.Add("audiotracks", toc.AudioTracks.ToString()); form.Add("trackoffsets", toc.TrackOffsets); form.Add("userid", GetUUID()); + form.Add("quality", quality.ToString()); + if (driveName != null) + form.Add("drivename", driveName); if (artist != null && artist != "") form.Add("artist", artist); if (title != null && title != "") form.Add("title", title); @@ -340,6 +350,8 @@ namespace CUETools.CTDB public void DoVerify() { + if (this.AccResult != HttpStatusCode.OK) + return; foreach (DBEntry entry in entries) { if (entry.toc.Pregap != toc.Pregap || entry.toc.AudioLength != toc.AudioLength || entry.stride != verify.Stride / 2) diff --git a/CUETools.Codecs.LAME/CUETools.Codecs.LAME.csproj b/CUETools.Codecs.LAME/CUETools.Codecs.LAME.csproj index 0b50efa..ce18c10 100644 --- a/CUETools.Codecs.LAME/CUETools.Codecs.LAME.csproj +++ b/CUETools.Codecs.LAME/CUETools.Codecs.LAME.csproj @@ -29,6 +29,7 @@ TRACE prompt 4 + true diff --git a/CUETools.Codecs.LAME/Encoder.cs b/CUETools.Codecs.LAME/Encoder.cs index 1bc42f6..6b07892 100644 --- a/CUETools.Codecs.LAME/Encoder.cs +++ b/CUETools.Codecs.LAME/Encoder.cs @@ -105,7 +105,7 @@ namespace CUETools.Codecs.LAME protected virtual BE_CONFIG MakeConfig() { - return new BE_CONFIG(_pcm, 128); + return new BE_CONFIG(_pcm); } private bool inited = false; @@ -121,7 +121,7 @@ namespace CUETools.Codecs.LAME throw new ApplicationException(string.Format("Lame_encDll.beInitStream failed with the error code {0}", LameResult)); m_InBuffer = new byte[m_InputSamples * 2]; //Input buffer is expected as short[] - m_OutBuffer = new byte[m_OutBufferSize]; + m_OutBuffer = new byte[Math.Max(65536, m_OutBufferSize)]; if (_IO == null) _IO = new FileStream(_path, FileMode.Create, FileAccess.Write, FileShare.Read); @@ -129,7 +129,7 @@ namespace CUETools.Codecs.LAME inited = true; } - public void Write(AudioBuffer buff) + public unsafe void Write(AudioBuffer buff) { buff.Prepare(this); @@ -142,60 +142,76 @@ namespace CUETools.Codecs.LAME int ToCopy = 0; uint EncodedSize = 0; uint LameResult; - while (count > 0) + uint outBufferIndex = 0; + fixed (byte* pBuffer = buffer, pOutBuffer = m_OutBuffer) { - if (m_InBufferPos > 0) + while (count > 0) { - ToCopy = Math.Min(count, m_InBuffer.Length - m_InBufferPos); - Buffer.BlockCopy(buffer, index, m_InBuffer, m_InBufferPos, ToCopy); - m_InBufferPos += ToCopy; - index += ToCopy; - count -= ToCopy; - if (m_InBufferPos >= m_InBuffer.Length) + if (m_InBufferPos > 0) { - m_InBufferPos = 0; - if ((LameResult = Lame_encDll.EncodeChunk(m_hLameStream, m_InBuffer, m_OutBuffer, ref EncodedSize)) == Lame_encDll.BE_ERR_SUCCESSFUL) + ToCopy = Math.Min(count, m_InBuffer.Length - m_InBufferPos); + Buffer.BlockCopy(buffer, index, m_InBuffer, m_InBufferPos, ToCopy); + m_InBufferPos += ToCopy; + index += ToCopy; + count -= ToCopy; + if (m_InBufferPos >= m_InBuffer.Length) { - if (EncodedSize > 0) + m_InBufferPos = 0; + if (outBufferIndex > 0) { - _IO.Write(m_OutBuffer, 0, (int)EncodedSize); - bytesWritten += EncodedSize; + _IO.Write(m_OutBuffer, 0, (int)outBufferIndex); + bytesWritten += outBufferIndex; + outBufferIndex = 0; + } + + if ((LameResult = Lame_encDll.EncodeChunk(m_hLameStream, m_InBuffer, m_OutBuffer, ref EncodedSize)) == Lame_encDll.BE_ERR_SUCCESSFUL) + { + outBufferIndex += EncodedSize; + } + else + { + throw new ApplicationException(string.Format("Lame_encDll.EncodeChunk failed with the error code {0}", LameResult)); } } - else - { - throw new ApplicationException(string.Format("Lame_encDll.EncodeChunk failed with the error code {0}", LameResult)); - } - } - } - else - { - if (count >= m_InBuffer.Length) - { - if ((LameResult = Lame_encDll.EncodeChunk(m_hLameStream, buffer, index, (uint)m_InBuffer.Length, m_OutBuffer, ref EncodedSize)) == Lame_encDll.BE_ERR_SUCCESSFUL) - { - if (EncodedSize > 0) - { - _IO.Write(m_OutBuffer, 0, (int)EncodedSize); - bytesWritten += EncodedSize; - } - } - else - { - throw new ApplicationException(string.Format("Lame_encDll.EncodeChunk failed with the error code {0}", LameResult)); - } - count -= m_InBuffer.Length; - index += m_InBuffer.Length; } else { - Buffer.BlockCopy(buffer, index, m_InBuffer, 0, count); - m_InBufferPos = count; - index += count; - count = 0; + if (count >= m_InBuffer.Length) + { + if (outBufferIndex + m_OutBufferSize > m_OutBuffer.Length) + { + _IO.Write(m_OutBuffer, 0, (int)outBufferIndex); + bytesWritten += outBufferIndex; + outBufferIndex = 0; + } + + if ((LameResult = Lame_encDll.EncodeChunk(m_hLameStream, pBuffer + index, (uint)m_InBuffer.Length, pOutBuffer + outBufferIndex, ref EncodedSize)) == Lame_encDll.BE_ERR_SUCCESSFUL) + { + outBufferIndex += EncodedSize; + } + else + { + throw new ApplicationException(string.Format("Lame_encDll.EncodeChunk failed with the error code {0}", LameResult)); + } + count -= m_InBuffer.Length; + index += m_InBuffer.Length; + } + else + { + Buffer.BlockCopy(buffer, index, m_InBuffer, 0, count); + m_InBufferPos = count; + index += count; + count = 0; + } } } } + + if (outBufferIndex > 0) + { + _IO.Write(m_OutBuffer, 0, (int)outBufferIndex); + bytesWritten += outBufferIndex; + } } public virtual int CompressionLevel @@ -264,10 +280,23 @@ namespace CUETools.Codecs.LAME } } + public enum LAMEEncoderVBRProcessingQuality : uint + { + Best = 0, + Normal = 5, + } public class LAMEEncoderVBRSettings { - public LAMEEncoderVBRSettings() { } + public LAMEEncoderVBRSettings() + { + // Iterate through each property and call ResetValue() + foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this)) + property.ResetValue(this); + } + + [DefaultValue(LAMEEncoderVBRProcessingQuality.Normal)] + public LAMEEncoderVBRProcessingQuality Quality { get; set; } } [AudioEncoderClass("lame VBR", "mp3", false, "V9 V8 V7 V6 V5 V4 V3 V2 V1 V0", "V2", 2, typeof(LAMEEncoderVBRSettings))] @@ -287,7 +316,7 @@ namespace CUETools.Codecs.LAME protected override BE_CONFIG MakeConfig() { - BE_CONFIG Mp3Config = new BE_CONFIG(PCM, 128); + BE_CONFIG Mp3Config = new BE_CONFIG(PCM, 0, (uint)_settings.Quality); Mp3Config.format.lhv1.bWriteVBRHeader = 1; Mp3Config.format.lhv1.nMode = MpegMode.JOINT_STEREO; Mp3Config.format.lhv1.bEnableVBR = 1; @@ -391,7 +420,7 @@ namespace CUETools.Codecs.LAME protected override BE_CONFIG MakeConfig() { - BE_CONFIG Mp3Config = new BE_CONFIG(PCM, _settings.CustomBitrate > 0 ? (uint)_settings.CustomBitrate : bps); + BE_CONFIG Mp3Config = new BE_CONFIG(PCM, _settings.CustomBitrate > 0 ? (uint)_settings.CustomBitrate : bps, 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/Lame.cs b/CUETools.Codecs.LAME/Lame.cs index 44b434f..7f0e947 100644 --- a/CUETools.Codecs.LAME/Lame.cs +++ b/CUETools.Codecs.LAME/Lame.cs @@ -137,7 +137,7 @@ namespace CUETools.Codecs.LAME //[ MarshalAs( UnmanagedType.ByValArray, SizeConst=255-4*4-2 )] //public byte[] btReserved;//[255-4*sizeof(DWORD) - sizeof( WORD )]; - public LHV1(AudioPCMConfig format, uint MpeBitRate) + public LHV1(AudioPCMConfig format, uint MpeBitRate, uint quality) { dwStructVersion = 1; dwStructSize = (uint)Marshal.SizeOf(typeof(BE_CONFIG)); @@ -171,6 +171,7 @@ namespace CUETools.Codecs.LAME } switch (MpeBitRate) { + case 0 : case 32 : case 40 : case 48 : @@ -217,7 +218,7 @@ namespace CUETools.Codecs.LAME bStrictIso = 0; dwMaxBitrate = 0; dwVbrAbr_bps = 0; - nQuality = 0; + nQuality = (ushort)(quality | ((~quality) << 8)); nVbrMethod = VBRMETHOD.VBR_METHOD_NONE; nVBRQuality = 0; } @@ -243,9 +244,9 @@ namespace CUETools.Codecs.LAME [FieldOffset(0)] public ACC acc; - public Format(AudioPCMConfig format, uint MpeBitRate) + public Format(AudioPCMConfig format, uint MpeBitRate, uint quality) { - lhv1 = new LHV1(format, MpeBitRate); + lhv1 = new LHV1(format, MpeBitRate, quality); } } @@ -259,13 +260,13 @@ namespace CUETools.Codecs.LAME public uint dwConfig; public Format format; - public BE_CONFIG(AudioPCMConfig format, uint MpeBitRate) + public BE_CONFIG(AudioPCMConfig format, uint MpeBitRate, uint quality) { this.dwConfig = BE_CONFIG_LAME; - this.format = new Format(format, MpeBitRate); + this.format = new Format(format, MpeBitRate, quality); } public BE_CONFIG(AudioPCMConfig format) - : this(format, 128) + : this(format, 0, 5) { } } @@ -356,7 +357,7 @@ namespace CUETools.Codecs.LAME /// The amount of data written might vary from chunk to chunk /// On success: BE_ERR_SUCCESSFUL [DllImport("Lame_enc.dll")] - protected static extern uint beEncodeChunk(uint hbeStream, uint nSamples, IntPtr pSamples, [In, Out] byte[] pOutput, ref uint pdwOutput); + protected static extern uint beEncodeChunk(uint hbeStream, uint nSamples, IntPtr pSamples, IntPtr pOutput, ref uint pdwOutput); /// /// Encodes a chunk of samples. Samples are contained in a byte array @@ -370,20 +371,27 @@ namespace CUETools.Codecs.LAME /// Returns the number of bytes of encoded data written. /// The amount of data written might vary from chunk to chunk /// On success: BE_ERR_SUCCESSFUL - public static uint EncodeChunk(uint hbeStream, byte[] buffer, int index, uint nBytes, byte[] pOutput, ref uint pdwOutput) + public static unsafe uint EncodeChunk(uint hbeStream, byte *pSamples, uint nBytes, byte* pOutput, ref uint pdwOutput) { - uint res; - GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); - try - { - IntPtr ptr = (IntPtr)(handle.AddrOfPinnedObject().ToInt32()+index); - res = beEncodeChunk(hbeStream, nBytes/2/*Samples*/, ptr, pOutput, ref pdwOutput); - } - finally - { - handle.Free(); - } - return res; + return beEncodeChunk(hbeStream, nBytes / 2/*Samples*/, (IntPtr)pSamples, (IntPtr)pOutput, ref pdwOutput); + } + + /// + /// Encodes a chunk of samples. Samples are contained in a byte array + /// + /// Handle of the stream. + /// Bytes to encode + /// Position of the first byte to encode + /// Number of bytes to encode (not samples, samples are two byte lenght) + /// Buffer where to write the encoded data. + /// This buffer should be at least of the minimum size returned by beInitStream(). + /// Returns the number of bytes of encoded data written. + /// The amount of data written might vary from chunk to chunk + /// On success: BE_ERR_SUCCESSFUL + public static unsafe uint EncodeChunk(uint hbeStream, byte[] Samples, int index, uint nBytes, byte[] Output, ref uint pdwOutput) + { + fixed(byte *pSamples = &Samples[index], pOutput = Output) + return beEncodeChunk(hbeStream, nBytes / 2/*Samples*/, (IntPtr)pSamples, (IntPtr)pOutput, ref pdwOutput); } /// diff --git a/CUETools.Parity/RsDecode.cs b/CUETools.Parity/RsDecode.cs index 43bf63e52f22f1356e9faf5ce73044e7fc7661ef..7499dd7aa8626797445119324289c843dab2a386 100644 GIT binary patch delta 1914 zcmcaKo$=NN#tl(SlhurbbW0hE88R618HyN67@`?;7!(+E7-AU|7?K$>7%~}B8S)rH z7!nzh7;+d=8LTHOT53;jU|OQd$xs58FJ{nV$Yn@m$Yw}oa0ZK@>d=_H(OY=(JQ1$R zJZv13ZI~76v6&mqP{B|Ew%Y(qW`bQ{%b>uJ%TUUY!=S-nz+eDZvynNDL6;$uL6d=( zfs28Yfs;WW46(ZzVYVU2Yz+oX!$FpVEC6{PZun$IHqpsTn60?;7z!8?8HyN`80;ns zvKddF#U?lThAy9a8ACopCPNC?k@x~&J(Hp*Hcu-sfIOJTkjhZbpum6{4Mq&63}ztb zG8lnLcwkTVcNL%fk55AoF2VqH-{eFG@yQCDeEJ9(Y_>)-K!O-TW-`Q1UdSP8h#Z~x zbb*5q6oMdKljZn$Cg0)^QqN>aVu1L@kinWkfdRs|VNhUz_ya07nV(aBvJWSRU=Bk* zLpoTM0Yu;Ak4)kcdJH~b@epugiw4WbGFUTAcHk62(qf3vqK-|A0)q_$$Z87)kY;cS znfy>$a`FcrF|2{6X-+7>K;8i*4S0|tT%f4O;L1?JP{06lG^*FM85BTXn> z$K(=yA);-A2Q^W)fkFk{HWyx*$!7$mKsj%-4f7lkNsuRy)0qN;7C4)SOkU3{pOZi^+;A(vx2(3r+sO zBQaS)T5Pfnm(=7PvQm>LaEZX|o2(%xzzMf=vLUzd)CePp&ncU^THTjL4 z#^e$nfyoZ?Vv~2t^G%*4Z#MauyuoBOC85b)Qf`w^@uPKGDI_IfWi=LiW-9gxD-ocNMq1s00q7Rg9Vf}Vo+evW>8?r z0+)Po(DF9~MZX<`9Ro;*CW8WY%^<^|hD`2O(48E^CooyTTx_x&AKT;yDqNtv3JT86 z3erYQlXu9bOxBX)6GZsL8d9E4eyFTF`G>4YJrQBS0M!F7g+V1T!Zb*MKyJ9?F%+bM zOI?UhNemtaP|`&tDG(240zwoTQk(nbW;45|F=R4SFrkD4T)Qgh1;)j>&e4GMg7D8EFCl1W$Qo delta 155 zcmcb$f$`FG#tl(SlT&oXCd;`BOg_T2Wbz7EzReprmx)aF(&L(}XU(&@O>Q02WHF_X z&6CuUm{_YA6c}tLPc#yre1?N#a+9{u`0eE6GjsO4v diff --git a/CUETools.Parity/RsEncode.cs b/CUETools.Parity/RsEncode.cs index 405c96c840f4168719f83bfeaa7fec4e99067fd4..d9b3e821e385c86f67b3ed10794507339ce3a379 100644 GIT binary patch delta 118 zcmX@1_fCJq1MbNwOd{H)48;r?4EYR23?&TF3_1)t46zIf45yj|Knnt94E@Lc>(hc#?3kchu8tj9}DXM diff --git a/CUETools.Processor/Processor.cs b/CUETools.Processor/Processor.cs index 69997b0..4bfb3e4 100644 --- a/CUETools.Processor/Processor.cs +++ b/CUETools.Processor/Processor.cs @@ -3191,13 +3191,13 @@ string status = processor.Go(); _padding += _eacLog.Length; } - public void UseCUEToolsDB(bool submit, string userAgent) + public void UseCUEToolsDB(bool submit, string userAgent, string driveName) { ShowProgress((string)"Contacting CUETools database...", 0, null, null); _CUEToolsDB = new CUEToolsDB(_toc, proxy); _CUEToolsDB.UploadHelper.onProgress += new EventHandler(UploadProgress); - _CUEToolsDB.ContactDB(userAgent); + _CUEToolsDB.ContactDB(userAgent, driveName); if (!_toc[_toc.TrackCount].IsAudio && DataTrackLength == 0) foreach (DBEntry e in _CUEToolsDB.Entries) @@ -4325,11 +4325,8 @@ string status = processor.Go(); else if (_audioEncoderType != AudioEncoderType.NoAudio) WriteAudioFilesPass(OutputDir, OutputStyle, destLengths, htoaToFile, _action == CUEAction.Verify); - if (_useCUEToolsDB && _CUEToolsDB.AccResult == HttpStatusCode.OK) - { - if (!_useCUEToolsDBFix) - _CUEToolsDB.DoVerify(); - } + if (_useCUEToolsDB && !_useCUEToolsDBFix) + _CUEToolsDB.DoVerify(); _processed = true; @@ -6311,17 +6308,17 @@ string status = processor.Go(); foreach (DBEntry entry in CTDB.Entries) if (entry.toc.TrackOffsets == _toc.TrackOffsets && !entry.hasErrors) return "CUEToolsDB: " + CTDB.Status; - if (ArVerify.WorstConfidence() < 2) + if (ArVerify.WorstConfidence() < 1) { CTDB.SubStatus = "will not submit"; return GenerateAccurateRipStatus(); } - CTDB.Submit((int)ArVerify.WorstConfidence(), Artist, Title); + CTDB.Submit((int)ArVerify.WorstConfidence(), 100, Artist, Title); return GenerateAccurateRipStatus(); } case "repair": { - UseCUEToolsDB(false, "CUETools " + CUEToolsVersion); + UseCUEToolsDB(false, "CUETools " + CUEToolsVersion, null); Action = CUEAction.Verify; if (CTDB.DBStatus != null) return CTDB.DBStatus; diff --git a/CUETools/frmCUETools.cs b/CUETools/frmCUETools.cs index f240c50..fdce85c 100644 --- a/CUETools/frmCUETools.cs +++ b/CUETools/frmCUETools.cs @@ -873,7 +873,7 @@ namespace JDP { if (useLocalDB) cueSheet.UseLocalDB(_localDB); if (useCUEToolsDB) - cueSheet.UseCUEToolsDB(false, "CUETools " + CUESheet.CUEToolsVersion); + cueSheet.UseCUEToolsDB(false, "CUETools " + CUESheet.CUEToolsVersion, null); if (useAR) cueSheet.UseAccurateRip();