From 351e6e67626e9d94918c0534c88e0bfd14a77cd6 Mon Sep 17 00:00:00 2001 From: chudov Date: Sun, 23 Oct 2011 19:36:55 +0000 Subject: [PATCH] FLACReader.Position was returning nonsense (thanks, Ivailo) --- CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp | 4 ++-- CUETools/CUETools.TestCodecs/CodecsTest.cs | 10 +++++++++- CUETools/CUETools.TestCodecs/FlacWriterTest.cs | 18 ++++++++++++------ .../CUETools.TestCodecs/FlakeWriterTest.cs | 18 ++++++++++++------ CUETools/CUETools.sln | 2 +- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp b/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp index f6e3343..f835bb2 100644 --- a/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp +++ b/CUETools.Codecs.FLAC/CUETools.Codecs.FLAC.cpp @@ -229,7 +229,7 @@ namespace CUETools { namespace Codecs { namespace FLAC { virtual property Int64 Remaining { Int64 get() { - return _sampleCount - _sampleOffset + SamplesInBuffer; + return _sampleCount - Position; } } @@ -273,7 +273,6 @@ namespace CUETools { namespace Codecs { namespace FLAC { throw gcnew Exception(String::Format("an error occurred while decoding: {0}", state)); } } while (_bufferLength == 0); - _sampleOffset += _bufferLength; } Int32 copyCount = Math::Min(samplesNeeded, SamplesInBuffer); Array::Copy(_sampleBuffer->Bytes, _bufferOffset * pcm->BlockAlign, buff->Bytes, buffOffset * pcm->BlockAlign, copyCount * pcm->BlockAlign); @@ -349,6 +348,7 @@ namespace CUETools { namespace Codecs { namespace FLAC { } } _bufferLength = sampleCount; + _sampleOffset += _bufferLength; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } diff --git a/CUETools/CUETools.TestCodecs/CodecsTest.cs b/CUETools/CUETools.TestCodecs/CodecsTest.cs index 5b12dc2..203cef3 100644 --- a/CUETools/CUETools.TestCodecs/CodecsTest.cs +++ b/CUETools/CUETools.TestCodecs/CodecsTest.cs @@ -102,7 +102,15 @@ namespace CUETools.TestCodecs CollectionAssert.AreEqual(testSamples2, target.Samples, "CUETools.Codecs.AudioBuffer.Samples was not set correctly."); } - } + public static void AreEqual(AudioBuffer buff1, AudioBuffer buff2) + { + var bytes1 = new byte[buff1.ByteLength]; + var bytes2 = new byte[buff2.ByteLength]; + Array.Copy(buff1.Bytes, bytes1, buff1.ByteLength); + Array.Copy(buff2.Bytes, bytes2, buff2.ByteLength); + CollectionAssert.AreEqual(bytes1, bytes2); + } + } /// diff --git a/CUETools/CUETools.TestCodecs/FlacWriterTest.cs b/CUETools/CUETools.TestCodecs/FlacWriterTest.cs index 399f4e3..6f074a1 100644 --- a/CUETools/CUETools.TestCodecs/FlacWriterTest.cs +++ b/CUETools/CUETools.TestCodecs/FlacWriterTest.cs @@ -55,16 +55,22 @@ namespace CUETools.TestCodecs var r = new FLACReader("test.flac", null); var buff1 = new AudioBuffer(r, 16536); var buff2 = new AudioBuffer(r, 16536); + Assert.AreEqual(0, r.Position); r.Read(buff1, 7777); + Assert.AreEqual(7777, r.Position); r.Position = 0; + Assert.AreEqual(0, r.Position); r.Read(buff2, 7777); + Assert.AreEqual(7777, r.Position); + AudioBufferTest.AreEqual(buff1, buff2); + r.Read(buff1, 7777); + Assert.AreEqual(7777+7777, r.Position); + r.Position = 7777; + Assert.AreEqual(7777, r.Position); + r.Read(buff2, 7777); + Assert.AreEqual(7777+7777, r.Position); + AudioBufferTest.AreEqual(buff1, buff2); r.Close(); - Assert.AreEqual(buff1.ByteLength, buff2.ByteLength); - var bytes1 = new byte[buff1.ByteLength]; - var bytes2 = new byte[buff2.ByteLength]; - Array.Copy(buff1.Bytes, bytes1, buff1.ByteLength); - Array.Copy(buff2.Bytes, bytes2, buff2.ByteLength); - CollectionAssert.AreEqual(bytes1, bytes2); } } } diff --git a/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs b/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs index d4525e1..eb005dc 100644 --- a/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs +++ b/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs @@ -156,16 +156,22 @@ namespace CUETools.TestCodecs var r = new FlakeReader("test.flac", null); var buff1 = new AudioBuffer(r, 16536); var buff2 = new AudioBuffer(r, 16536); + Assert.AreEqual(0, r.Position); r.Read(buff1, 7777); + Assert.AreEqual(7777, r.Position); r.Position = 0; + Assert.AreEqual(0, r.Position); r.Read(buff2, 7777); + Assert.AreEqual(7777, r.Position); + AudioBufferTest.AreEqual(buff1, buff2); + r.Read(buff1, 7777); + Assert.AreEqual(7777 + 7777, r.Position); + r.Position = 7777; + Assert.AreEqual(7777, r.Position); + r.Read(buff2, 7777); + Assert.AreEqual(7777 + 7777, r.Position); + AudioBufferTest.AreEqual(buff1, buff2); r.Close(); - Assert.AreEqual(buff1.ByteLength, buff2.ByteLength); - var bytes1 = new byte[buff1.ByteLength]; - var bytes2 = new byte[buff2.ByteLength]; - Array.Copy(buff1.Bytes, bytes1, buff1.ByteLength); - Array.Copy(buff2.Bytes, bytes2, buff2.ByteLength); - CollectionAssert.AreEqual(bytes1, bytes2); } } } diff --git a/CUETools/CUETools.sln b/CUETools/CUETools.sln index 147d9c1..c121922 100644 --- a/CUETools/CUETools.sln +++ b/CUETools/CUETools.sln @@ -214,7 +214,7 @@ Global {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|Win32.ActiveCfg = Release|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|x64.ActiveCfg = Release|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|x86.ActiveCfg = Release|Any CPU - {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Any CPU.ActiveCfg = Debug|x64 + {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Any CPU.ActiveCfg = Debug|Win32 {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Mixed Platforms.Build.0 = Debug|x64 {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Win32.ActiveCfg = Debug|Win32