diff --git a/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp b/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp index 43ab4c175f..9319ab92e8 100644 --- a/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp @@ -26,12 +26,12 @@ namespace MidiBufferHelpers { inline int getEventTime (const void* const d) noexcept { - return *static_cast (d); + return readUnaligned (d); } inline uint16 getEventDataSize (const void* const d) noexcept { - return *reinterpret_cast (static_cast (d) + sizeof (int32)); + return readUnaligned (static_cast (d) + sizeof (int32)); } inline uint16 getEventTotalSize (const void* const d) noexcept @@ -124,8 +124,8 @@ void MidiBuffer::addEvent (const void* const newData, const int maxBytes, const data.insertMultiple (offset, 0, (int) newItemSize); uint8* const d = data.begin() + offset; - *reinterpret_cast (d) = sampleNumber; - *reinterpret_cast (d + 4) = (uint16) numBytes; + writeUnaligned (d, sampleNumber); + writeUnaligned (d + 4, static_cast (numBytes)); memcpy (d + 6, newData, (size_t) numBytes); } } diff --git a/modules/juce_core/memory/juce_Memory.h b/modules/juce_core/memory/juce_Memory.h index 72fec6bb63..fd58ebb609 100644 --- a/modules/juce_core/memory/juce_Memory.h +++ b/modules/juce_core/memory/juce_Memory.h @@ -64,6 +64,24 @@ inline int getAddressDifference (Type1* pointer1, Type2* pointer2) noexcept { r template inline Type* createCopyIfNotNull (const Type* objectToCopy) { return objectToCopy != nullptr ? new Type (*objectToCopy) : nullptr; } +//============================================================================== +/** A handy function to read un-aligned memory without a performance penalty or bus-error. */ +template +inline Type readUnaligned (const void* srcPtr) noexcept +{ + Type value; + memcpy (&value, srcPtr, sizeof (Type)); + + return value; +} + +/** A handy function to write un-aligned memory without a performance penalty or bus-error. */ +template +inline void writeUnaligned (void* dstPtr, Type value) noexcept +{ + memcpy (dstPtr, &value, sizeof(Type)); +} + //============================================================================== #if JUCE_MAC || JUCE_IOS || DOXYGEN