diff --git a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp index 27803e0ddb..71011e457a 100644 --- a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp @@ -30,11 +30,11 @@ namespace juce namespace WindowsMediaCodec { -class JuceIStream : public ComBaseClassHelper +class JuceIStream : public ComBaseClassHelper { public: JuceIStream (InputStream& in) noexcept - : ComBaseClassHelper (0), source (in) + : ComBaseClassHelper (0), source (in) { } @@ -48,7 +48,7 @@ public: JUCE_COMRESULT Read (void* dest, ULONG numBytes, ULONG* bytesRead) { - auto numRead = source.read (dest, numBytes); + auto numRead = source.read (dest, (size_t) numBytes); if (bytesRead != nullptr) *bytesRead = numRead; diff --git a/modules/juce_core/streams/juce_InputStream.cpp b/modules/juce_core/streams/juce_InputStream.cpp index b63ac6918b..79c66ac916 100644 --- a/modules/juce_core/streams/juce_InputStream.cpp +++ b/modules/juce_core/streams/juce_InputStream.cpp @@ -33,6 +33,26 @@ int64 InputStream::getNumBytesRemaining() return len; } +ssize_t InputStream::read (void* destBuffer, size_t size) +{ + ssize_t totalRead = 0; + + while (size > 0) + { + auto numToRead = (int) std::min (size, (size_t) 0x70000000); + auto numRead = read (juce::addBytesToPointer (destBuffer, totalRead), numToRead); + jassert (numRead <= numToRead); + + if (numRead < 0) return (ssize_t) numRead; + if (numRead == 0) break; + + size -= (size_t) numRead; + totalRead += numRead; + } + + return totalRead; +} + char InputStream::readByte() { char temp = 0; diff --git a/modules/juce_core/streams/juce_InputStream.h b/modules/juce_core/streams/juce_InputStream.h index 38d5863d1d..8d7747953e 100644 --- a/modules/juce_core/streams/juce_InputStream.h +++ b/modules/juce_core/streams/juce_InputStream.h @@ -77,6 +77,8 @@ public: */ virtual int read (void* destBuffer, int maxBytesToRead) = 0; + ssize_t read (void* destBuffer, size_t maxBytesToRead); + /** Reads a byte from the stream. If the stream is exhausted, this will return zero. @see OutputStream::writeByte