Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/audaspace/src/util/StreamBuffer.cpp')
-rw-r--r--extern/audaspace/src/util/StreamBuffer.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/extern/audaspace/src/util/StreamBuffer.cpp b/extern/audaspace/src/util/StreamBuffer.cpp
index b87b363377d..68d199d23a2 100644
--- a/extern/audaspace/src/util/StreamBuffer.cpp
+++ b/extern/audaspace/src/util/StreamBuffer.cpp
@@ -18,8 +18,12 @@
#include "util/BufferReader.h"
#include "util/Buffer.h"
+#include <algorithm>
+
// 5 sec * 48000 samples/sec * 4 bytes/sample * 6 channels
#define BUFFER_RESIZE_BYTES 5760000
+// 90 min * 60 sec/min * 48000 samples/sec * 4 bytes/sample * 2 channels
+#define MAXIMUM_INITIAL_BUFFER_SIZE_BYTES 2073600000
AUD_NAMESPACE_BEGIN
@@ -32,14 +36,15 @@ StreamBuffer::StreamBuffer(std::shared_ptr<ISound> sound) :
int sample_size = AUD_SAMPLE_SIZE(m_specs);
int length;
- int index = 0;
+ long long index = 0;
bool eos = false;
// get an approximated size if possible
- int size = reader->getLength();
+ long long size = std::min(reader->getLength(), MAXIMUM_INITIAL_BUFFER_SIZE_BYTES / sample_size);
+ long long size_increase = BUFFER_RESIZE_BYTES / sample_size;
if(size <= 0)
- size = BUFFER_RESIZE_BYTES / sample_size;
+ size = size_increase;
else
size += m_specs.rate;
@@ -47,13 +52,16 @@ StreamBuffer::StreamBuffer(std::shared_ptr<ISound> sound) :
while(!eos)
{
// increase
- m_buffer->resize(size*sample_size, true);
+ m_buffer->resize(static_cast<long long>(size) * sample_size, true);
// read more
length = size-index;
reader->read(length, eos, m_buffer->getBuffer() + index * m_specs.channels);
if(index == m_buffer->getSize() / sample_size)
- size += BUFFER_RESIZE_BYTES / sample_size;
+ {
+ size += size_increase;
+ size_increase <<= 1;
+ }
index += length;
}