From bc701464e0571a5926d03cde7de5412982873750 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 9 Feb 2019 00:57:29 +0000 Subject: [PATCH] Use faster and better mode to extract audio. --- .../.idea/contentModel.xml | 1 - DiscImageChef.VideoNow/Program.cs | 58 ++++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/.idea/.idea.DiscImageChef.VideoNow/.idea/contentModel.xml b/.idea/.idea.DiscImageChef.VideoNow/.idea/contentModel.xml index 7f96c45..906c26f 100644 --- a/.idea/.idea.DiscImageChef.VideoNow/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef.VideoNow/.idea/contentModel.xml @@ -1,7 +1,6 @@ - diff --git a/DiscImageChef.VideoNow/Program.cs b/DiscImageChef.VideoNow/Program.cs index 196907b..ba31c42 100644 --- a/DiscImageChef.VideoNow/Program.cs +++ b/DiscImageChef.VideoNow/Program.cs @@ -120,7 +120,6 @@ namespace DiscImageChef.VideoNow long framePosition = 0; byte[] buffer = new byte[frameMarker.Length]; - long framePositionForAudio; while(framePosition < 19600) { @@ -166,10 +165,14 @@ namespace DiscImageChef.VideoNow long headersSize = Marshal.SizeOf(waveHeader) + Marshal.SizeOf(fmtChunk) + Marshal.SizeOf(dataChunkHeader); outFs.Write(new byte[headersSize], 0, (int)headersSize); - fs.Position = framePosition + 8; - while(fs.Position + 10 < framePosition + 19600) + fs.Position = framePosition; + byte[] frameBuffer = new byte[19600]; + fs.Read(frameBuffer, 0, frameBuffer.Length); + frameBuffer = SwapBuffer(frameBuffer); + + for(int i = 9; i <= frameBuffer.Length; i += 10) { - switch(fs.Position % 4) + switch(i / 10 % 4) { case 0: progress = '-'; @@ -186,13 +189,12 @@ namespace DiscImageChef.VideoNow } Console.Write("\rExtracting audio {0} ", progress); - outFs.WriteByte((byte)fs.ReadByte()); - - fs.Position += 9; + outFs.WriteByte(frameBuffer[i]); } int totalFrames = 1; framePosition += 19600; + buffer = new byte[frameMarker.Length]; while(framePosition + 19600 < fs.Length) { @@ -232,10 +234,15 @@ namespace DiscImageChef.VideoNow if(buffer.SequenceEqual(frameMarker)) { Console.Write("\r \r"); - fs.Position = framePosition + 8; - while(fs.Position + 10 < framePosition + 19600) + + fs.Position = framePosition; + frameBuffer = new byte[19600]; + fs.Read(frameBuffer, 0, frameBuffer.Length); + frameBuffer = SwapBuffer(frameBuffer); + + for(int i = 9; i <= frameBuffer.Length; i += 10) { - switch(fs.Position % 4) + switch(i / 10 % 4) { case 0: progress = '-'; @@ -252,9 +259,7 @@ namespace DiscImageChef.VideoNow } Console.Write("\rExtracting audio {0} ", progress); - outFs.WriteByte((byte)fs.ReadByte()); - - fs.Position += 9; + outFs.WriteByte(frameBuffer[i]); } totalFrames++; @@ -281,10 +286,14 @@ namespace DiscImageChef.VideoNow } Console.Write("\r \r"); - fs.Position = framePosition + 8; - while(fs.Position + 10 < framePosition + 19600) + fs.Position = framePosition; + frameBuffer = new byte[19600]; + fs.Read(frameBuffer, 0, frameBuffer.Length); + frameBuffer = SwapBuffer(frameBuffer); + + for(int i = 9; i <= frameBuffer.Length; i += 10) { - switch(fs.Position % 4) + switch(i / 10 % 4) { case 0: progress = '-'; @@ -300,10 +309,8 @@ namespace DiscImageChef.VideoNow break; } - Console.Write("\rExtracting audio {0}", progress); - outFs.WriteByte((byte)fs.ReadByte()); - - fs.Position += 9; + Console.Write("\rExtracting audio {0} ", progress); + outFs.WriteByte(frameBuffer[i]); } totalFrames++; @@ -351,6 +358,17 @@ namespace DiscImageChef.VideoNow Console.WriteLine("{0}", AssemblyCopyright); Console.WriteLine(); } + + static byte[] SwapBuffer(byte[] buffer) + { + byte[] tmp = new byte[buffer.Length]; + for(int i = 0; i < buffer.Length; i += 2) + { + tmp[i] = buffer[i + 1]; + tmp[i + 1] = buffer[i]; + } + return tmp; + } } [StructLayout(LayoutKind.Sequential)]