Coder 8 місяців тому
батько
коміт
e8dc4dbe29
1 змінених файлів з 22 додано та 62 видалено
  1. 22 62
      Bmp.Core/Playback/Inputs/DsfSourceStream.cs

+ 22 - 62
Bmp.Core/Playback/Inputs/DsfSourceStream.cs

@@ -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();
     }
-
-  
-
-  
-}
+}