18 BEGIN_NAMESPACE_MEMORY
23 template <
typename T,
typename Locking = UseLock>
26 static_assert(std::is_trivially_copyable_v<T>,
"Only trivially copyable types are supported in direct array source buffer.");
54 size_t readSamples(T* samples,
size_t samplesCount,
bool incrementPosition =
true)
override 56 return readSamplesAt(samples, samplesCount, incrementPosition, 0);
67 virtual size_t readSamplesAt(T* samples,
size_t samplesCount,
bool incrementPosition =
true,
size_t readOffset = 0)
75 readPos = (readPos + readOffset) % this->
getCapacity();
76 readOffset = std::min<size_t>(this->
getSize(), readOffset);
79 samplesCount = std::min<size_t>(samplesCount, this->
getSize() - readOffset);
85 read(samples, samplesCount, readPos);
90 read(samples, firstSamplesCount, readPos);
91 size_t secondSamplesCount = samplesCount - firstSamplesCount;
92 read(&samples[firstSamplesCount], secondSamplesCount, 0);
94 if (incrementPosition)
109 virtual size_t read(T* samples,
size_t samplesCount,
size_t pos)
111 std::memcpy(samples, &
getData()[pos], samplesCount *
sizeof(T));
121 virtual size_t read(T* samples,
size_t samplesCount)
130 template <
typename T>
133 static_assert(std::is_trivially_copyable_v<T>,
"Only trivially copyable types are supported in direct array target buffer.");
140 virtual T*
getData()
const = 0;
161 size_t writeSamples(
const T* samples,
size_t samplesCount,
bool incrementPosition =
true)
override 163 std::lock_guard<std::recursive_mutex> guard(this->
getLock());
167 if (samplesCount > 0)
171 write(samples, samplesCount);
176 write(samples, firstSamplesCount);
177 size_t secondSamplesCount = samplesCount - firstSamplesCount;
178 write(&samples[firstSamplesCount], secondSamplesCount, 0);
181 if (incrementPosition)
196 virtual size_t write(
const T* samples,
size_t samplesCount,
size_t pos)
198 std::memcpy(&
getData()[pos], samples, samplesCount *
sizeof(T));
208 virtual size_t write(
const T* samples,
size_t samplesCount)
216 template <
typename T>
217 static void operator<<(IDirectArrayTargetBuffer<T>& target,
ISourceBuffer<T>& source)
222 template <
typename T>
236 template <
typename T,
typename Locking = UseLock>
239 bool incrementPosition =
true,
240 size_t samplesCount = (std::numeric_limits<size_t>::max)())
247 if (samplesCount > 0)
257 size_t secondSamplesCount = samplesCount - firstSamplesCount;
261 if (incrementPosition)
268 template <
typename T>
274 template <
typename T>
289 template <
typename T>
292 bool incrementPosition =
true,
293 size_t samplesCount = (std::numeric_limits<size_t>::max)(),
294 bool earlyReleaseSourceLock =
false)
296 std::unique_lock<std::recursive_mutex> guardS(source.
getLock());
297 size_t sourceSize = source.
getSize();
301 if (earlyReleaseSourceLock)
304 std::lock_guard<std::recursive_mutex> guardT(target.
getLock());
306 samplesCount = std::min<size_t>(std::min<size_t>(samplesCount, sourceSize), target.
getRemainingSize());
308 if (samplesCount > 0)
310 if (sourceReadPos + samplesCount <= sourceCapacity)
316 size_t firstSamplesCount = sourceCapacity - sourceReadPos;
317 target.
writeSamples(&source.
getData()[sourceReadPos], firstSamplesCount, incrementPosition);
318 size_t secondSamplesCount = samplesCount - firstSamplesCount;
322 if (incrementPosition)
329 template <
typename T>
335 template <
typename T>
349 template <
typename T>
352 bool incrementPosition =
true,
353 size_t samplesCount = (std::numeric_limits<size_t>::max)())
virtual void incrementReadPosition(size_t pos)=0
Function increments read position for N samples.
virtual std::recursive_mutex & getLock()=0
Function return locking object.
virtual size_t read(T *samples, size_t samplesCount, size_t pos)
Implements read from buffer.
Definition: direct_array_buffer.h:109
Basic source buffer interface.
Definition: buffer.h:25
Interface to array-backed source buffers.
Definition: direct_array_buffer.h:24
virtual size_t write(const T *samples, size_t samplesCount, size_t pos)
Implements write into buffer.
Definition: direct_array_buffer.h:196
virtual size_t getCapacity() const =0
Function returns buffer capacity in samples.
virtual size_t read(T *samples, size_t samplesCount)
Function read from buffer from current location.
Definition: direct_array_buffer.h:121
size_t transferBuffer(ISourceBuffer< T > &source, IDirectArrayTargetBuffer< T > &target, bool incrementPosition=true, size_t samplesCount=(std::numeric_limits< size_t >::max)())
Transferring data from one buffer to another without intermediate buffer.
Definition: direct_array_buffer.h:237
Definition: lock_guard.h:29
virtual size_t getRemainingSize()=0
Function returns remaining size in samples.
virtual size_t getSize()=0
Function returns current buffer size in samples.
virtual void incrementWritePosition(size_t pos)=0
Function increments write position for N samples.
virtual size_t getReadPos()=0
Function returns current read position.
virtual size_t getCapacity() const =0
Function returns buffer capacity in samples.
Basic source and target buffer interface and data transferring operation.
size_t writeSamples(const T *samples, size_t samplesCount, bool incrementPosition=true) override
Function pushes the samples into buffer.
Definition: direct_array_buffer.h:161
Interface to array-backed target buffers.
Definition: direct_array_buffer.h:131
virtual size_t writeSamples(const T *samples, size_t samplesCount, bool incrementPosition=true)=0
Function pushes the samples into buffer.
virtual std::recursive_mutex & getLock()=0
Function return locking object.
virtual size_t getWritePos()=0
Function returns current write position.
virtual size_t readSamples(T *samples, size_t samplesCount, bool incrementPosition=true)=0
Function reads the samples from buffer.
virtual size_t write(const T *samples, size_t samplesCount)
Implements write into buffer to current location.
Definition: direct_array_buffer.h:208
virtual size_t readSamplesAt(T *samples, size_t samplesCount, bool incrementPosition=true, size_t readOffset=0)
Function reads the samples from buffer.
Definition: direct_array_buffer.h:67
Basic target buffer interface.
Definition: buffer.h:63
size_t readSamples(T *samples, size_t samplesCount, bool incrementPosition=true) override
Function reads the samples from buffer.
Definition: direct_array_buffer.h:54
virtual T * getData() const =0
Function returns pointer to the internal buffer.
virtual T * getData() const =0
Function returns pointer to the internal buffer.