PCMStream interface update
This commit is contained in:
@@ -46,7 +46,7 @@ std::shared_ptr<PCMStream> ALStream::getSource() const {
|
||||
}
|
||||
|
||||
bool ALStream::preloadBuffer(uint buffer, bool loop) {
|
||||
size_t read = source->read(this->buffer, BUFFER_SIZE, loop);
|
||||
size_t read = source->readFully(this->buffer, BUFFER_SIZE, loop);
|
||||
if (!read)
|
||||
return false;
|
||||
ALenum format = AL::to_al_format(source->getChannels(), source->getBitsPerSample());
|
||||
|
||||
+30
-2
@@ -18,6 +18,34 @@ namespace audio {
|
||||
|
||||
using namespace audio;
|
||||
|
||||
size_t PCMStream::readFully(char* buffer, size_t bufferSize, bool loop) {
|
||||
if (!isOpen()) {
|
||||
return 0;
|
||||
}
|
||||
long bytes = 0;
|
||||
size_t size = 0;
|
||||
do {
|
||||
do {
|
||||
bytes = read(buffer, bufferSize);
|
||||
size += bytes;
|
||||
bufferSize -= bytes;
|
||||
buffer += bytes;
|
||||
} while (bytes > 0 && bufferSize > 0);
|
||||
|
||||
if (bufferSize == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (loop) {
|
||||
seek(0);
|
||||
}
|
||||
if (bufferSize == 0) {
|
||||
return size;
|
||||
}
|
||||
} while (loop);
|
||||
return size;
|
||||
}
|
||||
|
||||
/// @brief pcm source that does not initialize buffer
|
||||
class PCMVoidSource : public PCMStream {
|
||||
size_t totalSamples;
|
||||
@@ -33,11 +61,11 @@ public:
|
||||
seekable(seekable)
|
||||
{}
|
||||
|
||||
size_t read(char* buffer, size_t bufferSize, bool loop) override {
|
||||
size_t read(char* buffer, size_t bufferSize) override {
|
||||
if (closed) {
|
||||
return 0;
|
||||
}
|
||||
if (!seekable || loop) {
|
||||
if (!seekable) {
|
||||
return bufferSize;
|
||||
}
|
||||
size_t n = std::min(bufferSize, totalSamples);
|
||||
|
||||
+4
-2
@@ -72,8 +72,10 @@ namespace audio {
|
||||
/// @param loop loop stream (seek to start when end reached)
|
||||
/// @return size of data received
|
||||
/// (always equals bufferSize if seekable and looped)
|
||||
virtual size_t read(char* buffer, size_t bufferSize, bool loop)=0;
|
||||
|
||||
virtual size_t readFully(char* buffer, size_t bufferSize, bool loop);
|
||||
|
||||
virtual size_t read(char* buffer, size_t bufferSize) = 0;
|
||||
|
||||
/// @brief Close stream
|
||||
virtual void close()=0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user