From d632d5643d4650fa3e81466f4f9c069ed75e17ba Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sun, 10 Jan 2021 17:41:55 +0100 Subject: [PATCH] Relax IBStream reading even further And reset the seek position after reading. This new approach where we also read from empty IBStreams to provide a perfect proxy would otherwise cause plugins to crash in Bitwig when either loading or saving state. --- src/common/serialization/vst3/bstream.cpp | 27 +++++++++++------------ 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/common/serialization/vst3/bstream.cpp b/src/common/serialization/vst3/bstream.cpp index 3f054662..f21dc727 100644 --- a/src/common/serialization/vst3/bstream.cpp +++ b/src/common/serialization/vst3/bstream.cpp @@ -57,23 +57,22 @@ YaBStream::YaBStream(Steinberg::IBStream* stream) { // Copy any existing contents, used for `IComponent::setState` and similar // methods + int64 old_position; + stream->tell(&old_position); if (stream->seek(0, Steinberg::IBStream::IStreamSeekMode::kIBSeekEnd) == Steinberg::kResultOk) { - // Now that we're at the end of the stream we know how large the buffer - // should be - int64 size; - assert(stream->tell(&size) == Steinberg::kResultOk); - - int32 num_bytes_read = 0; - buffer.resize(size); - assert( - stream->seek(0, Steinberg::IBStream::IStreamSeekMode::kIBSeekSet) == - Steinberg::kResultOk); - - // Reading zero bytes will return `kResultFalse` in some implementations - stream->read(buffer.data(), size, &num_bytes_read); - assert(num_bytes_read == 0 || num_bytes_read == size); + int64 size = 0; + stream->tell(&size); + if (size > 0) { + int32 num_bytes_read = 0; + buffer.resize(size); + stream->seek(0, Steinberg::IBStream::IStreamSeekMode::kIBSeekSet); + stream->read(buffer.data(), size, &num_bytes_read); + assert(num_bytes_read == 0 || num_bytes_read == size); + } } + stream->seek(old_position, + Steinberg::IBStream::IStreamSeekMode::kIBSeekSet); // Starting at VST 3.6.0 streams provided by the host may contain context // based meta data