From 2fab1593c83f49ef735116ea9c3e5caf8e885e11 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 1 Mar 2024 14:27:04 +0300 Subject: [PATCH] PCMStream interface update --- src/audio/AL/ALAudio.cpp | 2 +- src/audio/audio.cpp | 32 ++++++++++++++++++++++++++++++-- src/audio/audio.h | 6 ++++-- src/coders/ogg.cpp | 34 +++++++--------------------------- src/coders/wav.cpp | 37 ++++++++----------------------------- 5 files changed, 50 insertions(+), 61 deletions(-) diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp index 1a12034a..464dd12a 100644 --- a/src/audio/AL/ALAudio.cpp +++ b/src/audio/AL/ALAudio.cpp @@ -46,7 +46,7 @@ std::shared_ptr 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()); diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 5dc3cd58..dc12f93c 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -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); diff --git a/src/audio/audio.h b/src/audio/audio.h index 9e924946..7b14c652 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -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; diff --git a/src/coders/ogg.cpp b/src/coders/ogg.cpp index a420a93c..90ac0ef1 100644 --- a/src/coders/ogg.cpp +++ b/src/coders/ogg.cpp @@ -83,37 +83,17 @@ public: } } - size_t read(char* buffer, size_t bufferSize, bool loop) { + size_t read(char* buffer, size_t bufferSize) override { if (closed) { return 0; } int bitstream = 0; - long bytes = 0; - size_t size = 0; - do { - do { - bytes = ov_read(&vf, buffer, bufferSize, 0, 2, true, &bitstream); - if (bytes < 0) { - std::cerr << "ogg::load_pcm: " << vorbis_error_message(bytes) << " " << bytes << std::endl; - continue; - } - 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; + long bytes = ov_read(&vf, buffer, bufferSize, 0, 2, true, &bitstream); + if (bytes < 0) { + std::cerr << "ogg::load_pcm: " << vorbis_error_message(bytes) << " " << bytes << std::endl; + return 0; + } + return bytes; } void close() { diff --git a/src/coders/wav.cpp b/src/coders/wav.cpp index ad3c1599..c483b8b2 100644 --- a/src/coders/wav.cpp +++ b/src/coders/wav.cpp @@ -54,37 +54,16 @@ public: initialPosition = in.tellg(); } - size_t read(char* buffer, size_t bufferSize, bool loop) override { + size_t read(char* buffer, size_t bufferSize) override { if (!isOpen()) { return 0; } - long bytes = 0; - size_t size = 0; - do { - do { - in.read(buffer, bufferSize); - if (in.failbit) { - std::cerr << "Wav::load_pcm: I/O error ocurred" << std::endl; - continue; - } - bytes = in.gcount(); - 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; + in.read(buffer, bufferSize); + if (in.failbit) { + std::cerr << "Wav::load_pcm: I/O error ocurred" << std::endl; + return 0; + } + return in.gcount(); } void close() override { @@ -224,7 +203,7 @@ audio::PCM* wav::load_pcm(const std::filesystem::path& file, bool headerOnly) { (stream->getBitsPerSample()/8) * stream->getChannels(); data.resize(size); - stream->read(data.data(), size, false); + stream->readFully(data.data(), size, false); } return new audio::PCM(std::move(data), totalSamples, channels, bitsPerSample, sampleRate, true); }