mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
CTDB2.0: ignore pregap
This commit is contained in:
@@ -406,10 +406,10 @@ namespace CUETools.AccurateRip
|
||||
uint crc;
|
||||
if (iTrack == 0)
|
||||
{
|
||||
int discLen = (int)_toc.AudioLength * 588;
|
||||
int discLen = ((int)_toc.AudioLength - (int)TOC.Pregap) * 588;
|
||||
int chunkLen = discLen - prefixSamples - suffixSamples;
|
||||
return 0xffffffff ^ Crc32.Combine(
|
||||
0xffffffff ^ _CRC32[0, prefixSamples],
|
||||
0xffffffff ^ _CRC32[1, prefixSamples],
|
||||
_CRC32[_toc.AudioTracks, 2 * maxOffset - suffixSamples],
|
||||
chunkLen * 4);
|
||||
}
|
||||
@@ -491,7 +491,8 @@ namespace CUETools.AccurateRip
|
||||
/// <param name="offs"></param>
|
||||
public unsafe void CalculateCRCs(uint* t, ushort* wr, ushort* pte, uint* pSampleBuff, int count, int offs)
|
||||
{
|
||||
int currentStride = ((int)_sampleCount * 2) / stride;
|
||||
int currentSample = Math.Max(0, (int)_sampleCount - 588 * (int)this.TOC.Pregap);
|
||||
int currentStride = (currentSample * 2) / stride;
|
||||
bool doPar = currentStride >= 1 && currentStride <= stridecount && calcParity;
|
||||
SyndromeCalc syndromeCalc = doPar ? maxNpar == 8 ? (SyndromeCalc)SyndromeCalc8 : (SyndromeCalc)SyndromeCalc16 : (SyndromeCalc)SyndromeCalcDummy;
|
||||
|
||||
@@ -603,17 +604,15 @@ namespace CUETools.AccurateRip
|
||||
// Process no more than there is in the buffer, no more than there is in this track, and no more than up to a sector boundary.
|
||||
int copyCount = Math.Min(Math.Min(sampleBuffer.Length - pos, (int)_samplesRemTrack), 588 - (int)_sampleCount % 588);
|
||||
uint* samples = ((uint*)pSampleBuff) + pos;
|
||||
int currentPart = ((int)_sampleCount * 2) % stride;
|
||||
int currentSample = (int)_sampleCount - 588 * (int)this.TOC.Pregap;
|
||||
int currentPart = currentSample < 0 ? 0 : (currentSample * 2) % stride;
|
||||
//ushort* synptr = synptr1 + npar * currentPart;
|
||||
ushort* wr = ((ushort*)bpar) + maxNpar * currentPart;
|
||||
int currentStride = ((int)_sampleCount * 2) / stride;
|
||||
|
||||
for (int i = 0; i < Math.Min(leadin.Length - (int)_sampleCount * 2, copyCount * 2); i++)
|
||||
leadin[_sampleCount * 2 + i] = ((ushort*)samples)[i];
|
||||
for (int i = Math.Max(0, - currentSample * 2); i < Math.Min(leadin.Length - currentSample * 2, copyCount * 2); i++)
|
||||
leadin[currentSample * 2 + i] = ((ushort*)samples)[i];
|
||||
|
||||
for (int i = Math.Max(0, (int)(_finalSampleCount - _sampleCount) * 2 - leadout.Length); i < copyCount * 2; i++)
|
||||
//if (currentStride >= stridecount && leadout != null)
|
||||
//for (int i = 0; i < copyCount * 2; i++)
|
||||
{
|
||||
int remaining = (int)(_finalSampleCount - _sampleCount) * 2 - i - 1;
|
||||
leadout[remaining] = ((ushort*)samples)[i];
|
||||
@@ -672,7 +671,7 @@ namespace CUETools.AccurateRip
|
||||
{
|
||||
for (int i = 0; i < leadin.Length; i++)
|
||||
{
|
||||
int currentOffset = i / 2;
|
||||
int currentOffset = i / 2 + 588 * (int)this.TOC.Pregap;
|
||||
if (currentOffset >= start && currentOffset < end)
|
||||
this.leadin[i] = part.leadin[i];
|
||||
}
|
||||
@@ -745,8 +744,9 @@ namespace CUETools.AccurateRip
|
||||
{
|
||||
var newSyndrome1 = this.GetSyndrome();
|
||||
var newSyndrome2 = part.GetSyndrome();
|
||||
var i1 = Math.Max(0, start * 2 - stride);
|
||||
var i2 = Math.Min(2 * (int)_finalSampleCount - laststride - stride, end * 2 - stride);
|
||||
int firstSample = 588 * (int)TOC.Pregap;
|
||||
var i1 = Math.Max(0, (start - firstSample) * 2 - stride);
|
||||
var i2 = Math.Min(2 * ((int)_finalSampleCount - firstSample) - laststride - stride, (end - firstSample) * 2 - stride);
|
||||
var diff = i2 / stride - i1 / stride;
|
||||
var i1s = i1 % stride;
|
||||
var i2s = i2 % stride;
|
||||
|
||||
@@ -12,26 +12,28 @@ namespace CUETools.AccurateRip
|
||||
public class CDRepair
|
||||
{
|
||||
protected int sampleCount;
|
||||
protected int pregap;
|
||||
protected int finalSampleCount;
|
||||
internal Galois galois;
|
||||
internal int stride;
|
||||
internal int laststride;
|
||||
internal int stridecount;
|
||||
|
||||
public CDRepair(int finalSampleCount, int stride)
|
||||
{
|
||||
public CDRepair(int pregap, int finalSampleCount, int stride)
|
||||
{
|
||||
this.stride = stride;
|
||||
this.finalSampleCount = finalSampleCount;
|
||||
sampleCount = 0;
|
||||
galois = Galois16.instance;
|
||||
laststride = stride + (finalSampleCount * 2) % stride;
|
||||
stridecount = (finalSampleCount * 2) / stride - 2; // minus one for leadin and one for leadout
|
||||
if ((finalSampleCount * 2 + stride - 1) / stride + AccurateRipVerify.maxNpar > galois.Max)
|
||||
this.pregap = pregap;
|
||||
this.finalSampleCount = finalSampleCount;
|
||||
this.sampleCount = 0;
|
||||
this.galois = Galois16.instance;
|
||||
this.laststride = this.stride + ((this.finalSampleCount - this.pregap) * 2) % this.stride;
|
||||
this.stridecount = ((this.finalSampleCount - this.pregap) * 2) / this.stride - 2; // minus one for leadin and one for leadout
|
||||
if (((this.finalSampleCount - this.pregap) * 2 + this.stride - 1) / this.stride + AccurateRipVerify.maxNpar > galois.Max)
|
||||
throw new Exception("invalid stride");
|
||||
}
|
||||
|
||||
public CDRepair(CDRepair src)
|
||||
: this(src.finalSampleCount, src.stride)
|
||||
: this(src.pregap, src.finalSampleCount, src.stride)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -55,15 +57,7 @@ namespace CUETools.AccurateRip
|
||||
{
|
||||
return stride;
|
||||
}
|
||||
}
|
||||
|
||||
public int LastStride
|
||||
{
|
||||
get
|
||||
{
|
||||
return laststride;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class CDRepairEncode : CDRepair
|
||||
@@ -71,7 +65,7 @@ namespace CUETools.AccurateRip
|
||||
protected AccurateRipVerify ar;
|
||||
|
||||
public CDRepairEncode(AccurateRipVerify ar, int stride)
|
||||
: base ((int)ar.FinalSampleCount, stride)
|
||||
: base ((int)ar.TOC.Pregap * 588, (int)ar.FinalSampleCount, stride)
|
||||
{
|
||||
this.ar = ar;
|
||||
ar.InitCDRepair(stride, laststride, stridecount, true);
|
||||
@@ -216,9 +210,9 @@ namespace CUETools.AccurateRip
|
||||
for (int i = 0; i < errcount; i++)
|
||||
{
|
||||
int pos = galois.toPos(stridecount, _errpos[i]) * stride + part2;
|
||||
int erroffi = stride + pos - actualOffset * 2;
|
||||
int erroffi = stride + pos + pregap * 2 - actualOffset * 2;
|
||||
ushort diff = (ushort)this.galois.doForney(errcount, _errpos[i], _sigma, _omega);
|
||||
if (erroffi < 0 || erroffi >= finalSampleCount * 2)
|
||||
if (erroffi < pregap * 2 || erroffi >= finalSampleCount * 2)
|
||||
{
|
||||
fix.canRecover = false;
|
||||
return fix;
|
||||
@@ -301,7 +295,7 @@ namespace CUETools.AccurateRip
|
||||
|
||||
public int GetAffectedSectorsCount(int min, int max)
|
||||
{
|
||||
min = Math.Max(2 * min, stride - 2 * ActualOffset);
|
||||
min = Math.Max(2 * min, 2 * pregap + stride - 2 * ActualOffset);
|
||||
max = Math.Min(2 * max, 2 * finalSampleCount - laststride - 2 * ActualOffset);
|
||||
int count = 0;
|
||||
for (int i = 0; i < correctableErrors; i++)
|
||||
@@ -312,7 +306,7 @@ namespace CUETools.AccurateRip
|
||||
|
||||
public string GetAffectedSectors(int min, int max)
|
||||
{
|
||||
min = Math.Max(2 * min, stride - 2 * ActualOffset);
|
||||
min = Math.Max(2 * min, 2 * pregap + stride - 2 * ActualOffset);
|
||||
max = Math.Min(2 * max, 2 * finalSampleCount - laststride - 2 * ActualOffset);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < correctableErrors; i++)
|
||||
@@ -340,7 +334,7 @@ namespace CUETools.AccurateRip
|
||||
if ((sampleBuffer.ByteLength & 1) != 0)
|
||||
throw new Exception("never happens");
|
||||
|
||||
int firstPos = Math.Max(0, stride - sampleCount * 2 - ActualOffset * 2);
|
||||
int firstPos = Math.Max(0, stride + (pregap - sampleCount) * 2 - ActualOffset * 2);
|
||||
int lastPos = Math.Min(sampleBuffer.ByteLength >> 1, (finalSampleCount - sampleCount) * 2 - laststride - ActualOffset * 2);
|
||||
|
||||
fixed (byte* bytes = sampleBuffer.Bytes)
|
||||
|
||||
Reference in New Issue
Block a user