mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
This commit is contained in:
102
CUETools.Processor/AudioReadWrite.cs
Normal file
102
CUETools.Processor/AudioReadWrite.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using FLACDotNet;
|
||||
using WavPackDotNet;
|
||||
using APEDotNet;
|
||||
using CUETools.Codecs;
|
||||
using CUETools.Codecs.ALAC;
|
||||
using CUETools.Codecs.LossyWAV;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
namespace CUETools.Processor
|
||||
{
|
||||
public static class AudioReadWrite {
|
||||
public static IAudioSource GetAudioSource(string path, Stream IO, string extension)
|
||||
{
|
||||
switch (extension)
|
||||
{
|
||||
case ".wav":
|
||||
return new WAVReader(path, IO);
|
||||
case ".m4a":
|
||||
return new ALACReader(path, IO);
|
||||
#if !MONO
|
||||
case ".flac":
|
||||
return new FLACReader(path, IO);
|
||||
case ".wv":
|
||||
return new WavPackReader(path, IO, null);
|
||||
case ".ape":
|
||||
return new APEReader(path, IO);
|
||||
#endif
|
||||
default:
|
||||
throw new Exception("Unsupported audio type.");
|
||||
}
|
||||
}
|
||||
|
||||
public static IAudioSource GetAudioSource(string path, Stream IO)
|
||||
{
|
||||
string extension = Path.GetExtension(path).ToLower();
|
||||
string filename = Path.GetFileNameWithoutExtension(path);
|
||||
string secondExtension = Path.GetExtension(filename).ToLower();
|
||||
if (secondExtension != ".lossy" && secondExtension != ".lwcdf")
|
||||
return GetAudioSource(path, IO, extension);
|
||||
|
||||
string lossyPath = Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(filename) + ".lossy" + extension);
|
||||
string lwcdfPath = Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(filename) + ".lwcdf" + extension);
|
||||
IAudioSource lossySource = GetAudioSource(lossyPath, null, extension);
|
||||
IAudioSource lwcdfSource = GetAudioSource(lwcdfPath, null, extension);
|
||||
return new LossyWAVReader(lossySource, lwcdfSource);
|
||||
}
|
||||
|
||||
public static IAudioDest GetAudioDest(string path, int bitsPerSample, int channelCount, int sampleRate, long finalSampleCount, string extension, CUEConfig config) {
|
||||
IAudioDest dest;
|
||||
switch (extension) {
|
||||
case ".wav":
|
||||
dest = new WAVWriter(path, bitsPerSample, channelCount, sampleRate, null);
|
||||
break;
|
||||
#if !MONO
|
||||
case ".flac":
|
||||
dest = new FLACWriter(path, bitsPerSample, channelCount, sampleRate);
|
||||
((FLACWriter)dest).CompressionLevel = (int)config.flacCompressionLevel;
|
||||
((FLACWriter)dest).Verify = config.flacVerify;
|
||||
break;
|
||||
case ".wv":
|
||||
dest = new WavPackWriter(path, bitsPerSample, channelCount, sampleRate);
|
||||
((WavPackWriter)dest).CompressionMode = config.wvCompressionMode;
|
||||
((WavPackWriter)dest).ExtraMode = config.wvExtraMode;
|
||||
((WavPackWriter)dest).MD5Sum = config.wvStoreMD5;
|
||||
break;
|
||||
case ".ape":
|
||||
dest = new APEWriter(path, bitsPerSample, channelCount, sampleRate);
|
||||
((APEWriter)dest).CompressionLevel = (int)config.apeCompressionLevel;
|
||||
break;
|
||||
case ".dummy":
|
||||
dest = new DummyWriter(path, bitsPerSample, channelCount, sampleRate);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
throw new Exception("Unsupported audio type.");
|
||||
}
|
||||
dest.FinalSampleCount = finalSampleCount;
|
||||
return dest;
|
||||
}
|
||||
|
||||
public static IAudioDest GetAudioDest(string path, long finalSampleCount, CUEConfig config)
|
||||
{
|
||||
string extension = Path.GetExtension(path).ToLower();
|
||||
string filename = Path.GetFileNameWithoutExtension(path);
|
||||
if (Path.GetExtension(filename).ToLower() != ".lossy")
|
||||
{
|
||||
int bitsPerSample = (config.detectHDCD && config.decodeHDCD) ? (config.decodeHDCDto24bit ? 24 : 20) : 16;
|
||||
return GetAudioDest(path, bitsPerSample, 2, 44100, finalSampleCount, extension, config);
|
||||
}
|
||||
|
||||
string lwcdfPath = Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(filename) + ".lwcdf" + extension);
|
||||
int destBitsPerSample = (config.detectHDCD && config.decodeHDCD) ? ((!config.decodeHDCDtoLW16 && config.decodeHDCDto24bit) ? 24 : 20) : 16;
|
||||
int lossyBitsPerSample = (config.detectHDCD && config.decodeHDCD && !config.decodeHDCDtoLW16) ? 24 : 16;
|
||||
IAudioDest lossyDest = GetAudioDest(path, lossyBitsPerSample, 2, 44100, finalSampleCount, extension, config);
|
||||
IAudioDest lwcdfDest = GetAudioDest(lwcdfPath, destBitsPerSample, 2, 44100, finalSampleCount, extension, config);
|
||||
return new LossyWAVWriter(lossyDest, lwcdfDest, destBitsPerSample, 2, 44100, config.lossyWAVQuality);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user