mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
Support for WAV stdinput
support for WAVEX (when bps != 16 && bps != 24)
This commit is contained in:
@@ -26,6 +26,7 @@ namespace AudioCodecsDotNet
|
|||||||
bool SetTags(NameValueCollection tags);
|
bool SetTags(NameValueCollection tags);
|
||||||
void Close();
|
void Close();
|
||||||
void Delete();
|
void Delete();
|
||||||
|
int BitsPerSample { get; }
|
||||||
long FinalSampleCount { set; }
|
long FinalSampleCount { set; }
|
||||||
long BlockSize { set; }
|
long BlockSize { set; }
|
||||||
string Path { get; }
|
string Path { get; }
|
||||||
@@ -60,7 +61,7 @@ namespace AudioCodecsDotNet
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static unsafe void FLACSamplesToBytes_24(int[,] inSamples, uint inSampleOffset,
|
public static unsafe void FLACSamplesToBytes_24(int[,] inSamples, uint inSampleOffset,
|
||||||
byte[] outSamples, uint outByteOffset, uint sampleCount, int channelCount)
|
byte[] outSamples, uint outByteOffset, uint sampleCount, int channelCount, int wastedBits)
|
||||||
{
|
{
|
||||||
uint loopCount = sampleCount * (uint)channelCount;
|
uint loopCount = sampleCount * (uint)channelCount;
|
||||||
|
|
||||||
@@ -79,7 +80,7 @@ namespace AudioCodecsDotNet
|
|||||||
|
|
||||||
for (int i = 0; i < loopCount; i++)
|
for (int i = 0; i < loopCount; i++)
|
||||||
{
|
{
|
||||||
uint sample_out = (uint)*(pInSamples++);
|
uint sample_out = (uint)*(pInSamples++) << wastedBits;
|
||||||
*(pOutSamples++) = (byte)(sample_out & 0xFF);
|
*(pOutSamples++) = (byte)(sample_out & 0xFF);
|
||||||
sample_out >>= 8;
|
sample_out >>= 8;
|
||||||
*(pOutSamples++) = (byte)(sample_out & 0xFF);
|
*(pOutSamples++) = (byte)(sample_out & 0xFF);
|
||||||
@@ -95,8 +96,8 @@ namespace AudioCodecsDotNet
|
|||||||
{
|
{
|
||||||
if (bitsPerSample == 16)
|
if (bitsPerSample == 16)
|
||||||
AudioSamples.FLACSamplesToBytes_16(inSamples, inSampleOffset, outSamples, outByteOffset, sampleCount, channelCount);
|
AudioSamples.FLACSamplesToBytes_16(inSamples, inSampleOffset, outSamples, outByteOffset, sampleCount, channelCount);
|
||||||
else if (bitsPerSample == 24)
|
else if (bitsPerSample > 16 && bitsPerSample <= 24)
|
||||||
AudioSamples.FLACSamplesToBytes_24(inSamples, inSampleOffset, outSamples, outByteOffset, sampleCount, channelCount);
|
AudioSamples.FLACSamplesToBytes_24(inSamples, inSampleOffset, outSamples, outByteOffset, sampleCount, channelCount, 24 - bitsPerSample);
|
||||||
else
|
else
|
||||||
throw new Exception("Unsupported bitsPerSample value");
|
throw new Exception("Unsupported bitsPerSample value");
|
||||||
}
|
}
|
||||||
@@ -132,6 +133,7 @@ namespace AudioCodecsDotNet
|
|||||||
{
|
{
|
||||||
public DummyWriter(string path, int bitsPerSample, int channelCount, int sampleRate)
|
public DummyWriter(string path, int bitsPerSample, int channelCount, int sampleRate)
|
||||||
{
|
{
|
||||||
|
_bitsPerSample = bitsPerSample;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SetTags(NameValueCollection tags)
|
public bool SetTags(NameValueCollection tags)
|
||||||
@@ -157,11 +159,18 @@ namespace AudioCodecsDotNet
|
|||||||
set { }
|
set { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int BitsPerSample
|
||||||
|
{
|
||||||
|
get { return _bitsPerSample; }
|
||||||
|
}
|
||||||
|
|
||||||
public void Write(int[,] buff, uint sampleCount)
|
public void Write(int[,] buff, uint sampleCount)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Path { get { return null; } }
|
public string Path { get { return null; } }
|
||||||
|
|
||||||
|
int _bitsPerSample;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SilenceGenerator : IAudioSource
|
public class SilenceGenerator : IAudioSource
|
||||||
@@ -278,7 +287,6 @@ namespace AudioCodecsDotNet
|
|||||||
ParseHeaders();
|
ParseHeaders();
|
||||||
|
|
||||||
_sampleLen = _dataLen / (uint)_blockAlign;
|
_sampleLen = _dataLen / (uint)_blockAlign;
|
||||||
Position = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
@@ -319,8 +327,8 @@ namespace AudioCodecsDotNet
|
|||||||
_largeFile = false;
|
_largeFile = false;
|
||||||
foundFormat = false;
|
foundFormat = false;
|
||||||
foundData = false;
|
foundData = false;
|
||||||
|
long pos = 12;
|
||||||
while (_IO.Position < fileEnd)
|
do
|
||||||
{
|
{
|
||||||
uint ckID, ckSize, ckSizePadded;
|
uint ckID, ckSize, ckSizePadded;
|
||||||
long ckEnd;
|
long ckEnd;
|
||||||
@@ -328,7 +336,8 @@ namespace AudioCodecsDotNet
|
|||||||
ckID = _br.ReadUInt32();
|
ckID = _br.ReadUInt32();
|
||||||
ckSize = _br.ReadUInt32();
|
ckSize = _br.ReadUInt32();
|
||||||
ckSizePadded = (ckSize + 1U) & ~1U;
|
ckSizePadded = (ckSize + 1U) & ~1U;
|
||||||
ckEnd = _IO.Position + (long)ckSizePadded;
|
pos += 8;
|
||||||
|
ckEnd = pos + (long)ckSizePadded;
|
||||||
|
|
||||||
if (ckID == fccFormat)
|
if (ckID == fccFormat)
|
||||||
{
|
{
|
||||||
@@ -343,13 +352,14 @@ namespace AudioCodecsDotNet
|
|||||||
_br.ReadInt32();
|
_br.ReadInt32();
|
||||||
_blockAlign = _br.ReadInt16();
|
_blockAlign = _br.ReadInt16();
|
||||||
_bitsPerSample = _br.ReadInt16();
|
_bitsPerSample = _br.ReadInt16();
|
||||||
|
pos += 16;
|
||||||
}
|
}
|
||||||
else if (ckID == fccData)
|
else if (ckID == fccData)
|
||||||
{
|
{
|
||||||
foundData = true;
|
foundData = true;
|
||||||
|
|
||||||
_dataOffset = (ulong)_IO.Position;
|
_dataOffset = (ulong)pos;
|
||||||
if (_IO.Length <= maxFileSize)
|
if (!_IO.CanSeek || _IO.Length <= maxFileSize)
|
||||||
{
|
{
|
||||||
_dataLen = ckSize;
|
_dataLen = ckSize;
|
||||||
}
|
}
|
||||||
@@ -361,34 +371,26 @@ namespace AudioCodecsDotNet
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((foundFormat & foundData) || _largeFile)
|
if ((foundFormat & foundData) || _largeFile)
|
||||||
{
|
|
||||||
break;
|
break;
|
||||||
}
|
if (_IO.CanSeek)
|
||||||
|
_IO.Seek(ckEnd, SeekOrigin.Begin);
|
||||||
_IO.Seek(ckEnd, SeekOrigin.Begin);
|
else
|
||||||
}
|
_br.ReadBytes((int)(ckEnd - pos));
|
||||||
|
pos = ckEnd;
|
||||||
|
} while (true);
|
||||||
|
|
||||||
if ((foundFormat & foundData) == false)
|
if ((foundFormat & foundData) == false)
|
||||||
{
|
|
||||||
throw new Exception("Format or data chunk not found.");
|
throw new Exception("Format or data chunk not found.");
|
||||||
}
|
|
||||||
|
|
||||||
if (_channelCount <= 0)
|
if (_channelCount <= 0)
|
||||||
{
|
|
||||||
throw new Exception("Channel count is invalid.");
|
throw new Exception("Channel count is invalid.");
|
||||||
}
|
|
||||||
if (_sampleRate <= 0)
|
if (_sampleRate <= 0)
|
||||||
{
|
|
||||||
throw new Exception("Sample rate is invalid.");
|
throw new Exception("Sample rate is invalid.");
|
||||||
}
|
|
||||||
if (_blockAlign != (_channelCount * ((_bitsPerSample + 7) / 8)))
|
if (_blockAlign != (_channelCount * ((_bitsPerSample + 7) / 8)))
|
||||||
{
|
|
||||||
throw new Exception("Block align is invalid.");
|
throw new Exception("Block align is invalid.");
|
||||||
}
|
|
||||||
if ((_bitsPerSample <= 0) || (_bitsPerSample > 32))
|
if ((_bitsPerSample <= 0) || (_bitsPerSample > 32))
|
||||||
{
|
|
||||||
throw new Exception("Bits per sample is invalid.");
|
throw new Exception("Bits per sample is invalid.");
|
||||||
}
|
if (pos != (long)_dataOffset)
|
||||||
|
Position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ulong Position
|
public ulong Position
|
||||||
@@ -558,16 +560,48 @@ namespace AudioCodecsDotNet
|
|||||||
_bw.Write(fccWAVE);
|
_bw.Write(fccWAVE);
|
||||||
|
|
||||||
_bw.Write(fccFormat);
|
_bw.Write(fccFormat);
|
||||||
_bw.Write((uint)16);
|
if (_bitsPerSample != 16 && _bitsPerSample != 24)
|
||||||
_bw.Write((ushort)1);
|
{
|
||||||
|
_bw.Write((uint)40);
|
||||||
|
//_bw.Write((uint)16);
|
||||||
|
_bw.Write((ushort)0xfffe); // WAVEX follows
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_bw.Write((uint)16);
|
||||||
|
_bw.Write((ushort)1); // PCM
|
||||||
|
}
|
||||||
_bw.Write((ushort)_channelCount);
|
_bw.Write((ushort)_channelCount);
|
||||||
_bw.Write((uint)_sampleRate);
|
_bw.Write((uint)_sampleRate);
|
||||||
_bw.Write((uint)(_sampleRate * _blockAlign));
|
_bw.Write((uint)(_sampleRate * _blockAlign));
|
||||||
_bw.Write((ushort)_blockAlign);
|
_bw.Write((ushort)_blockAlign);
|
||||||
_bw.Write((ushort)_bitsPerSample);
|
_bw.Write((ushort)((_bitsPerSample+7)/8*8));
|
||||||
|
hdrLen = 36;
|
||||||
|
|
||||||
|
if (_bitsPerSample != 16 && _bitsPerSample != 24)
|
||||||
|
{
|
||||||
|
_bw.Write((ushort)22); // length of WAVEX structure
|
||||||
|
_bw.Write((ushort)_bitsPerSample);
|
||||||
|
_bw.Write((uint)3); // speaker positions (3 == stereo)
|
||||||
|
_bw.Write((ushort)1); // PCM
|
||||||
|
_bw.Write((ushort)0);
|
||||||
|
_bw.Write((ushort)0);
|
||||||
|
_bw.Write((ushort)0x10);
|
||||||
|
_bw.Write((byte)0x80);
|
||||||
|
_bw.Write((byte)0x00);
|
||||||
|
_bw.Write((byte)0x00);
|
||||||
|
_bw.Write((byte)0xaa);
|
||||||
|
_bw.Write((byte)0x00);
|
||||||
|
_bw.Write((byte)0x38);
|
||||||
|
_bw.Write((byte)0x9b);
|
||||||
|
_bw.Write((byte)0x71);
|
||||||
|
|
||||||
|
hdrLen += 24;
|
||||||
|
}
|
||||||
|
|
||||||
_bw.Write(fccData);
|
_bw.Write(fccData);
|
||||||
_bw.Write((uint)0);
|
_bw.Write((uint)0);
|
||||||
|
hdrLen += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
@@ -623,6 +657,11 @@ namespace AudioCodecsDotNet
|
|||||||
set { }
|
set { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int BitsPerSample
|
||||||
|
{
|
||||||
|
get { return _bitsPerSample; }
|
||||||
|
}
|
||||||
|
|
||||||
public void Write(int[,] buff, uint sampleCount)
|
public void Write(int[,] buff, uint sampleCount)
|
||||||
{
|
{
|
||||||
if (sampleCount == 0)
|
if (sampleCount == 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user