|
@@ -19,14 +19,14 @@ public class DsfSourceStream : DsdAbstractSourceStream
|
|
|
|
|
|
public int ChannelNum { get; }
|
|
|
public int SampleRate { get; }
|
|
|
- public int BlockSizePerChannel { get; }
|
|
|
+ public int ClusterSizePerChannel { get; }
|
|
|
public int BitPerSample { get; }
|
|
|
|
|
|
public override WaveFormat WaveFormat { get; }
|
|
|
|
|
|
- private readonly byte[] _blockBuf;
|
|
|
- private int _blockBufSize;
|
|
|
- private int _blockPtrByChannel;
|
|
|
+ private readonly byte[] _clusterBuf;
|
|
|
+ private int _clusterBufSize;
|
|
|
+ private int _clusterPtrByChannel;
|
|
|
|
|
|
public static bool IsDsfFile(Stream stream)
|
|
|
{
|
|
@@ -76,7 +76,7 @@ public class DsfSourceStream : DsdAbstractSourceStream
|
|
|
BitPerSample = reader.ReadInt32();
|
|
|
|
|
|
var sampleCount = reader.ReadInt64();
|
|
|
- BlockSizePerChannel = reader.ReadInt32();
|
|
|
+ ClusterSizePerChannel = reader.ReadInt32();
|
|
|
var rsv0000 = reader.ReadInt32();
|
|
|
|
|
|
var dataSignature = Encoding.ASCII.GetString(reader.ReadBytes(4));
|
|
@@ -87,15 +87,14 @@ public class DsfSourceStream : DsdAbstractSourceStream
|
|
|
_dataChunkBeginOffset = _underlyingStream.Position;
|
|
|
_dataChunkEndOffset = _dataChunkBeginOffset + _dataSize;
|
|
|
|
|
|
- var align = BlockSizePerChannel * ChannelNum;
|
|
|
+ var align = ClusterSizePerChannel * ChannelNum;
|
|
|
WaveFormat = WaveFormat.CreateCustomFormat(WaveFormatEncoding.Unknown, SampleRate, ChannelNum, SampleRate * channelType / 8, align, 1);
|
|
|
|
|
|
- _blockBuf = new byte[align];
|
|
|
+ _clusterBuf = new byte[align];
|
|
|
}
|
|
|
|
|
|
- private bool ReadBlock()
|
|
|
+ private bool ReadCluster()
|
|
|
{
|
|
|
- //TODO: Rename to ReadChunk
|
|
|
// block[ChannelNum]
|
|
|
// blockPtr
|
|
|
// blockSize = Chunk/ChannelNum
|
|
@@ -103,17 +102,17 @@ public class DsfSourceStream : DsdAbstractSourceStream
|
|
|
var readCount = 0;
|
|
|
do
|
|
|
{
|
|
|
- var safeCount = Math.Min(_blockBuf.Length - readCount, _dataChunkEndOffset - _underlyingStream.Position);
|
|
|
+ var safeCount = Math.Min(_clusterBuf.Length - readCount, _dataChunkEndOffset - _underlyingStream.Position);
|
|
|
if (safeCount <= 0) break;
|
|
|
|
|
|
- var read = _underlyingStream.Read(_blockBuf, readCount, (int)safeCount);
|
|
|
+ var read = _underlyingStream.Read(_clusterBuf, readCount, (int)safeCount);
|
|
|
if (read == 0) break;
|
|
|
|
|
|
readCount += read;
|
|
|
- } while (readCount < _blockBuf.Length);
|
|
|
+ } while (readCount < _clusterBuf.Length);
|
|
|
|
|
|
- _blockBufSize = readCount;
|
|
|
- _blockPtrByChannel = 0;
|
|
|
+ _clusterBufSize = readCount;
|
|
|
+ _clusterPtrByChannel = 0;
|
|
|
|
|
|
return readCount != 0;
|
|
|
}
|
|
@@ -131,9 +130,9 @@ public class DsfSourceStream : DsdAbstractSourceStream
|
|
|
|
|
|
//Source L[BlockSizePerChannel] R[BlockSizePerChannel] L[BlockSizePerChannel] R[BlockSizePerChannel] -> Transfer LR LR LR LR
|
|
|
|
|
|
- if (_blockBufSize == 0)
|
|
|
+ if (_clusterBufSize == 0)
|
|
|
{
|
|
|
- if (ReadBlock() == false) return 0;
|
|
|
+ if (ReadCluster() == false) return 0;
|
|
|
}
|
|
|
|
|
|
var bytes = count / ChannelNum;
|
|
@@ -145,65 +144,30 @@ public class DsfSourceStream : DsdAbstractSourceStream
|
|
|
{
|
|
|
for (var ch = 0; ch < ChannelNum; ch++)
|
|
|
{
|
|
|
- var srcPtr = ch * BlockSizePerChannel + _blockPtrByChannel;
|
|
|
+ var srcPtr = ch * ClusterSizePerChannel + _clusterPtrByChannel;
|
|
|
|
|
|
- buffer[dstPtr] = _blockBuf[srcPtr];
|
|
|
+ buffer[dstPtr] = _clusterBuf[srcPtr];
|
|
|
|
|
|
++dstPtr;
|
|
|
}
|
|
|
|
|
|
- _blockPtrByChannel++;
|
|
|
+ _clusterPtrByChannel++;
|
|
|
|
|
|
- if (_blockPtrByChannel * ChannelNum == _blockBufSize)
|
|
|
+ if (_clusterPtrByChannel * ChannelNum == _clusterBufSize)
|
|
|
{
|
|
|
- if (!ReadBlock()) break;
|
|
|
+ if (!ReadCluster()) break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return dstPtr;
|
|
|
}
|
|
|
|
|
|
- public override long Seek(long offset, SeekOrigin origin)
|
|
|
- {
|
|
|
- var align = offset % (ChannelNum * BlockSizePerChannel);
|
|
|
- if (align != 0) offset -= align;
|
|
|
-
|
|
|
- var seekPosition = _underlyingStream.Position;
|
|
|
-
|
|
|
- switch (origin)
|
|
|
- {
|
|
|
- case SeekOrigin.Begin:
|
|
|
- seekPosition = _dataChunkBeginOffset + offset;
|
|
|
- break;
|
|
|
-
|
|
|
- case SeekOrigin.Current:
|
|
|
- seekPosition += offset;
|
|
|
- break;
|
|
|
-
|
|
|
- case SeekOrigin.End:
|
|
|
- seekPosition += _dataChunkEndOffset + offset;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- throw new ArgumentOutOfRangeException(nameof(origin), origin, null);
|
|
|
- }
|
|
|
-
|
|
|
- if (seekPosition < _dataChunkBeginOffset) seekPosition = _dataChunkBeginOffset;
|
|
|
- if (seekPosition > _dataChunkEndOffset) seekPosition = _dataChunkEndOffset;
|
|
|
-
|
|
|
- _underlyingStream.Position = seekPosition;
|
|
|
-
|
|
|
- //ReadBlock();
|
|
|
-
|
|
|
- return seekPosition;
|
|
|
- }
|
|
|
-
|
|
|
public override long Length => _dataSize;
|
|
|
|
|
|
public override long Position
|
|
|
{
|
|
|
get => _underlyingStream.Position - _dataChunkBeginOffset;
|
|
|
- set => Seek(value, SeekOrigin.Begin);
|
|
|
+ set => _underlyingStream.Position = _dataChunkBeginOffset + value - value % (ClusterSizePerChannel * ChannelNum);
|
|
|
}
|
|
|
|
|
|
protected override void Dispose(bool disposing)
|
|
@@ -211,8 +175,4 @@ public class DsfSourceStream : DsdAbstractSourceStream
|
|
|
base.Dispose(disposing);
|
|
|
if (_disposeStream) _underlyingStream.Dispose();
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
+}
|