splitting the library into more intuitive modules

This commit is contained in:
chudov
2008-11-28 22:20:17 +00:00
parent 1f4f51b379
commit d68737bd2e
28 changed files with 315 additions and 726 deletions

View File

@@ -3,7 +3,7 @@ using System.Text;
using System.IO; using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using AudioCodecsDotNet; using CUETools.Codecs;
//Copyright (c) 2008 Gregory S. Chudov. //Copyright (c) 2008 Gregory S. Chudov.
//This library is based on ALAC decoder by David Hammerton. //This library is based on ALAC decoder by David Hammerton.
@@ -25,7 +25,7 @@ using AudioCodecsDotNet;
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
namespace ALACDotNet namespace CUETools.Codecs.ALAC
{ {
public class ALACReader : IAudioSource public class ALACReader : IAudioSource
{ {

View File

@@ -7,8 +7,8 @@
<ProjectGuid>{F2EC7193-D5E5-4252-9803-5CEB407E910F}</ProjectGuid> <ProjectGuid>{F2EC7193-D5E5-4252-9803-5CEB407E910F}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ALACDotNet</RootNamespace> <RootNamespace>CUETools.Codecs.ALAC</RootNamespace>
<AssemblyName>ALACDotNet</AssemblyName> <AssemblyName>CUETools.Codecs.ALAC</AssemblyName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@@ -31,7 +31,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath> <OutputPath>..\bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
@@ -42,7 +42,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<OutputPath>bin\x64\Release\</OutputPath> <OutputPath>..\bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
@@ -55,7 +55,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath> <OutputPath>..\bin\win32\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
@@ -66,7 +66,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<OutputPath>bin\x86\Release\</OutputPath> <OutputPath>..\bin\win32\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
@@ -87,9 +87,9 @@
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AudioCodecsDotNet\AudioCodecsDotNet.csproj"> <ProjectReference Include="..\AudioCodecsDotNet\CUETools.Codecs.csproj">
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project> <Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
<Name>AudioCodecsDotNet</Name> <Name>CUETools.Codecs</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

View File

@@ -7,7 +7,7 @@ using namespace System::Collections::Specialized;
using namespace System::Runtime::InteropServices; using namespace System::Runtime::InteropServices;
using namespace System::IO; using namespace System::IO;
using namespace APETagsDotNet; using namespace APETagsDotNet;
using namespace AudioCodecsDotNet; using namespace CUETools::Codecs;
#ifndef _WAVEFORMATEX_ #ifndef _WAVEFORMATEX_
#define _WAVEFORMATEX_ #define _WAVEFORMATEX_

View File

@@ -81,9 +81,9 @@
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\CUEToolsLib\CUEToolsLib.csproj"> <ProjectReference Include="..\CUEToolsLib\CUETools.Processor.csproj">
<Project>{4911BD82-49EF-4858-8B51-5394F86739A4}</Project> <Project>{4911BD82-49EF-4858-8B51-5394F86739A4}</Project>
<Name>CUEToolsLib</Name> <Name>CUETools.Processor</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

View File

@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.IO; using System.IO;
using CUEToolsLib; using CUETools.Processor;
namespace ArCueDotNet namespace ArCueDotNet
{ {

View File

@@ -7,8 +7,8 @@
<ProjectGuid>{9253A314-1821-42BF-B02F-2BF986B1765D}</ProjectGuid> <ProjectGuid>{9253A314-1821-42BF-B02F-2BF986B1765D}</ProjectGuid>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CUETools.Ripper.Console</RootNamespace> <RootNamespace>CUERipper</RootNamespace>
<AssemblyName>CUETools.Ripper.Console</AssemblyName> <AssemblyName>CUERipper</AssemblyName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@@ -81,9 +81,17 @@
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AudioCodecsDotNet\AudioCodecsDotNet.csproj"> <ProjectReference Include="..\AudioCodecsDotNet\CUETools.Codecs.csproj">
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project> <Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
<Name>AudioCodecsDotNet</Name> <Name>CUETools.Codecs</Name>
</ProjectReference>
<ProjectReference Include="..\CUETools.AccurateRip\CUETools.AccurateRip.csproj">
<Project>{5802C7E9-157E-4124-946D-70B5AE48A5A1}</Project>
<Name>CUETools.AccurateRip</Name>
</ProjectReference>
<ProjectReference Include="..\CUETools.CDImage\CUETools.CDImage.csproj">
<Project>{1DD41038-D885-46C5-8DDE-E0B82F066584}</Project>
<Name>CUETools.CDImage</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\CUETools.Ripper.SCSI\CUETools.Ripper.SCSI.csproj"> <ProjectReference Include="..\CUETools.Ripper.SCSI\CUETools.Ripper.SCSI.csproj">
<Project>{8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}</Project> <Project>{8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}</Project>

View File

@@ -24,15 +24,16 @@ using System.IO;
using System.Text; using System.Text;
using System.Collections.Generic; using System.Collections.Generic;
using CUETools.Ripper.SCSI; using CUETools.Ripper.SCSI;
using AudioCodecsDotNet; using CUETools.Codecs;
using CUETools.AccurateRip;
namespace CUETools.ConsoleRipper namespace CUERipper
{ {
class Program class Program
{ {
static void Usage() static void Usage()
{ {
Console.WriteLine("Usage : CUETools.Ripper.Console.exe <file.wav>"); Console.WriteLine("Usage : CUERipper.exe <file.wav>");
Console.WriteLine(); Console.WriteLine();
} }
@@ -57,35 +58,17 @@ namespace CUETools.ConsoleRipper
audioSource.Open('D'); audioSource.Open('D');
audioSource.DriveOffset = 48; audioSource.DriveOffset = 48;
StreamWriter logWriter = new StreamWriter(Path.ChangeExtension(destFile, ".log"));
logWriter.WriteLine("{0}", programVersion);
logWriter.WriteLine();
logWriter.WriteLine("Extraction logfile from {0}",DateTime.Now);
logWriter.WriteLine();
logWriter.WriteLine("Used drive : {0}", audioSource.Path);
logWriter.WriteLine();
logWriter.WriteLine("TOC of the extracted CD");
logWriter.WriteLine();
logWriter.WriteLine(" Track | Start | Length | Start sector | End sector");
logWriter.WriteLine(" ---------------------------------------------------------");
for (int track = 0; track < audioSource.TOC.tracks.Count; track++)
logWriter.WriteLine("{0,9} | {1,8} | {2,8} | {3,9} | {4,9}",
audioSource.TOC.tracks[track].Number,
audioSource.TOC.tracks[track].Start.MSF,
audioSource.TOC.tracks[track].Length.MSF,
audioSource.TOC.tracks[track].Start.Sector,
audioSource.TOC.tracks[track].End.Sector);
logWriter.Close();
//audioSource.Close();
//return;
bool toStdout = false; bool toStdout = false;
AccurateRipVerify arVerify = new AccurateRipVerify(audioSource.TOC);
WAVWriter audioDest = new WAVWriter(destFile, audioSource.BitsPerSample, audioSource.ChannelCount, audioSource.SampleRate, toStdout ? Console.OpenStandardOutput() : null); WAVWriter audioDest = new WAVWriter(destFile, audioSource.BitsPerSample, audioSource.ChannelCount, audioSource.SampleRate, toStdout ? Console.OpenStandardOutput() : null);
int[,] buff = new int[audioSource.BestBlockSize, audioSource.ChannelCount]; int[,] buff = new int[audioSource.BestBlockSize, audioSource.ChannelCount];
Console.WriteLine("Filename : {0}", destFile); arVerify.ContactAccurateRip(audioSource.TOC._ArId);
Console.WriteLine("File Info : {0}kHz; {1} channel; {2} bit; {3}", audioSource.SampleRate, audioSource.ChannelCount, audioSource.BitsPerSample, TimeSpan.FromSeconds(audioSource.Length * 1.0 / audioSource.SampleRate)); Console.WriteLine("File Info : {0}kHz; {1} channel; {2} bit; {3}", audioSource.SampleRate, audioSource.ChannelCount, audioSource.BitsPerSample, TimeSpan.FromSeconds(audioSource.Length * 1.0 / audioSource.SampleRate));
Console.WriteLine("Filename : {0}", destFile);
Console.WriteLine("AR status : {0}", arVerify.ARStatus == null ? "ok" : arVerify.ARStatus);
audioDest.FinalSampleCount = (long) audioSource.Length; audioDest.FinalSampleCount = (long) audioSource.Length;
DateTime start = DateTime.Now; DateTime start = DateTime.Now;
@@ -95,6 +78,7 @@ namespace CUETools.ConsoleRipper
{ {
uint samplesRead = audioSource.Read(buff, Math.Min((uint)buff.GetLength(0), (uint)audioSource.Remaining)); uint samplesRead = audioSource.Read(buff, Math.Min((uint)buff.GetLength(0), (uint)audioSource.Remaining));
if (samplesRead == 0) break; if (samplesRead == 0) break;
arVerify.Write(buff, samplesRead);
audioDest.Write(buff, samplesRead); audioDest.Write(buff, samplesRead);
TimeSpan elapsed = DateTime.Now - start; TimeSpan elapsed = DateTime.Now - start;
if ((elapsed - lastPrint).TotalMilliseconds > 60) if ((elapsed - lastPrint).TotalMilliseconds > 60)
@@ -117,18 +101,50 @@ namespace CUETools.ConsoleRipper
); );
audioDest.Close(); audioDest.Close();
StreamWriter logWriter = new StreamWriter(Path.ChangeExtension(destFile, ".log"));
logWriter.WriteLine("{0}", programVersion);
logWriter.WriteLine();
logWriter.WriteLine("Extraction logfile from {0}", DateTime.Now);
logWriter.WriteLine();
logWriter.WriteLine("Used drive : {0}", audioSource.Path);
logWriter.WriteLine();
logWriter.WriteLine("Read offset correction : {0}", audioSource.DriveOffset);
logWriter.WriteLine();
logWriter.WriteLine("TOC of the extracted CD");
logWriter.WriteLine();
logWriter.WriteLine(" Track | Start | Length | Start sector | End sector");
logWriter.WriteLine(" ---------------------------------------------------------");
for (int track = 1; track <= audioSource.TOC.TrackCount; track++)
logWriter.WriteLine("{0,9} | {1,8} | {2,8} | {3,9} | {4,9}",
audioSource.TOC[track].Number,
audioSource.TOC[track].StartMSF,
audioSource.TOC[track].LengthMSF,
audioSource.TOC[track].Start,
audioSource.TOC[track].End);
logWriter.WriteLine();
logWriter.WriteLine("AccurateRip summary");
logWriter.WriteLine();
logWriter.WriteLine("Track\t[ CRC ] Status");
arVerify.GenerateAccurateRipLog(logWriter, 0);
logWriter.WriteLine();
logWriter.WriteLine("End of status report");
logWriter.Close();
StreamWriter cueWriter = new StreamWriter(Path.ChangeExtension(destFile, ".cue")); StreamWriter cueWriter = new StreamWriter(Path.ChangeExtension(destFile, ".cue"));
cueWriter.WriteLine("REM DISCID {0}", audioSource.TOC._cddbId); cueWriter.WriteLine("REM DISCID {0}", audioSource.TOC._cddbId);
cueWriter.WriteLine("REM ACCURATERIPID {0}", audioSource.TOC._ArId); cueWriter.WriteLine("REM ACCURATERIPID {0}", audioSource.TOC._ArId);
cueWriter.WriteLine("REM COMMENT \"{0}\"", programVersion); cueWriter.WriteLine("REM COMMENT \"{0}\"", programVersion);
if (audioSource.TOC._catalog != null) if (audioSource.TOC.Catalog != null)
cueWriter.WriteLine("CATALOG {0}", audioSource.TOC._catalog); cueWriter.WriteLine("CATALOG {0}", audioSource.TOC.Catalog);
cueWriter.WriteLine("FILE \"{0}\" WAVE", destFile); cueWriter.WriteLine("FILE \"{0}\" WAVE", destFile);
for (int track = 0; track < audioSource.TOC.tracks.Count; track++) for (int track = 1; track <= audioSource.TOC.TrackCount; track++)
if (audioSource.TOC[track].IsAudio)
{ {
cueWriter.WriteLine(" TRACK {0:00} AUDIO", audioSource.TOC.tracks[track].Number); cueWriter.WriteLine(" TRACK {0:00} AUDIO", audioSource.TOC[track].Number);
for (int index = 0; index < audioSource.TOC.tracks[track].indexes.Count; index ++) if (audioSource.TOC[track].ISRC != null)
cueWriter.WriteLine(" INDEX {0:00} {1}", audioSource.TOC.tracks[track].indexes[index].Index, audioSource.TOC.tracks[track].indexes[index].MSF); cueWriter.WriteLine(" ISRC {0}", audioSource.TOC[track].ISRC);
for (int index = audioSource.TOC[track].Pregap > 0 ? 0 : 1; index <= audioSource.TOC[track].LastIndex; index++)
cueWriter.WriteLine(" INDEX {0:00} {1}", index, audioSource.TOC[track][index].MSF);
} }
cueWriter.Close(); cueWriter.Close();

View File

@@ -85,9 +85,9 @@
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AudioCodecsDotNet\AudioCodecsDotNet.csproj"> <ProjectReference Include="..\AudioCodecsDotNet\CUETools.Codecs.csproj">
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project> <Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
<Name>AudioCodecsDotNet</Name> <Name>CUETools.Codecs</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\Bwg.Logging\Bwg.Logging.csproj"> <ProjectReference Include="..\Bwg.Logging\Bwg.Logging.csproj">
<Project>{F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}</Project> <Project>{F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}</Project>
@@ -97,6 +97,10 @@
<Project>{A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}</Project> <Project>{A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}</Project>
<Name>Bwg.Scsi</Name> <Name>Bwg.Scsi</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\CUETools.CDImage\CUETools.CDImage.csproj">
<Project>{1DD41038-D885-46C5-8DDE-E0B82F066584}</Project>
<Name>CUETools.CDImage</Name>
</ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -26,7 +26,8 @@ using System.Collections.Specialized;
using System.Text; using System.Text;
using Bwg.Scsi; using Bwg.Scsi;
using Bwg.Logging; using Bwg.Logging;
using AudioCodecsDotNet; using CUETools.CDImage;
using CUETools.Codecs;
namespace CUETools.Ripper.SCSI namespace CUETools.Ripper.SCSI
{ {
@@ -46,9 +47,9 @@ namespace CUETools.Ripper.SCSI
const int NSECTORS = 32; const int NSECTORS = 32;
int _currentTrack = -1, _currentIndex = -1, _currentTrackActualStart = -1; int _currentTrack = -1, _currentIndex = -1, _currentTrackActualStart = -1;
Logger m_logger = null; Logger m_logger = null;
CDImage _toc; CDImageLayout _toc;
public CDImage TOC public CDImageLayout TOC
{ {
get get
{ {
@@ -105,20 +106,23 @@ namespace CUETools.Ripper.SCSI
st = m_device.ReadCDText(out cdtext); st = m_device.ReadCDText(out cdtext);
// new CDTextEncoderDecoder // new CDTextEncoderDecoder
_toc = new CDImage(toc[toc.Count - 1].StartSector); _toc = new CDImageLayout(toc[toc.Count - 1].StartSector);
uint cddbDiscId = 0; uint cddbDiscId = 0;
uint discId1 = 0; uint discId1 = 0;
uint discId2 = 0; uint discId2 = 0;
for (int iTrack = 0; iTrack < toc.Count - 1; iTrack++) for (int iTrack = 0; iTrack < toc.Count - 1; iTrack++)
{ {
_toc.tracks.Add(new CDTrack((uint)iTrack + 1, toc[iTrack].StartSector, _toc.AddTrack(new CDTrack((uint)iTrack + 1, toc[iTrack].StartSector,
toc[iTrack + 1].StartSector - toc[iTrack].StartSector)); toc[iTrack + 1].StartSector - toc[iTrack].StartSector, toc[iTrack].Control == 0));
cddbDiscId += sumDigits((uint)(toc[iTrack].StartSector / 75) + 2);
if (toc[iTrack].Control == 0)
{
discId1 += toc[iTrack].StartSector; discId1 += toc[iTrack].StartSector;
discId2 += (toc[iTrack].StartSector == 0 ? 1 : toc[iTrack].StartSector) * ((uint)iTrack + 1); discId2 += (toc[iTrack].StartSector == 0 ? 1 : toc[iTrack].StartSector) * ((uint)iTrack + 1);
cddbDiscId += sumDigits((uint)(toc[iTrack].StartSector / 75) + 2); }
} }
discId1 += toc[toc.Count - 1].StartSector; discId1 += toc[toc.Count - 1].StartSector;
discId2 += (toc[toc.Count - 1].StartSector == 0 ? 1 : toc[toc.Count - 1].StartSector) * ((uint)toc.Count); discId2 += (toc[toc.Count - 1].StartSector == 0 ? 1 : toc[toc.Count - 1].StartSector) * (_toc.AudioTracks+1);
discId1 &= 0xFFFFFFFF; discId1 &= 0xFFFFFFFF;
discId2 &= 0xFFFFFFFF; discId2 &= 0xFFFFFFFF;
cddbDiscId = (((cddbDiscId % 255) << 24) + cddbDiscId = (((cddbDiscId % 255) << 24) +
@@ -156,18 +160,21 @@ namespace CUETools.Ripper.SCSI
{ {
int iTrack = fromBCD(_sectorBuffer[q_pos + 1]); int iTrack = fromBCD(_sectorBuffer[q_pos + 1]);
int iIndex = fromBCD(_sectorBuffer[q_pos + 2]); int iIndex = fromBCD(_sectorBuffer[q_pos + 2]);
if (iTrack == 110)
throw new Exception("lead out area encountred");
if (iTrack == 0)
throw new Exception("lead in area encountred");
if (iTrack != _currentTrack) if (iTrack != _currentTrack)
{ {
_currentTrack = iTrack; _currentTrack = iTrack;
_currentTrackActualStart = sector + iSector; _currentTrackActualStart = sector + iSector;
_currentIndex = iIndex; _currentIndex = iIndex;
if (_currentIndex == 1) if (_currentIndex == 1)
_toc.tracks[iTrack - 1].indexes.Add(new CDTrackIndex(1, _toc.tracks[iTrack - 1].Start.Sector)); _toc[iTrack].AddIndex(new CDTrackIndex(1, _toc[iTrack].Start));
else if (_currentIndex != 0) else if (_currentIndex != 0)
throw new Exception("invalid index"); throw new Exception("invalid index");
} }
else else if (iIndex != _currentIndex)
if (iIndex != _currentIndex)
{ {
if (iIndex != _currentIndex + 1) if (iIndex != _currentIndex + 1)
throw new Exception("invalid index"); throw new Exception("invalid index");
@@ -175,24 +182,40 @@ namespace CUETools.Ripper.SCSI
if (_currentIndex == 1) if (_currentIndex == 1)
{ {
int pregap = sector + iSector - _currentTrackActualStart; int pregap = sector + iSector - _currentTrackActualStart;
_toc.tracks[iTrack - 1].indexes.Add(new CDTrackIndex(0, (uint)(_toc.tracks[iTrack - 1].Start.Sector - pregap))); _toc[iTrack].AddIndex(new CDTrackIndex(0, (uint)(_toc[iTrack].Start - pregap), (uint)pregap));
_currentTrackActualStart = sector + iSector; _currentTrackActualStart = sector + iSector;
} }
_toc.tracks[iTrack - 1].indexes.Add(new CDTrackIndex((uint)iIndex, (uint)(_toc.tracks[iTrack - 1].Start.Sector + sector + iSector - _currentTrackActualStart))); _toc[iTrack].AddIndex(new CDTrackIndex((uint)iIndex, (uint)(_toc[iTrack].Start + sector + iSector - _currentTrackActualStart)));
_currentIndex = iIndex; _currentIndex = iIndex;
} }
break; break;
} }
case 2: // catalog case 2: // catalog
if (_toc._catalog == null) if (_toc.Catalog == null)
{ {
StringBuilder catalog = new StringBuilder(); StringBuilder catalog = new StringBuilder();
for (int i = 1; i < 8; i++) for (int i = 1; i < 8; i++)
catalog.AppendFormat("{0:x2}", _sectorBuffer[q_pos + i]); catalog.AppendFormat("{0:x2}", _sectorBuffer[q_pos + i]);
_toc._catalog = catalog.ToString(0, 13); _toc.Catalog = catalog.ToString(0, 13);
} }
break; break;
case 3: //isrc case 3: //isrc
if (_toc[_currentTrack].ISRC == null)
{
StringBuilder isrc = new StringBuilder();
char[] ISRC6 = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '#', '#', '#', '#', '#', '#', '#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
isrc.Append(ISRC6[_sectorBuffer[q_pos + 1] >> 2]);
isrc.Append(ISRC6[((_sectorBuffer[q_pos + 1] & 0x3) << 4) + (_sectorBuffer[q_pos + 2] >> 4)]);
isrc.Append(ISRC6[((_sectorBuffer[q_pos + 2] & 0xf) << 2) + (_sectorBuffer[q_pos + 3] >> 6)]);
isrc.Append(ISRC6[(_sectorBuffer[q_pos + 3] & 0x3f)]);
isrc.Append(ISRC6[_sectorBuffer[q_pos + 4] >> 2]);
isrc.Append(ISRC6[((_sectorBuffer[q_pos + 4] & 0x3) << 4) + (_sectorBuffer[q_pos + 5] >> 4)]);
isrc.AppendFormat("{0:x}", _sectorBuffer[q_pos + 5] & 0xf);
isrc.AppendFormat("{0:x2}", _sectorBuffer[q_pos + 6]);
isrc.AppendFormat("{0:x2}", _sectorBuffer[q_pos + 7]);
isrc.AppendFormat("{0:x}", _sectorBuffer[q_pos + 8] >> 4);
_toc[_currentTrack].ISRC = isrc.ToString();
}
break; break;
} }
} }
@@ -321,7 +344,7 @@ namespace CUETools.Ripper.SCSI
{ {
if (_toc == null) if (_toc == null)
throw new Exception("invalid TOC"); throw new Exception("invalid TOC");
return (ulong)588 * _toc.Length.Sector; return (ulong)588 * (_toc.Length - (_toc[_toc.TrackCount].IsAudio ? 0 : _toc[_toc.TrackCount].Length + 152 * 75));
} }
} }
@@ -419,113 +442,4 @@ namespace CUETools.Ripper.SCSI
return r; return r;
} }
} }
public class CDTrackIndex
{
public CDTrackIndex(uint index, uint sector)
{
_sector = sector;
_index = index;
}
public uint Sector
{
get
{
return _sector;
}
}
public uint Index
{
get
{
return _index;
}
}
public string MSF
{
get
{
return new MinuteSecondFrame(_sector).ToString("M:S:F");
}
}
uint _sector;
uint _index;
}
public class CDTrack
{
public CDTrack(uint number, uint start, uint length)
{
_number = number;
_start = start;
_length = length;
indexes = new List<CDTrackIndex>();
}
public CDTrackIndex Start
{
get
{
return new CDTrackIndex(0, _start);
}
}
public CDTrackIndex Length
{
get
{
return new CDTrackIndex(0, _length);
}
}
public CDTrackIndex End
{
get
{
return new CDTrackIndex(0, _start + _length - 1);
}
}
public uint Number
{
get
{
return _number;
}
}
public IList<CDTrackIndex> indexes;
uint _start;
uint _length;
uint _number;
}
public class CDImage
{
public CDImage(uint length)
{
tracks = new List<CDTrack>();
_length = length;
}
public IList<CDTrack> tracks;
public CDTrackIndex Length
{
get
{
return new CDTrackIndex(0, _length);
}
}
public string _catalog;
public string _cddbId;
public string _ArId;
uint _length;
}
} }

View File

@@ -185,9 +185,9 @@
<Compile Include="Settings.cs" /> <Compile Include="Settings.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\CUEToolsLib\CUEToolsLib.csproj"> <ProjectReference Include="..\CUEToolsLib\CUETools.Processor.csproj">
<Project>{4911BD82-49EF-4858-8B51-5394F86739A4}</Project> <Project>{4911BD82-49EF-4858-8B51-5394F86739A4}</Project>
<Name>CUEToolsLib</Name> <Name>CUETools.Processor</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

View File

@@ -34,7 +34,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libwavpack", "..\wavpack-4.
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArCueDotNet", "..\ArCueDotNet\ArCueDotNet.csproj", "{A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArCueDotNet", "..\ArCueDotNet\ArCueDotNet.csproj", "{A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUEToolsLib", "..\CUEToolsLib\CUEToolsLib.csproj", "{4911BD82-49EF-4858-8B51-5394F86739A4}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Processor", "..\CUEToolsLib\CUETools.Processor.csproj", "{4911BD82-49EF-4858-8B51-5394F86739A4}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{9AE965C4-301E-4C01-B90F-297AF341ACC6} = {9AE965C4-301E-4C01-B90F-297AF341ACC6} {9AE965C4-301E-4C01-B90F-297AF341ACC6} = {9AE965C4-301E-4C01-B90F-297AF341ACC6}
{CC2E74B6-534A-43D8-9F16-AC03FE955000} = {CC2E74B6-534A-43D8-9F16-AC03FE955000} {CC2E74B6-534A-43D8-9F16-AC03FE955000} = {CC2E74B6-534A-43D8-9F16-AC03FE955000}
@@ -43,13 +43,13 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUEToolsLib", "..\CUEToolsL
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HDCDDotNet", "..\HDCDDotNet\HDCDDotNet.csproj", "{32338A04-5B6B-4C63-8EE7-C6400F73B5D7}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HDCDDotNet", "..\HDCDDotNet\HDCDDotNet.csproj", "{32338A04-5B6B-4C63-8EE7-C6400F73B5D7}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AudioCodecsDotNet", "..\AudioCodecsDotNet\AudioCodecsDotNet.csproj", "{6458A13A-30EF-45A9-9D58-E5031B17BEE2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Codecs", "..\AudioCodecsDotNet\CUETools.Codecs.csproj", "{6458A13A-30EF-45A9-9D58-E5031B17BEE2}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ALACDotNet", "..\ALACDotNet\ALACDotNet.csproj", "{F2EC7193-D5E5-4252-9803-5CEB407E910F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Codecs.ALAC", "..\ALACDotNet\CUETools.Codecs.ALAC.csproj", "{F2EC7193-D5E5-4252-9803-5CEB407E910F}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnRarDotNet", "..\UnRarDotNet\UnRarDotNet.csproj", "{8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnRarDotNet", "..\UnRarDotNet\UnRarDotNet.csproj", "{8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LossyWAVDotNet", "..\LossyWAVDotNet\LossyWAVDotNet.csproj", "{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Codecs.LossyWAV", "..\LossyWAVDotNet\CUETools.Codecs.LossyWAV.csproj", "{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LossyWAVSharp", "..\LossyWAVSharp\LossyWAVSharp.csproj", "{A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LossyWAVSharp", "..\LossyWAVSharp\LossyWAVSharp.csproj", "{A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}"
EndProject EndProject
@@ -63,10 +63,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bwg.Scsi", "..\Bwg.Scsi\Bwg
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Ripper.SCSI", "..\CUETools.Ripper.SCSI\CUETools.Ripper.SCSI.csproj", "{8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Ripper.SCSI", "..\CUETools.Ripper.SCSI\CUETools.Ripper.SCSI.csproj", "{8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.ConsoleRipper", "..\CUETools.Ripper.Console\CUETools.ConsoleRipper.csproj", "{9253A314-1821-42BF-B02F-2BF986B1765D}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUERipper", "..\CUETools.Ripper.Console\CUERipper.csproj", "{9253A314-1821-42BF-B02F-2BF986B1765D}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConsoleApps", "ConsoleApps", "{4B59E09C-A51F-4B80-91BE-987904DCEF7D}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConsoleApps", "ConsoleApps", "{4B59E09C-A51F-4B80-91BE-987904DCEF7D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.CDImage", "..\CUETools.CDImage\CUETools.CDImage.csproj", "{1DD41038-D885-46C5-8DDE-E0B82F066584}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.AccurateRip", "..\CUETools.AccurateRip\CUETools.AccurateRip.csproj", "{5802C7E9-157E-4124-946D-70B5AE48A5A1}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -314,6 +318,30 @@ Global
{9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x64.Build.0 = Release|x64 {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x64.Build.0 = Release|x64
{9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x86.ActiveCfg = Release|x86 {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x86.ActiveCfg = Release|x86
{9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x86.Build.0 = Release|x86 {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x86.Build.0 = Release|x86
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|x64.ActiveCfg = Debug|x64
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|x64.Build.0 = Debug|x64
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|x86.ActiveCfg = Debug|x86
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|x86.Build.0 = Debug|x86
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|Any CPU.Build.0 = Release|Any CPU
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|x64.ActiveCfg = Release|x64
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|x64.Build.0 = Release|x64
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|x86.ActiveCfg = Release|x86
{1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|x86.Build.0 = Release|x86
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|x64.ActiveCfg = Debug|x64
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|x64.Build.0 = Debug|x64
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|x86.ActiveCfg = Debug|x86
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|x86.Build.0 = Debug|x86
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|Any CPU.Build.0 = Release|Any CPU
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|x64.ActiveCfg = Release|x64
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|x64.Build.0 = Release|x64
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|x86.ActiveCfg = Release|x86
{5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|x86.Build.0 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -7,7 +7,7 @@ using System.Windows.Forms;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using System.Diagnostics; using System.Diagnostics;
using CUEToolsLib; using CUETools.Processor;
namespace JDP namespace JDP
{ {

View File

@@ -33,7 +33,7 @@ using System.Windows.Forms;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using System.Diagnostics; using System.Diagnostics;
using CUEToolsLib; using CUETools.Processor;
namespace JDP { namespace JDP {
public partial class frmCUETools : Form { public partial class frmCUETools : Form {

View File

@@ -6,7 +6,7 @@ using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using CUEToolsLib; using CUETools.Processor;
namespace JDP { namespace JDP {
public partial class frmFilenameCorrector : Form { public partial class frmFilenameCorrector : Form {

View File

@@ -4,7 +4,7 @@ using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
using CUEToolsLib; using CUETools.Processor;
namespace JDP { namespace JDP {
public partial class frmSettings : Form { public partial class frmSettings : Form {

View File

@@ -3,13 +3,14 @@ using System.IO;
using FLACDotNet; using FLACDotNet;
using WavPackDotNet; using WavPackDotNet;
using APEDotNet; using APEDotNet;
using ALACDotNet; using CUETools.Codecs;
using LossyWAVDotNet; using CUETools.Codecs.ALAC;
using AudioCodecsDotNet; using CUETools.Codecs.LossyWAV;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
namespace CUEToolsLib { namespace CUETools.Processor
{
public static class AudioReadWrite { public static class AudioReadWrite {
public static IAudioSource GetAudioSource(string path, Stream IO, string extension) public static IAudioSource GetAudioSource(string path, Stream IO, string extension)
{ {

View File

@@ -7,8 +7,8 @@
<ProjectGuid>{4911BD82-49EF-4858-8B51-5394F86739A4}</ProjectGuid> <ProjectGuid>{4911BD82-49EF-4858-8B51-5394F86739A4}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CUEToolsLib</RootNamespace> <RootNamespace>CUETools.Processor</RootNamespace>
<AssemblyName>CUEToolsLib</AssemblyName> <AssemblyName>CUETools.Processor</AssemblyName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@@ -89,17 +89,25 @@
<Compile Include="Settings.cs" /> <Compile Include="Settings.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ALACDotNet\ALACDotNet.csproj"> <ProjectReference Include="..\ALACDotNet\CUETools.Codecs.ALAC.csproj">
<Project>{F2EC7193-D5E5-4252-9803-5CEB407E910F}</Project> <Project>{F2EC7193-D5E5-4252-9803-5CEB407E910F}</Project>
<Name>ALACDotNet</Name> <Name>CUETools.Codecs.ALAC</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\APEDotNet\APEDotNet.vcproj"> <ProjectReference Include="..\APEDotNet\APEDotNet.vcproj">
<Project>{9AE965C4-301E-4C01-B90F-297AF341ACC6}</Project> <Project>{9AE965C4-301E-4C01-B90F-297AF341ACC6}</Project>
<Name>APEDotNet</Name> <Name>APEDotNet</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\AudioCodecsDotNet\AudioCodecsDotNet.csproj"> <ProjectReference Include="..\AudioCodecsDotNet\CUETools.Codecs.csproj">
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project> <Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
<Name>AudioCodecsDotNet</Name> <Name>CUETools.Codecs</Name>
</ProjectReference>
<ProjectReference Include="..\CUETools.AccurateRip\CUETools.AccurateRip.csproj">
<Project>{5802C7E9-157E-4124-946D-70B5AE48A5A1}</Project>
<Name>CUETools.AccurateRip</Name>
</ProjectReference>
<ProjectReference Include="..\CUETools.CDImage\CUETools.CDImage.csproj">
<Project>{1DD41038-D885-46C5-8DDE-E0B82F066584}</Project>
<Name>CUETools.CDImage</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\FLACDotNet\FLACDotNet.vcproj"> <ProjectReference Include="..\FLACDotNet\FLACDotNet.vcproj">
<Project>{E70FA90A-7012-4A52-86B5-362B699D1540}</Project> <Project>{E70FA90A-7012-4A52-86B5-362B699D1540}</Project>
@@ -109,9 +117,9 @@
<Project>{32338A04-5B6B-4C63-8EE7-C6400F73B5D7}</Project> <Project>{32338A04-5B6B-4C63-8EE7-C6400F73B5D7}</Project>
<Name>HDCDDotNet</Name> <Name>HDCDDotNet</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\LossyWAVDotNet\LossyWAVDotNet.csproj"> <ProjectReference Include="..\LossyWAVDotNet\CUETools.Codecs.LossyWAV.csproj">
<Project>{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}</Project> <Project>{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}</Project>
<Name>LossyWAVDotNet</Name> <Name>CUETools.Codecs.LossyWAV</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\UnRarDotNet\UnRarDotNet.csproj"> <ProjectReference Include="..\UnRarDotNet\UnRarDotNet.csproj">
<Project>{8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}</Project> <Project>{8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}</Project>

View File

@@ -29,17 +29,17 @@ using System.Net;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Threading; using System.Threading;
using System.Xml; using System.Xml;
using AudioCodecsDotNet;
using HDCDDotNet; using HDCDDotNet;
using LossyWAVDotNet; using CUETools.Codecs;
using CUETools.Codecs.LossyWAV;
using CUETools.CDImage;
using CUETools.AccurateRip;
#if !MONO #if !MONO
using UnRarDotNet; using UnRarDotNet;
using FLACDotNet; using FLACDotNet;
using APEDotNet;
using WavPackDotNet;
#endif #endif
namespace CUEToolsLib namespace CUETools.Processor
{ {
public enum OutputAudioFormat public enum OutputAudioFormat
@@ -65,32 +65,6 @@ namespace CUEToolsLib
return ".wav"; return ".wav";
} }
public static int TimeFromString(string s) {
string[] n = s.Split(':');
if (n.Length != 3) {
throw new Exception("Invalid timestamp.");
}
int min, sec, frame;
min = Int32.Parse(n[0]);
sec = Int32.Parse(n[1]);
frame = Int32.Parse(n[2]);
return frame + (sec * 75) + (min * 60 * 75);
}
public static string TimeToString(uint t) {
uint min, sec, frame;
frame = t % 75;
t /= 75;
sec = t % 60;
t /= 60;
min = t;
return String.Format("{0:00}:{1:00}:{2:00}", min, sec, frame);
}
public static CUELine FindCUELine(List<CUELine> list, string command) { public static CUELine FindCUELine(List<CUELine> list, string command) {
command = command.ToUpper(); command = command.ToUpper();
foreach (CUELine line in list) { foreach (CUELine line in list) {
@@ -444,8 +418,6 @@ namespace CUEToolsLib
private string _eacLog; private string _eacLog;
private string _cuePath; private string _cuePath;
private NameValueCollection _albumTags; private NameValueCollection _albumTags;
private List<AccDisk> accDisks;
private HttpStatusCode accResult;
private const int _arOffsetRange = 5 * 588 - 1; private const int _arOffsetRange = 5 * 588 - 1;
private HDCDDotNet.HDCDDotNet hdcdDecoder; private HDCDDotNet.HDCDDotNet hdcdDecoder;
private bool _outputLossyWAV = false; private bool _outputLossyWAV = false;
@@ -457,6 +429,7 @@ namespace CUEToolsLib
private string _archivePath; private string _archivePath;
private string _archivePassword; private string _archivePassword;
private CUEToolsProgressEventArgs _progress; private CUEToolsProgressEventArgs _progress;
private AccurateRipVerify _arVerify;
public event ArchivePasswordRequiredHandler PasswordRequired; public event ArchivePasswordRequiredHandler PasswordRequired;
public event CUEToolsProgressHandler CUEToolsProgress; public event CUEToolsProgressHandler CUEToolsProgress;
@@ -467,6 +440,7 @@ namespace CUEToolsLib
_progress = new CUEToolsProgressEventArgs(); _progress = new CUEToolsProgressEventArgs();
_attributes = new List<CUELine>(); _attributes = new List<CUELine>();
_tracks = new List<TrackInfo>(); _tracks = new List<TrackInfo>();
_toc = new CDImageLayout(0);
_sources = new List<SourceInfo>(); _sources = new List<SourceInfo>();
_sourcePaths = new List<string>(); _sourcePaths = new List<string>();
_albumTags = new NameValueCollection(); _albumTags = new NameValueCollection();
@@ -484,7 +458,6 @@ namespace CUEToolsLib
hdcdDecoder = null; hdcdDecoder = null;
_hasEmbeddedCUESheet = false; _hasEmbeddedCUESheet = false;
_isArchive = false; _isArchive = false;
accDisks = new List<AccDisk>();
} }
public void Open(string pathIn, bool outputLossyWAV) public void Open(string pathIn, bool outputLossyWAV)
@@ -499,8 +472,9 @@ namespace CUEToolsLib
string cueDir, lineStr, command, pathAudio = null, fileType; string cueDir, lineStr, command, pathAudio = null, fileType;
CUELine line; CUELine line;
TrackInfo trackInfo; TrackInfo trackInfo;
int tempTimeLength, timeRelativeToFileStart, absoluteFileStartTime; int timeRelativeToFileStart, absoluteFileStartTime;
int fileTimeLengthSamples, fileTimeLengthFrames, i, trackNumber; int fileTimeLengthSamples, fileTimeLengthFrames, i;
int trackNumber = 0;
bool seenFirstFileIndex = false, seenDataTrack = false; bool seenFirstFileIndex = false, seenDataTrack = false;
List<IndexInfo> indexes = new List<IndexInfo>(); List<IndexInfo> indexes = new List<IndexInfo>();
IndexInfo indexInfo; IndexInfo indexInfo;
@@ -512,8 +486,6 @@ namespace CUEToolsLib
absoluteFileStartTime = 0; absoluteFileStartTime = 0;
fileTimeLengthSamples = 0; fileTimeLengthSamples = 0;
fileTimeLengthFrames = 0; fileTimeLengthFrames = 0;
trackNumber = 0;
TextReader sr; TextReader sr;
if (Directory.Exists(pathIn)) if (Directory.Exists(pathIn))
@@ -654,19 +626,20 @@ namespace CUEToolsLib
throw new Exception("Audio tracks cannot appear after data tracks."); throw new Exception("Audio tracks cannot appear after data tracks.");
} }
else { else {
trackNumber = Int32.Parse(line.Params[1]); trackNumber = int.Parse(line.Params[1]);
if (trackNumber != _tracks.Count + 1) { if (trackNumber != _tracks.Count + 1) {
throw new Exception("Invalid track number."); throw new Exception("Invalid track number.");
} }
trackInfo = new TrackInfo(); trackInfo = new TrackInfo();
_tracks.Add(trackInfo); _tracks.Add(trackInfo);
_toc.AddTrack(new CDTrack((uint)trackNumber, 0, 0, true));
} }
} }
else if (seenDataTrack) { else if (seenDataTrack) {
// Ignore lines belonging to data tracks // Ignore lines belonging to data tracks
} }
else if (command == "INDEX") { else if (command == "INDEX") {
timeRelativeToFileStart = General.TimeFromString(line.Params[2]); timeRelativeToFileStart = CDImageLayout.TimeFromString(line.Params[2]);
if (!seenFirstFileIndex) if (!seenFirstFileIndex)
{ {
if (timeRelativeToFileStart != 0) if (timeRelativeToFileStart != 0)
@@ -698,16 +671,16 @@ namespace CUEToolsLib
if (seenFirstFileIndex) { if (seenFirstFileIndex) {
throw new Exception("Pregap must occur at the beginning of a file."); throw new Exception("Pregap must occur at the beginning of a file.");
} }
tempTimeLength = General.TimeFromString(line.Params[1]); int pregapLength = CDImageLayout.TimeFromString(line.Params[1]);
indexInfo.Track = trackNumber; indexInfo.Track = trackNumber;
indexInfo.Index = 0; indexInfo.Index = 0;
indexInfo.Time = absoluteFileStartTime; indexInfo.Time = absoluteFileStartTime;
indexes.Add(indexInfo); indexes.Add(indexInfo);
sourceInfo.Path = null; sourceInfo.Path = null;
sourceInfo.Offset = 0; sourceInfo.Offset = 0;
sourceInfo.Length = (uint) tempTimeLength * 588; sourceInfo.Length = (uint)pregapLength * 588;
_sources.Add(sourceInfo); _sources.Add(sourceInfo);
absoluteFileStartTime += tempTimeLength; absoluteFileStartTime += pregapLength;
} }
else if (command == "POSTGAP") { else if (command == "POSTGAP") {
throw new Exception("POSTGAP command isn't supported."); throw new Exception("POSTGAP command isn't supported.");
@@ -723,7 +696,7 @@ namespace CUEToolsLib
(line.Params.Count == 3) && (line.Params.Count == 3) &&
(line.Params[1].ToUpper() == "DATATRACKLENGTH")) (line.Params[1].ToUpper() == "DATATRACKLENGTH"))
{ {
_dataTrackLength = (uint)General.TimeFromString(line.Params[2]); _dataTrackLength = (uint)CDImageLayout.TimeFromString(line.Params[2]);
} }
else if ((command == "REM") && else if ((command == "REM") &&
(line.Params.Count == 3) && (line.Params.Count == 3) &&
@@ -770,22 +743,20 @@ namespace CUEToolsLib
indexes.Add(indexInfo); indexes.Add(indexInfo);
// Calculate the length of each index // Calculate the length of each index
for (i = 0; i < indexes.Count - 1; i++) { for (i = 0; i < indexes.Count - 1; i++)
indexInfo = indexes[i]; {
int length = indexes[i + 1].Time - indexes[i].Time;
tempTimeLength = indexes[i + 1].Time - indexInfo.Time; if (length < 0)
if (tempTimeLength > 0) {
_tracks[indexInfo.Track - 1].AddIndex((indexInfo.Index == 0), (uint) tempTimeLength);
}
else if (tempTimeLength < 0) {
throw new Exception("Indexes must be in chronological order."); throw new Exception("Indexes must be in chronological order.");
_toc[indexes[i].Track].AddIndex(new CDTrackIndex((uint)indexes[i].Index, (uint)indexes[i].Time, (uint)length));
} }
} _toc.Length = (uint) indexes[indexes.Count - 1].Time;
for (i = 1; i <= TrackCount; i++)
for (i = 0; i < TrackCount; i++) { {
if (_tracks[i].LastIndex < 1) { if (_toc[i].LastIndex < 1)
throw new Exception("Track must have an INDEX 01."); throw new Exception("Track must have an INDEX 01.");
} _toc[i].Start = _toc[i][1].Start;
_toc[i].Length = (i == TrackCount ? _toc.Length - _toc[i].Start : _toc[i+1][1].Start - _toc[i].Start);
} }
// Store the audio filenames, generating generic names if necessary // Store the audio filenames, generating generic names if necessary
@@ -881,6 +852,9 @@ namespace CUEToolsLib
if (_accurateRipId == null) if (_accurateRipId == null)
_accurateRipId = _accurateRipIdActual; _accurateRipId = _accurateRipIdActual;
} }
_arVerify = new AccurateRipVerify(_toc);
//if (!_dataTrackLength.HasValue && _cddbDiscIdTag != null) //if (!_dataTrackLength.HasValue && _cddbDiscIdTag != null)
//{ //{
// uint cddbDiscIdNum = UInt32.Parse(_cddbDiscIdTag, NumberStyles.HexNumber); // uint cddbDiscIdNum = UInt32.Parse(_cddbDiscIdTag, NumberStyles.HexNumber);
@@ -1131,7 +1105,7 @@ namespace CUEToolsLib
{ {
int iTrack; int iTrack;
bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA && bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA &&
(_tracks[0].IndexLengths[0] != 0)); (_toc.Pregap != 0));
if (htoaToFile) { if (htoaToFile) {
WriteLine(sw, 0, _htoaFilename); WriteLine(sw, 0, _htoaFilename);
@@ -1150,14 +1124,8 @@ namespace CUEToolsLib
public void WriteTOC(TextWriter sw) public void WriteTOC(TextWriter sw)
{ {
uint trackOffset = 150;
for (int iTrack = 0; iTrack < TrackCount; iTrack++) for (int iTrack = 0; iTrack < TrackCount; iTrack++)
{ WriteLine(sw, 0, "\t" + _toc[iTrack+1].Start + 150);
trackOffset += _tracks[iTrack].IndexLengths[0];
WriteLine(sw, 0, "\t" + trackOffset);
for (int iIndex = 1; iIndex <= _tracks[iTrack].LastIndex; iIndex++)
trackOffset += _tracks[iTrack].IndexLengths[iIndex];
}
} }
public void Write(string path, CUEStyle style) { public void Write(string path, CUEStyle style) {
@@ -1174,7 +1142,7 @@ namespace CUEToolsLib
int i, iTrack, iIndex; int i, iTrack, iIndex;
TrackInfo track; TrackInfo track;
bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA && bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA &&
(_tracks[0].IndexLengths[0] != 0)); (_toc.Pregap != 0));
uint timeRelativeToFileStart = 0; uint timeRelativeToFileStart = 0;
@@ -1200,7 +1168,7 @@ namespace CUEToolsLib
if ((style == CUEStyle.GapsPrepended) || if ((style == CUEStyle.GapsPrepended) ||
(style == CUEStyle.GapsLeftOut) || (style == CUEStyle.GapsLeftOut) ||
((style == CUEStyle.GapsAppended) && ((style == CUEStyle.GapsAppended) &&
((track.IndexLengths[0] == 0) || ((iTrack == 0) && !htoaToFile))) ) ((_toc[iTrack+1].Pregap == 0) || ((iTrack == 0) && !htoaToFile))))
{ {
WriteLine(sw, 0, String.Format("FILE \"{0}\" WAVE", _trackFilenames[iTrack])); WriteLine(sw, 0, String.Format("FILE \"{0}\" WAVE", _trackFilenames[iTrack]));
timeRelativeToFileStart = 0; timeRelativeToFileStart = 0;
@@ -1211,19 +1179,19 @@ namespace CUEToolsLib
WriteLine(sw, 2, track.Attributes[i]); WriteLine(sw, 2, track.Attributes[i]);
} }
for (iIndex = 0; iIndex <= track.LastIndex; iIndex++) { for (iIndex = 0; iIndex <= _toc[iTrack+1].LastIndex; iIndex++) {
if (track.IndexLengths[iIndex] != 0) { if (_toc[iTrack+1][iIndex].Length != 0) {
if ((iIndex == 0) && if ((iIndex == 0) &&
((style == CUEStyle.GapsLeftOut) || ((style == CUEStyle.GapsLeftOut) ||
((style == CUEStyle.GapsAppended) && (iTrack == 0) && !htoaToFile) || ((style == CUEStyle.GapsAppended) && (iTrack == 0) && !htoaToFile) ||
((style == CUEStyle.SingleFile || style == CUEStyle.SingleFileWithCUE) && (iTrack == 0) && _usePregapForFirstTrackInSingleFile))) ((style == CUEStyle.SingleFile || style == CUEStyle.SingleFileWithCUE) && (iTrack == 0) && _usePregapForFirstTrackInSingleFile)))
{ {
WriteLine(sw, 2, "PREGAP " + General.TimeToString(track.IndexLengths[iIndex])); WriteLine(sw, 2, "PREGAP " + CDImageLayout.TimeToString(_toc[iTrack + 1][iIndex].Length));
} }
else { else {
WriteLine(sw, 2, String.Format( "INDEX {0:00} {1}", iIndex, WriteLine(sw, 2, String.Format( "INDEX {0:00} {1}", iIndex,
General.TimeToString(timeRelativeToFileStart) )); CDImageLayout.TimeToString(timeRelativeToFileStart)));
timeRelativeToFileStart += track.IndexLengths[iIndex]; timeRelativeToFileStart += _toc[iTrack + 1][iIndex].Length;
if ((style == CUEStyle.GapsAppended) && (iIndex == 0)) { if ((style == CUEStyle.GapsAppended) && (iIndex == 0)) {
WriteLine(sw, 0, String.Format("FILE \"{0}\" WAVE", _trackFilenames[iTrack])); WriteLine(sw, 0, String.Format("FILE \"{0}\" WAVE", _trackFilenames[iTrack]));
@@ -1246,10 +1214,6 @@ namespace CUEToolsLib
} }
return r; return r;
} }
private uint readIntLE(byte[] data, int pos)
{
return (uint) (data[pos] + ( data[pos+1] << 8 ) + ( data[pos+2] << 16 ) + ( data[pos+3] << 24) );
}
private string CalculateAccurateRipId () private string CalculateAccurateRipId ()
{ {
@@ -1257,20 +1221,14 @@ namespace CUEToolsLib
uint discId1 = 0; uint discId1 = 0;
uint discId2 = 0; uint discId2 = 0;
uint cddbDiscId = 0; uint cddbDiscId = 0;
uint trackOffset = 0;
for (int iTrack = 0; iTrack < TrackCount; iTrack++) for (int iTrack = 1; iTrack <= _toc.TrackCount; iTrack++)
{ {
TrackInfo track = _tracks[iTrack]; discId1 += _toc[iTrack].Start;
discId2 += (_toc[iTrack].Start == 0 ? 1 : _toc[iTrack].Start) * ((uint)iTrack);
trackOffset += track.IndexLengths[0]; cddbDiscId += sumDigits(_toc[iTrack].Start / 75 + 2);
discId1 += trackOffset;
discId2 += (trackOffset == 0 ? 1 : trackOffset) * ((uint)iTrack + 1);
cddbDiscId += sumDigits((uint)(trackOffset / 75) + 2);
for (int iIndex = 1; iIndex <= track.LastIndex; iIndex++)
trackOffset += track.IndexLengths[iIndex];
} }
uint trackOffset = _toc.Length;
if (_dataTrackLength.HasValue) if (_dataTrackLength.HasValue)
{ {
trackOffset += ((90 + 60) * 75) + 150; // 90 second lead-out, 60 second lead-in, 150 sector gap trackOffset += ((90 + 60) * 75) + 150; // 90 second lead-out, 60 second lead-in, 150 sector gap
@@ -1286,12 +1244,12 @@ namespace CUEToolsLib
if ((cddbDiscIdNum & 0xff) == TrackCount + 1) if ((cddbDiscIdNum & 0xff) == TrackCount + 1)
{ {
uint lengthFromTag = ((cddbDiscIdNum >> 8) & 0xffff); uint lengthFromTag = ((cddbDiscIdNum >> 8) & 0xffff);
_minDataTrackLength = ((lengthFromTag + (uint)(_tracks[0].IndexLengths[0] / 75)) - 152) * 75 - trackOffset; _minDataTrackLength = ((lengthFromTag + _toc[1].Start / 75) - 152) * 75 - trackOffset;
} }
} }
cddbDiscId = ((cddbDiscId % 255) << 24) + cddbDiscId = ((cddbDiscId % 255) << 24) +
(((uint)(trackOffset / 75) - (uint)(_tracks[0].IndexLengths[0] / 75)) << 8) + ((trackOffset / 75 - _toc[1].Start / 75) << 8) +
(uint)(TrackCount + (_dataTrackLength.HasValue ? 1 : 0)); (uint)(TrackCount + (_dataTrackLength.HasValue ? 1 : 0));
discId1 &= 0xFFFFFFFF; discId1 &= 0xFFFFFFFF;
@@ -1301,112 +1259,14 @@ namespace CUEToolsLib
return String.Format("{0:x8}-{1:x8}-{2:x8}", discId1, discId2, cddbDiscId); return String.Format("{0:x8}-{1:x8}-{2:x8}", discId1, discId2, cddbDiscId);
} }
public void ContactAccurateRip()
{
// Calculate the three disc ids used by AR
uint discId1 = 0;
uint discId2 = 0;
uint cddbDiscId = 0;
string[] n = _accurateRipId.Split('-');
if (n.Length != 3) {
throw new Exception("Invalid accurateRipId.");
}
discId1 = UInt32.Parse(n[0], NumberStyles.HexNumber);
discId2 = UInt32.Parse(n[1], NumberStyles.HexNumber);
cddbDiscId = UInt32.Parse(n[2], NumberStyles.HexNumber);
string url = String.Format("http://www.accuraterip.com/accuraterip/{0:x}/{1:x}/{2:x}/dBAR-{3:d3}-{4:x8}-{5:x8}-{6:x8}.bin",
discId1 & 0xF, discId1>>4 & 0xF, discId1>>8 & 0xF, TrackCount, discId1, discId2, cddbDiscId);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
try
{
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
accResult = resp.StatusCode;
if (accResult == HttpStatusCode.OK)
{
// Retrieve response stream and wrap in StreamReader
Stream respStream = resp.GetResponseStream();
// Allocate byte buffer to hold stream contents
byte [] urlData = new byte[13];
int urlDataLen, bytesRead;
accDisks.Clear();
while ( true )
{
for (urlDataLen = 0; urlDataLen < 13; urlDataLen += bytesRead)
{
bytesRead = respStream.Read(urlData, urlDataLen, 13 - urlDataLen);
if (0 == bytesRead)
break;
}
if (urlDataLen == 0)
break;
if (urlDataLen < 13)
{
accResult = HttpStatusCode.PartialContent;
return;
}
AccDisk dsk = new AccDisk();
dsk.count = urlData[0];
dsk.discId1 = readIntLE(urlData, 1);
dsk.discId2 = readIntLE(urlData, 5);
dsk.cddbDiscId = readIntLE(urlData, 9);
for (int i = 0; i < dsk.count; i++)
{
for (urlDataLen = 0; urlDataLen < 9; urlDataLen += bytesRead)
{
bytesRead = respStream.Read(urlData, urlDataLen, 9 - urlDataLen);
if (0 == bytesRead)
{
accResult = HttpStatusCode.PartialContent;
return;
}
}
AccTrack trk = new AccTrack();
trk.count = urlData[0];
trk.CRC = readIntLE(urlData, 1);
trk.Frame450CRC = readIntLE(urlData, 5);
dsk.tracks.Add(trk);
}
accDisks.Add(dsk);
}
respStream.Close();
}
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
accResult = ((HttpWebResponse)ex.Response).StatusCode;
else
accResult = HttpStatusCode.BadRequest;
}
}
private void CalculateMusicBrainzDiscID() { private void CalculateMusicBrainzDiscID() {
StringBuilder mbSB = new StringBuilder(); StringBuilder mbSB = new StringBuilder();
byte[] hashBytes; mbSB.AppendFormat("{0:X2}{1:X2}{2:X8}", 1, TrackCount, _toc.Length + 150);
uint trackOffset = 150; for (int iTrack = 1; iTrack <= _toc.TrackCount; iTrack++)
mbSB.AppendFormat("{0:X8}", _toc[iTrack].Start + 150);
for (int iTrack = 0; iTrack < TrackCount; iTrack++) {
TrackInfo track = _tracks[iTrack];
trackOffset += track.IndexLengths[0];
mbSB.AppendFormat("{0:X8}", trackOffset);
for (int iIndex = 1; iIndex <= track.LastIndex; iIndex++)
trackOffset += track.IndexLengths[iIndex];
}
mbSB.Insert(0, String.Format("{0:X2}{1:X2}{2:X8}", 1, TrackCount, trackOffset));
mbSB.Append(new string('0', (99 - TrackCount) * 8)); mbSB.Append(new string('0', (99 - TrackCount) * 8));
hashBytes = (new SHA1CryptoServiceProvider()).ComputeHash(Encoding.ASCII.GetBytes(mbSB.ToString())); byte[] hashBytes = (new SHA1CryptoServiceProvider()).ComputeHash(Encoding.ASCII.GetBytes(mbSB.ToString()));
_mbDiscId = Convert.ToBase64String(hashBytes).Replace('+', '.').Replace('/', '_').Replace('=', '-'); _mbDiscId = Convert.ToBase64String(hashBytes).Replace('+', '.').Replace('/', '_').Replace('=', '-');
System.Diagnostics.Debug.WriteLine(_mbDiscId); System.Diagnostics.Debug.WriteLine(_mbDiscId);
} }
@@ -1506,160 +1366,18 @@ namespace CUEToolsLib
} }
} }
unsafe private void CalculateAccurateRipCRCsSemifast(int* samples, uint count, int iTrack, uint currentOffset, uint previousOffset, uint trackLength)
{
fixed (uint* CRCsA = iTrack != 0 ? _tracks[iTrack - 1].OffsetedCRC : null,
CRCsB = _tracks[iTrack].OffsetedCRC,
CRCsC = iTrack != TrackCount - 1 ? _tracks[iTrack + 1].OffsetedCRC : null)
{
for (uint si = 0; si < count; si++)
{
uint sampleValue = (uint) ((samples[2 * si] & 0xffff) + (samples[2 * si + 1] << 16));
int i;
int iB = Math.Max(0, _arOffsetRange - (int)(currentOffset + si));
int iC = Math.Min(2 * _arOffsetRange + 1, _arOffsetRange + (int)trackLength - (int)(currentOffset + si));
uint baseSumA = sampleValue * (uint)(previousOffset + 1 - iB);
for (i = 0; i < iB; i++)
{
CRCsA[i] += baseSumA;
baseSumA += sampleValue;
}
uint baseSumB = sampleValue * (uint)Math.Max(1, (int)(currentOffset + si) - _arOffsetRange + 1);
for (i = iB; i < iC; i++)
{
CRCsB[i] += baseSumB;
baseSumB += sampleValue;
}
uint baseSumC = sampleValue;
for (i = iC; i <= 2 * _arOffsetRange; i++)
{
CRCsC[i] += baseSumC;
baseSumC += sampleValue;
}
}
return;
}
}
unsafe private void CalculateAccurateRipCRCs(int* samples, uint count, int iTrack, uint currentOffset, uint previousOffset, uint trackLength)
{
for (int si = 0; si < count; si++)
{
uint sampleValue = (uint)((samples[2 * si] & 0xffff) + (samples[2 * si + 1] << 16));
for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++)
{
int iTrack2 = iTrack;
int currentOffset2 = (int)currentOffset + si - oi;
if (currentOffset2 < 5 * 588 - 1 && iTrack == 0)
// we are in the skipped area at the start of the disk
{
continue;
}
else if (currentOffset2 < 0)
// offset takes us to previous track
{
iTrack2--;
currentOffset2 += (int)previousOffset;
}
else if (currentOffset2 >= trackLength - 5 * 588 && iTrack == TrackCount - 1)
// we are in the skipped area at the end of the disc
{
continue;
}
else if (currentOffset2 >= trackLength)
// offset takes us to the next track
{
iTrack2++;
currentOffset2 -= (int)trackLength;
}
_tracks[iTrack2].OffsetedCRC[_arOffsetRange - oi] += sampleValue * (uint) (currentOffset2 + 1);
}
}
}
unsafe private void CalculateAccurateRipCRCsFast(int* samples, uint count, int iTrack, uint currentOffset)
{
int s1 = (int) Math.Min(count, Math.Max(0, 450 * 588 - _arOffsetRange - (int)currentOffset));
int s2 = (int) Math.Min(count, Math.Max(0, 451 * 588 + _arOffsetRange - (int)currentOffset));
if ( s1 < s2 )
fixed (uint* FrameCRCs = _tracks[iTrack].OffsetedFrame450CRC)
for (int sj = s1; sj < s2; sj++)
{
int magicFrameOffset = (int)currentOffset + sj - 450 * 588 + 1;
int firstOffset = Math.Max(-_arOffsetRange, magicFrameOffset - 588);
int lastOffset = Math.Min(magicFrameOffset - 1, _arOffsetRange);
uint sampleValue = (uint)((samples[2 * sj] & 0xffff) + (samples[2 * sj + 1] << 16));
for (int oi = firstOffset; oi <= lastOffset; oi++)
FrameCRCs[_arOffsetRange - oi] += sampleValue * (uint)(magicFrameOffset - oi);
}
fixed (uint* CRCs = _tracks[iTrack].OffsetedCRC)
{
uint baseSum = 0, stepSum = 0;
currentOffset += (uint) _arOffsetRange + 1;
for (uint si = 0; si < count; si++)
{
uint sampleValue = (uint)((samples[2 * si] & 0xffff) + (samples[2 * si + 1] << 16));
stepSum += sampleValue;
baseSum += sampleValue * (uint)(currentOffset + si);
}
for (int i = 2 * _arOffsetRange; i >= 0; i--)
{
CRCs[i] += baseSum;
baseSum -= stepSum;
}
}
}
public void GenerateAccurateRipLog(TextWriter sw, int oi)
{
for (int iTrack = 0; iTrack < TrackCount; iTrack++)
{
uint count = 0;
uint partials = 0;
uint conf = 0;
string pressings = "";
string partpressings = "";
for (int di = 0; di < (int)accDisks.Count; di++)
{
count += accDisks[di].tracks[iTrack].count;
if (_tracks[iTrack].OffsetedCRC[_arOffsetRange - oi] == accDisks[di].tracks[iTrack].CRC)
{
conf += accDisks[di].tracks[iTrack].count;
if (pressings != "")
pressings = pressings + ",";
pressings = pressings + (di + 1).ToString();
}
if (_tracks[iTrack].OffsetedFrame450CRC[_arOffsetRange - oi] == accDisks[di].tracks[iTrack].Frame450CRC)
{
partials += accDisks[di].tracks[iTrack].count;
if (partpressings != "")
partpressings = partpressings + ",";
partpressings = partpressings + (di + 1).ToString();
}
}
if (conf > 0)
sw.WriteLine(String.Format(" {0:00}\t[{1:x8}] ({3:00}/{2:00}) Accurately ripped as in pressing(s) #{4}", iTrack + 1, _tracks[iTrack].OffsetedCRC[_arOffsetRange - oi], count, conf, pressings));
else if (partials > 0)
sw.WriteLine(String.Format(" {0:00}\t[{1:x8}] ({3:00}/{2:00}) Partial match to pressing(s) #{4} ", iTrack + 1, _tracks[iTrack].OffsetedCRC[_arOffsetRange - oi], count, partials, partpressings));
else
sw.WriteLine(String.Format(" {0:00}\t[{1:x8}] (00/{2:00}) No matches", iTrack + 1, _tracks[iTrack].OffsetedCRC[_arOffsetRange - oi], count));
}
}
public void GenerateAccurateRipLog(TextWriter sw) public void GenerateAccurateRipLog(TextWriter sw)
{ {
int iTrack; int iTrack;
sw.WriteLine (String.Format("[Disc ID: {0}]", _accurateRipId)); sw.WriteLine (String.Format("[Disc ID: {0}]", _accurateRipId));
if (_dataTrackLength.HasValue) if (_dataTrackLength.HasValue)
sw.WriteLine("Assuming a data track was present, length {0}.", General.TimeToString(_dataTrackLength.Value)); sw.WriteLine("Assuming a data track was present, length {0}.", CDImageLayout.TimeToString(_dataTrackLength.Value));
else else
{ {
if (_cddbDiscIdTag != null && _accurateRipId.Split('-')[2].ToUpper() != _cddbDiscIdTag.ToUpper()) if (_cddbDiscIdTag != null && _accurateRipId.Split('-')[2].ToUpper() != _cddbDiscIdTag.ToUpper())
sw.WriteLine("CDDBId mismatch: {0} vs {1}", _cddbDiscIdTag.ToUpper(), _accurateRipId.Split('-')[2].ToUpper()); sw.WriteLine("CDDBId mismatch: {0} vs {1}", _cddbDiscIdTag.ToUpper(), _accurateRipId.Split('-')[2].ToUpper());
if (_minDataTrackLength.HasValue) if (_minDataTrackLength.HasValue)
sw.WriteLine("Data track was probably present, length {0}-{1}.", General.TimeToString(_minDataTrackLength.Value), General.TimeToString(_minDataTrackLength.Value + 74)); sw.WriteLine("Data track was probably present, length {0}-{1}.", CDImageLayout.TimeToString(_minDataTrackLength.Value), CDImageLayout.TimeToString(_minDataTrackLength.Value + 74));
if (_accurateRipIdActual != _accurateRipId) if (_accurateRipIdActual != _accurateRipId)
sw.WriteLine("Using preserved id, actual id is {0}.", _accurateRipIdActual); sw.WriteLine("Using preserved id, actual id is {0}.", _accurateRipIdActual);
if (_truncated4608) if (_truncated4608)
@@ -1681,15 +1399,15 @@ namespace CUEToolsLib
); );
} }
if (accResult == HttpStatusCode.NotFound) if (_arVerify.AccResult == HttpStatusCode.NotFound)
{ {
sw.WriteLine("Disk not present in database."); sw.WriteLine("Disk not present in database.");
//for (iTrack = 0; iTrack < TrackCount; iTrack++) //for (iTrack = 0; iTrack < TrackCount; iTrack++)
// sw.WriteLine(String.Format(" {0:00}\t[{1:x8}] Disk not present in database", iTrack + 1, _tracks[iTrack].CRC)); // sw.WriteLine(String.Format(" {0:00}\t[{1:x8}] Disk not present in database", iTrack + 1, _tracks[iTrack].CRC));
} }
else if (accResult != HttpStatusCode.OK) else if (_arVerify.AccResult != HttpStatusCode.OK)
{ {
sw.WriteLine("Database access error: " + accResult.ToString()); sw.WriteLine("Database access error: " + _arVerify.AccResult.ToString());
//for (iTrack = 0; iTrack < TrackCount; iTrack++) //for (iTrack = 0; iTrack < TrackCount; iTrack++)
// sw.WriteLine(String.Format(" {0:00}\t[{1:x8}] Database access error {2}", iTrack + 1, _tracks[iTrack].CRC, accResult.ToString())); // sw.WriteLine(String.Format(" {0:00}\t[{1:x8}] Database access error {2}", iTrack + 1, _tracks[iTrack].CRC, accResult.ToString()));
} }
@@ -1699,15 +1417,15 @@ namespace CUEToolsLib
sw.WriteLine(String.Format("Offset applied: {0}", _writeOffset)); sw.WriteLine(String.Format("Offset applied: {0}", _writeOffset));
int offsetApplied = _accurateOffset ? _writeOffset : 0; int offsetApplied = _accurateOffset ? _writeOffset : 0;
sw.WriteLine(String.Format("Track\t[ CRC ] Status")); sw.WriteLine(String.Format("Track\t[ CRC ] Status"));
GenerateAccurateRipLog(sw, offsetApplied); _arVerify.GenerateAccurateRipLog(sw, offsetApplied);
uint offsets_match = 0; uint offsets_match = 0;
for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++) for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++)
{ {
uint matches = 0; uint matches = 0;
for (iTrack = 0; iTrack < TrackCount; iTrack++) for (iTrack = 0; iTrack < TrackCount; iTrack++)
for (int di = 0; di < (int)accDisks.Count; di++) for (int di = 0; di < (int)_arVerify.AccDisks.Count; di++)
if ( (_tracks[iTrack].OffsetedCRC[_arOffsetRange - oi] == accDisks[di].tracks[iTrack].CRC && accDisks[di].tracks[iTrack].CRC != 0) || if ((_arVerify.CRC(iTrack, oi) == _arVerify.AccDisks[di].tracks[iTrack].CRC && _arVerify.AccDisks[di].tracks[iTrack].CRC != 0) ||
(_tracks[iTrack].OffsetedFrame450CRC[_arOffsetRange - oi] == accDisks[di].tracks[iTrack].Frame450CRC && accDisks[di].tracks[iTrack].Frame450CRC != 0) ) (_arVerify.CRC450(iTrack, oi) == _arVerify.AccDisks[di].tracks[iTrack].Frame450CRC && _arVerify.AccDisks[di].tracks[iTrack].Frame450CRC != 0))
matches++; matches++;
if (matches != 0 && oi != offsetApplied) if (matches != 0 && oi != offsetApplied)
{ {
@@ -1717,7 +1435,7 @@ namespace CUEToolsLib
break; break;
} }
sw.WriteLine(String.Format("Offsetted by {0}:", oi)); sw.WriteLine(String.Format("Offsetted by {0}:", oi));
GenerateAccurateRipLog(sw, oi); _arVerify.GenerateAccurateRipLog(sw, oi);
} }
} }
} }
@@ -1729,21 +1447,21 @@ namespace CUEToolsLib
uint matching = 0; uint matching = 0;
uint matching2 = 0; uint matching2 = 0;
uint matching3 = 0; uint matching3 = 0;
for (int iDisk = 0; iDisk < accDisks.Count; iDisk++) for (int iDisk = 0; iDisk < _arVerify.AccDisks.Count; iDisk++)
{ {
total += accDisks[iDisk].tracks[iTrack].count; total += _arVerify.AccDisks[iDisk].tracks[iTrack].count;
if (_tracks[iTrack].OffsetedCRC[_arOffsetRange - offset] == if (_arVerify.CRC(iTrack, offset) ==
accDisks[iDisk].tracks[iTrack].CRC) _arVerify.AccDisks[iDisk].tracks[iTrack].CRC)
matching += accDisks[iDisk].tracks[iTrack].count; matching += _arVerify.AccDisks[iDisk].tracks[iTrack].count;
if (_tracks[iTrack].OffsetedCRC[_arOffsetRange - bestOffset] == if (_arVerify.CRC(iTrack, bestOffset) ==
accDisks[iDisk].tracks[iTrack].CRC) _arVerify.AccDisks[iDisk].tracks[iTrack].CRC)
matching2 += accDisks[iDisk].tracks[iTrack].count; matching2 += _arVerify.AccDisks[iDisk].tracks[iTrack].count;
for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++) for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++)
if (_tracks[iTrack].OffsetedCRC[_arOffsetRange - oi] == if (_arVerify.CRC(iTrack, oi) ==
accDisks[iDisk].tracks[iTrack].CRC) _arVerify.AccDisks[iDisk].tracks[iTrack].CRC)
matching3 += accDisks[iDisk].tracks[iTrack].count; matching3 += _arVerify.AccDisks[iDisk].tracks[iTrack].count;
} }
tags.Add(String.Format("{0}ACCURATERIPCRC", prefix), String.Format("{0:x8}", _tracks[iTrack].OffsetedCRC[_arOffsetRange - offset])); tags.Add(String.Format("{0}ACCURATERIPCRC", prefix), String.Format("{0:x8}", _arVerify.CRC(iTrack, offset)));
tags.Add(String.Format("{0}AccurateRipDiscId", prefix), String.Format("{0:000}-{1}-{2:00}", TrackCount, _accurateRipId, iTrack+1)); tags.Add(String.Format("{0}AccurateRipDiscId", prefix), String.Format("{0:000}-{1}-{2:00}", TrackCount, _accurateRipId, iTrack+1));
tags.Add(String.Format("{0}ACCURATERIPCOUNT", prefix), String.Format("{0}", matching)); tags.Add(String.Format("{0}ACCURATERIPCOUNT", prefix), String.Format("{0}", matching));
tags.Add(String.Format("{0}ACCURATERIPCOUNTALLOFFSETS", prefix), String.Format("{0}", matching3)); tags.Add(String.Format("{0}ACCURATERIPCOUNTALLOFFSETS", prefix), String.Format("{0}", matching3));
@@ -1790,9 +1508,9 @@ namespace CUEToolsLib
{ {
uint confidence = 0; uint confidence = 0;
for (int di = 0; di < (int)accDisks.Count; di++) for (int di = 0; di < (int)_arVerify.AccDisks.Count; di++)
if (_tracks[iTrack].OffsetedCRC[_arOffsetRange - offset] == accDisks[di].tracks[iTrack].CRC) if (_arVerify.CRC(iTrack, offset) == _arVerify.AccDisks[di].tracks[iTrack].CRC)
confidence += accDisks[di].tracks[iTrack].count; confidence += _arVerify.AccDisks[di].tracks[iTrack].count;
if (confidence >= minConfidence) if (confidence >= minConfidence)
tracksMatch++; tracksMatch++;
@@ -1819,7 +1537,7 @@ namespace CUEToolsLib
string[] destPaths; string[] destPaths;
int[] destLengths; int[] destLengths;
bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA && bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA &&
(_tracks[0].IndexLengths[0] != 0)); (_toc.Pregap != 0));
if (_usePregapForFirstTrackInSingleFile) { if (_usePregapForFirstTrackInSingleFile) {
throw new Exception("UsePregapForFirstTrackInSingleFile is not supported for writing audio files."); throw new Exception("UsePregapForFirstTrackInSingleFile is not supported for writing audio files.");
@@ -1861,8 +1579,8 @@ namespace CUEToolsLib
{ {
_dataTrackLength = dtl; _dataTrackLength = dtl;
_accurateRipId = CalculateAccurateRipId(); _accurateRipId = CalculateAccurateRipId();
ContactAccurateRip(); _arVerify.ContactAccurateRip(_accurateRipId);
if (accResult != HttpStatusCode.NotFound) if (_arVerify.AccResult != HttpStatusCode.NotFound)
break; break;
ShowProgress((string)"Contacting AccurateRip database...", 0, (dtl - minDTL) / 75.0, null, null); ShowProgress((string)"Contacting AccurateRip database...", 0, (dtl - minDTL) / 75.0, null, null);
lock (this) { lock (this) {
@@ -1877,15 +1595,15 @@ namespace CUEToolsLib
Monitor.Wait(this, 1000); Monitor.Wait(this, 1000);
} }
} }
if (accResult != HttpStatusCode.OK) if (_arVerify.AccResult != HttpStatusCode.OK)
{ {
_dataTrackLength = null; _dataTrackLength = null;
_accurateRipId = _accurateRipIdActual; _accurateRipId = _accurateRipIdActual;
} }
} else } else
ContactAccurateRip(); _arVerify.ContactAccurateRip(_accurateRipId);
if (accResult != HttpStatusCode.OK) if (_arVerify.AccResult != HttpStatusCode.OK)
{ {
if (!_accurateOffset || _config.noUnverifiedOutput) if (!_accurateOffset || _config.noUnverifiedOutput)
{ {
@@ -2053,7 +1771,7 @@ namespace CUEToolsLib
destTags.Add("TRACKNUMBER", (iTrack + 1).ToString()); destTags.Add("TRACKNUMBER", (iTrack + 1).ToString());
if (_accurateRipId != null && _config.writeArTagsOnConvert) if (_accurateRipId != null && _config.writeArTagsOnConvert)
{ {
if (_accurateOffset && accResult == HttpStatusCode.OK) if (_accurateOffset && _arVerify.AccResult == HttpStatusCode.OK)
GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, iTrack); GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, iTrack);
else else
destTags.Add("ACCURATERIPID", _accurateRipId); destTags.Add("ACCURATERIPID", _accurateRipId);
@@ -2119,7 +1837,7 @@ namespace CUEToolsLib
if (_accurateRipId != null && _config.writeArTagsOnConvert) if (_accurateRipId != null && _config.writeArTagsOnConvert)
{ {
if (fWithCUE && _accurateOffset && accResult == HttpStatusCode.OK) if (fWithCUE && _accurateOffset && _arVerify.AccResult == HttpStatusCode.OK)
GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, -1); GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, -1);
else else
destTags.Add("ACCURATERIPID", _accurateRipId); destTags.Add("ACCURATERIPID", _accurateRipId);
@@ -2183,7 +1901,7 @@ namespace CUEToolsLib
uint tracksMatch; uint tracksMatch;
int bestOffset = _writeOffset; int bestOffset = _writeOffset;
if (!noOutput && _accurateRipId != null && _config.writeArTagsOnConvert && _accurateOffset && accResult == HttpStatusCode.OK) if (!noOutput && _accurateRipId != null && _config.writeArTagsOnConvert && _accurateOffset && _arVerify.AccResult == HttpStatusCode.OK)
FindBestOffset(1, true, out tracksMatch, out bestOffset); FindBestOffset(1, true, out tracksMatch, out bestOffset);
if (hdcdDecoder != null) if (hdcdDecoder != null)
@@ -2197,22 +1915,12 @@ namespace CUEToolsLib
SetAlbumTags(audioDest, bestOffset, style == CUEStyle.SingleFileWithCUE); SetAlbumTags(audioDest, bestOffset, style == CUEStyle.SingleFileWithCUE);
} }
if (_accurateRip && noOutput)
for (iTrack = 0; iTrack < TrackCount; iTrack++)
for (int iCRC = 0; iCRC < 10 * 588; iCRC++)
{
_tracks[iTrack].OffsetedCRC[iCRC] = 0;
_tracks[iTrack].OffsetedFrame450CRC[iCRC] = 0;
}
uint currentOffset = 0, previousOffset = 0; uint currentOffset = 0, previousOffset = 0;
uint trackLength = _tracks[0].IndexLengths[0] * 588; uint trackLength = _toc.Pregap * 588;
uint diskLength = 0, diskOffset = 0; uint diskLength = _toc.Length * 588, diskOffset = 0;
for (iTrack = 0; iTrack < TrackCount; iTrack++)
for (iIndex = 0; iIndex <= _tracks[iTrack].LastIndex; iIndex++)
diskLength += _tracks[iTrack].IndexLengths[iIndex] * 588;
if (_accurateRip && noOutput)
_arVerify.Init();
ShowProgress(String.Format("{2} track {0:00} ({1:00}%)...", 0, 0, noOutput ? "Verifying" : "Writing"), 0, 0.0, null, null); ShowProgress(String.Format("{2} track {0:00} ({1:00}%)...", 0, 0, noOutput ? "Verifying" : "Writing"), 0, 0.0, null, null);
@@ -2230,19 +1938,15 @@ namespace CUEToolsLib
SetTrackTags(audioDest, iTrack, bestOffset); SetTrackTags(audioDest, iTrack, bestOffset);
} }
for (iIndex = 0; iIndex <= track.LastIndex; iIndex++) { for (iIndex = 0; iIndex <= _toc[iTrack+1].LastIndex; iIndex++) {
uint trackPercent= 0, lastTrackPercent= 101; uint trackPercent= 0, lastTrackPercent= 101;
uint samplesRemIndex = track.IndexLengths[iIndex] * 588; uint samplesRemIndex = _toc[iTrack + 1][iIndex].Length * 588;
if (iIndex == 1) if (iIndex == 1)
{ {
previousOffset = currentOffset; previousOffset = currentOffset;
currentOffset = 0; currentOffset = 0;
trackLength = 0; trackLength = _toc[iTrack + 1].Length * 588;
for (int iIndex2 = 1; iIndex2 <= track.LastIndex; iIndex2++)
trackLength += _tracks[iTrack].IndexLengths[iIndex2] * 588;
if (iTrack != TrackCount -1)
trackLength += _tracks[iTrack + 1].IndexLengths[0] * 588;
} }
if ((style == CUEStyle.GapsAppended) && (iIndex == 1)) if ((style == CUEStyle.GapsAppended) && (iIndex == 1))
@@ -2317,26 +2021,9 @@ namespace CUEToolsLib
} }
} }
} }
if (_accurateRip && noOutput && (iTrack != 0 || iIndex != 0)) if (_accurateRip && noOutput)
unsafe { _arVerify.Write(sampleBuffer, copyCount);
fixed (int *pSampleBuff = &sampleBuffer[0,0])
{
int iTrack2 = iTrack - (iIndex == 0 ? 1 : 0);
uint si1 = (uint) Math.Min(copyCount, Math.Max(0, 588*(iTrack2 == 0?10:5) - (int) currentOffset));
uint si2 = (uint) Math.Min(copyCount, Math.Max(si1, trackLength - (int) currentOffset - 588 * (iTrack2 == TrackCount - 1?10:5)));
if (iTrack2 == 0)
CalculateAccurateRipCRCs (pSampleBuff, si1, iTrack2, currentOffset, previousOffset, trackLength);
else
CalculateAccurateRipCRCsSemifast(pSampleBuff, si1, iTrack2, currentOffset, previousOffset, trackLength);
if (si2 > si1)
CalculateAccurateRipCRCsFast(pSampleBuff + si1 * 2, (uint)(si2 - si1), iTrack2, currentOffset + si1);
if (iTrack2 == TrackCount - 1)
CalculateAccurateRipCRCs(pSampleBuff + si2*2, copyCount - si2, iTrack2, currentOffset + si2, previousOffset, trackLength);
else
CalculateAccurateRipCRCsSemifast(pSampleBuff + si2*2, copyCount - si2, iTrack2, currentOffset + si2, previousOffset, trackLength);
}
}
currentOffset += copyCount; currentOffset += copyCount;
diskOffset += copyCount; diskOffset += copyCount;
samplesRemIndex -= copyCount; samplesRemIndex -= copyCount;
@@ -2472,8 +2159,7 @@ namespace CUEToolsLib
int iTrack, iIndex, iFile; int iTrack, iIndex, iFile;
TrackInfo track; TrackInfo track;
int[] fileLengths; int[] fileLengths;
bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA && bool htoaToFile = (style == CUEStyle.GapsAppended && _config.preserveHTOA && _toc.Pregap != 0);
(_tracks[0].IndexLengths[0] != 0));
bool discardOutput; bool discardOutput;
if (style == CUEStyle.SingleFile || style == CUEStyle.SingleFileWithCUE) { if (style == CUEStyle.SingleFile || style == CUEStyle.SingleFileWithCUE) {
@@ -2488,31 +2174,20 @@ namespace CUEToolsLib
for (iTrack = 0; iTrack < TrackCount; iTrack++) { for (iTrack = 0; iTrack < TrackCount; iTrack++) {
track = _tracks[iTrack]; track = _tracks[iTrack];
if ((style == CUEStyle.GapsPrepended) || (style == CUEStyle.GapsLeftOut)) { if (style == CUEStyle.GapsPrepended || style == CUEStyle.GapsLeftOut)
iFile++; iFile++;
}
for (iIndex = 0; iIndex <= track.LastIndex; iIndex++) { for (iIndex = 0; iIndex <= _toc[iTrack+1].LastIndex; iIndex++) {
if ((style == CUEStyle.GapsAppended) && (iIndex == 1)) { if (style == CUEStyle.GapsAppended && (iIndex == 1 || (iIndex == 0 && iTrack == 0 && htoaToFile)))
iFile++; iFile++;
}
if ((style == CUEStyle.GapsAppended) && (iIndex == 0) && (iTrack == 0)) { if (style == CUEStyle.GapsAppended && iIndex == 0 && iTrack == 0)
discardOutput = !htoaToFile; discardOutput = !htoaToFile;
if (htoaToFile) { else
iFile++; discardOutput = (style == CUEStyle.GapsLeftOut && iIndex == 0);
}
}
else if ((style == CUEStyle.GapsLeftOut) && (iIndex == 0)) {
discardOutput = true;
}
else {
discardOutput = false;
}
if (!discardOutput) { if (!discardOutput)
fileLengths[iFile] += (int) track.IndexLengths[iIndex] * 588; fileLengths[iFile] += (int) _toc[iTrack+1][iIndex].Length * 588;
}
} }
} }
@@ -2689,11 +2364,11 @@ namespace CUEToolsLib
{ {
get get
{ {
return General.TimeToString(_dataTrackLength.HasValue ? _dataTrackLength.Value : 0); return CDImageLayout.TimeToString(_dataTrackLength.HasValue ? _dataTrackLength.Value : 0);
} }
set set
{ {
uint dtl = (uint) General.TimeFromString(value); uint dtl = (uint)CDImageLayout.TimeFromString(value);
if (dtl != 0) if (dtl != 0)
{ {
_dataTrackLength = dtl; _dataTrackLength = dtl;
@@ -2734,6 +2409,8 @@ namespace CUEToolsLib
_accurateOffset = value; _accurateOffset = value;
} }
} }
CDImageLayout _toc;
} }
public class CUELine { public class CUELine {
@@ -2812,49 +2489,12 @@ namespace CUEToolsLib
} }
public class TrackInfo { public class TrackInfo {
private List<uint> _indexLengths;
private List<CUELine> _attributes; private List<CUELine> _attributes;
public uint[] OffsetedCRC;
public uint[] OffsetedFrame450CRC;
public NameValueCollection _trackTags; public NameValueCollection _trackTags;
public TrackInfo() { public TrackInfo() {
_indexLengths = new List<uint>();
_attributes = new List<CUELine>(); _attributes = new List<CUELine>();
_trackTags = new NameValueCollection(); _trackTags = new NameValueCollection();
OffsetedCRC = new uint[10 * 588];
OffsetedFrame450CRC = new uint[10 * 588];
_indexLengths.Add(0);
}
public uint CRC
{
get
{
return OffsetedCRC[5 * 588 - 1];
}
}
public int LastIndex {
get {
return _indexLengths.Count - 1;
}
}
public List<uint> IndexLengths {
get {
return _indexLengths;
}
}
public void AddIndex(bool isGap, uint length) {
if (isGap) {
_indexLengths[0] = length;
}
else {
_indexLengths.Add(length);
}
} }
public List<CUELine> Attributes { public List<CUELine> Attributes {
@@ -2898,27 +2538,6 @@ namespace CUEToolsLib
public uint Length; public uint Length;
} }
struct AccTrack
{
public uint count;
public uint CRC;
public uint Frame450CRC;
}
class AccDisk
{
public uint count;
public uint discId1;
public uint discId2;
public uint cddbDiscId;
public List<AccTrack> tracks;
public AccDisk() {
tracks = new List<AccTrack>();
}
}
public class StopException : Exception { public class StopException : Exception {
public StopException() : base() { public StopException() : base() {
} }

View File

@@ -24,9 +24,10 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
namespace CUEToolsLib namespace CUETools.Processor
{ {
static class SettingsShared { static class SettingsShared
{
public static string GetMyAppDataDir(string appName) { public static string GetMyAppDataDir(string appName) {
string appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string myAppDataDir = Path.Combine(appDataDir, appName); string myAppDataDir = Path.Combine(appDataDir, appName);

View File

@@ -35,7 +35,7 @@ using namespace System::IO;
using namespace System::Collections::Generic; using namespace System::Collections::Generic;
using namespace System::Collections::Specialized; using namespace System::Collections::Specialized;
using namespace System::Runtime::InteropServices; using namespace System::Runtime::InteropServices;
using namespace AudioCodecsDotNet; using namespace CUETools::Codecs;
#include "FLAC\all.h" #include "FLAC\all.h"
#include <string> #include <string>

View File

@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using AudioCodecsDotNet; using CUETools.Codecs;
namespace HDCDDotNet namespace HDCDDotNet
{ {

View File

@@ -85,9 +85,9 @@
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AudioCodecsDotNet\AudioCodecsDotNet.csproj"> <ProjectReference Include="..\AudioCodecsDotNet\CUETools.Codecs.csproj">
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project> <Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
<Name>AudioCodecsDotNet</Name> <Name>CUETools.Codecs</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

View File

@@ -7,8 +7,8 @@
<ProjectGuid>{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}</ProjectGuid> <ProjectGuid>{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LossyWAVDotNet</RootNamespace> <RootNamespace>CUETools.Codecs.LossyWAV</RootNamespace>
<AssemblyName>LossyWAVDotNet</AssemblyName> <AssemblyName>CUETools.Codecs.LossyWAV</AssemblyName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@@ -85,9 +85,9 @@
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AudioCodecsDotNet\AudioCodecsDotNet.csproj"> <ProjectReference Include="..\AudioCodecsDotNet\CUETools.Codecs.csproj">
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project> <Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
<Name>AudioCodecsDotNet</Name> <Name>CUETools.Codecs</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

View File

@@ -25,9 +25,9 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Text; using System.Text;
using AudioCodecsDotNet; using CUETools.Codecs;
namespace LossyWAVDotNet namespace CUETools.Codecs.LossyWAV
{ {
public class LossyWAVWriter : IAudioDest public class LossyWAVWriter : IAudioDest
{ {

View File

@@ -1,10 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<StartArguments>"06 - Garden of Dreams - Mr. Hope Goes to Wall Street.wav" --stdout</StartArguments>
<StartWorkingDirectory>C:\Work\cuetoolsnet\bin\x64\Release\</StartWorkingDirectory>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<StartArguments>"06 - Garden of Dreams - Mr. Hope Goes to Wall Street.wav" --stdout</StartArguments>
<StartWorkingDirectory>C:\Work\cuetoolsnet\bin\x64\Release\</StartWorkingDirectory>
</PropertyGroup>
</Project>

View File

@@ -2,8 +2,8 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.IO; using System.IO;
using LossyWAVDotNet; using CUETools.Codecs;
using AudioCodecsDotNet; using CUETools.Codecs.LossyWAV;
namespace LossyWAVSharp namespace LossyWAVSharp
{ {

View File

@@ -35,7 +35,7 @@ using namespace System::Collections::Specialized;
using namespace System::Security::Cryptography; using namespace System::Security::Cryptography;
using namespace System::IO; using namespace System::IO;
using namespace APETagsDotNet; using namespace APETagsDotNet;
using namespace AudioCodecsDotNet; using namespace CUETools::Codecs;
#include <stdio.h> #include <stdio.h>
#include <memory.h> #include <memory.h>