PCMStream interface update
This commit is contained in:
parent
7c51e39dfe
commit
2fab1593c8
@ -46,7 +46,7 @@ std::shared_ptr<PCMStream> ALStream::getSource() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ALStream::preloadBuffer(uint buffer, bool loop) {
|
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)
|
if (!read)
|
||||||
return false;
|
return false;
|
||||||
ALenum format = AL::to_al_format(source->getChannels(), source->getBitsPerSample());
|
ALenum format = AL::to_al_format(source->getChannels(), source->getBitsPerSample());
|
||||||
|
|||||||
@ -18,6 +18,34 @@ namespace audio {
|
|||||||
|
|
||||||
using 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
|
/// @brief pcm source that does not initialize buffer
|
||||||
class PCMVoidSource : public PCMStream {
|
class PCMVoidSource : public PCMStream {
|
||||||
size_t totalSamples;
|
size_t totalSamples;
|
||||||
@ -33,11 +61,11 @@ public:
|
|||||||
seekable(seekable)
|
seekable(seekable)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
size_t read(char* buffer, size_t bufferSize, bool loop) override {
|
size_t read(char* buffer, size_t bufferSize) override {
|
||||||
if (closed) {
|
if (closed) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!seekable || loop) {
|
if (!seekable) {
|
||||||
return bufferSize;
|
return bufferSize;
|
||||||
}
|
}
|
||||||
size_t n = std::min(bufferSize, totalSamples);
|
size_t n = std::min(bufferSize, totalSamples);
|
||||||
|
|||||||
@ -72,8 +72,10 @@ namespace audio {
|
|||||||
/// @param loop loop stream (seek to start when end reached)
|
/// @param loop loop stream (seek to start when end reached)
|
||||||
/// @return size of data received
|
/// @return size of data received
|
||||||
/// (always equals bufferSize if seekable and looped)
|
/// (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
|
/// @brief Close stream
|
||||||
virtual void close()=0;
|
virtual void close()=0;
|
||||||
|
|
||||||
|
|||||||
@ -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) {
|
if (closed) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int bitstream = 0;
|
int bitstream = 0;
|
||||||
long bytes = 0;
|
long bytes = ov_read(&vf, buffer, bufferSize, 0, 2, true, &bitstream);
|
||||||
size_t size = 0;
|
if (bytes < 0) {
|
||||||
do {
|
std::cerr << "ogg::load_pcm: " << vorbis_error_message(bytes) << " " << bytes << std::endl;
|
||||||
do {
|
return 0;
|
||||||
bytes = ov_read(&vf, buffer, bufferSize, 0, 2, true, &bitstream);
|
}
|
||||||
if (bytes < 0) {
|
return bytes;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void close() {
|
void close() {
|
||||||
|
|||||||
@ -54,37 +54,16 @@ public:
|
|||||||
initialPosition = in.tellg();
|
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()) {
|
if (!isOpen()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
long bytes = 0;
|
in.read(buffer, bufferSize);
|
||||||
size_t size = 0;
|
if (in.failbit) {
|
||||||
do {
|
std::cerr << "Wav::load_pcm: I/O error ocurred" << std::endl;
|
||||||
do {
|
return 0;
|
||||||
in.read(buffer, bufferSize);
|
}
|
||||||
if (in.failbit) {
|
return in.gcount();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void close() override {
|
void close() override {
|
||||||
@ -224,7 +203,7 @@ audio::PCM* wav::load_pcm(const std::filesystem::path& file, bool headerOnly) {
|
|||||||
(stream->getBitsPerSample()/8) *
|
(stream->getBitsPerSample()/8) *
|
||||||
stream->getChannels();
|
stream->getChannels();
|
||||||
data.resize(size);
|
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);
|
return new audio::PCM(std::move(data), totalSamples, channels, bitsPerSample, sampleRate, true);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user