PCMStream interface update

This commit is contained in:
MihailRis 2024-03-01 14:27:04 +03:00
parent 7c51e39dfe
commit 2fab1593c8
5 changed files with 50 additions and 61 deletions

View File

@ -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());

View File

@ -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);

View File

@ -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;

View File

@ -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() {

View File

@ -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);
}