File: BufferedStreamReader.cpp

package info (click to toggle)
audacity 3.7.7%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 134,800 kB
  • sloc: cpp: 366,277; ansic: 198,323; lisp: 7,761; sh: 3,414; python: 1,501; xml: 1,385; perl: 854; makefile: 125
file content (79 lines) | stat: -rw-r--r-- 1,746 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**********************************************************************

  Audacity: A Digital Audio Editor

  BufferedStreamReader.cpp

  Dmitry Vedenko

**********************************************************************/

#include "BufferedStreamReader.h"

#include <algorithm>
#include <memory>
#include <cstring>

BufferedStreamReader::BufferedStreamReader(size_t bufferSize)
    : mBufferSize(std::max(bufferSize, RequiredAlignment))
{
   mBufferData.resize(mBufferSize + RequiredAlignment);

   auto ptr = static_cast<void*>(mBufferData.data());
   auto space = mBufferData.size();

   std::align(RequiredAlignment, mBufferSize, ptr, space);

   mBufferStart = static_cast<uint8_t*>(ptr);
}

size_t BufferedStreamReader::Read(void* buffer, size_t maxBytes)
{
   size_t bytesWritten = 0;

   while (maxBytes > 0)
   {
      if (mCurrentBytes == mCurrentIndex)
      {
         if (!HandleUnderflow())
            return bytesWritten;
      }

      const size_t availableBytes = mCurrentBytes - mCurrentIndex;
      const size_t bytesToRead = std::min(maxBytes, availableBytes);

      std::memcpy(static_cast<uint8_t*>(buffer) + bytesWritten, mBufferStart + mCurrentIndex, bytesToRead);

      maxBytes -= bytesToRead;
      bytesWritten += bytesToRead;
      mCurrentIndex += bytesToRead;
   }

   return bytesWritten;
}

bool BufferedStreamReader::Eof() const
{
   return mCurrentBytes == mCurrentIndex && !HasMoreData();
}

int BufferedStreamReader::GetC()
{
   uint8_t value = 0;

   if (ReadValue(value))
      return value;

   return -1;
}

bool BufferedStreamReader::HandleUnderflow()
{
   if (!HasMoreData())
      return false;

   mCurrentBytes = ReadData(mBufferStart, mBufferSize);
   mCurrentIndex = 0;

   return true;
}