From 835216c5816ad4278f74f226bdd0bca9676231a4 Mon Sep 17 00:00:00 2001 From: reuk Date: Thu, 6 Mar 2025 16:46:03 +0000 Subject: [PATCH] MIDI: Use Spans instead of pointer pairs in more places --- .../midi/ump/juce_UMPDispatcher.h | 20 +++--- .../midi/ump/juce_UMP_test.cpp | 65 +++++++------------ .../ump/juce_UMPBytestreamInputHandler.h | 4 +- .../midi_io/ump/juce_UMPU32InputHandler.h | 10 +-- .../native/juce_CoreMidi_mac.mm | 4 +- .../juce_audio_plugin_client_AU_1.mm | 4 +- .../juce_audio_plugin_client_AUv3.mm | 4 +- 7 files changed, 45 insertions(+), 66 deletions(-) diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h b/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h index f0e5ff11bb..a05de2b3f8 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h @@ -55,12 +55,11 @@ public: continue from that point in the packet (unless `reset` is called first). */ template - void dispatch (const uint32_t* begin, - const uint32_t* end, + void dispatch (Span words, double timeStamp, PacketCallbackFunction&& callback) { - std::for_each (begin, end, [&] (uint32_t word) + for (const auto word : words) { nextPacket[currentPacketLen++] = word; @@ -69,7 +68,7 @@ public: callback (View (nextPacket.data()), timeStamp); currentPacketLen = 0; } - }); + } } private: @@ -106,14 +105,12 @@ public: /** Calls `callback` with a View of each converted packet as it becomes ready. - @param begin the first byte in a range of bytes representing bytestream-encoded MIDI messages. - @param end one-past the last byte in a range of bytes representing bytestream-encoded MIDI messages. + @param bytes range of bytes representing bytestream-encoded MIDI messages. @param timestamp a timestamp to apply to the created packets. @param callback a callback which will be passed a View pointing to each new packet as it becomes ready. */ template - void dispatch (const uint8_t* begin, - const uint8_t* end, + void dispatch (Span bytes, double timestamp, PacketCallbackFunction&& callback) { @@ -139,7 +136,7 @@ public: }; Callback inputCallback { *this, &callback }; - concatenator.pushMidiData (begin, int (end - begin), timestamp, (void*) nullptr, inputCallback); + concatenator.pushMidiData (bytes, timestamp, (void*) nullptr, inputCallback); } private: @@ -181,12 +178,11 @@ public: @param callback a callback which will be passed a MidiMessage each time a new message becomes ready. */ template - void dispatch (const uint32_t* begin, - const uint32_t* end, + void dispatch (Span words, double timestamp, BytestreamMessageCallback&& callback) { - dispatcher.dispatch (begin, end, timestamp, [&] (const View& view, double time) + dispatcher.dispatch (words, timestamp, [&] (const View& view, double time) { converter.convert (view, time, callback); }); diff --git a/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp b/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp index 06ca570a8e..be6f1a0195 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp +++ b/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp @@ -67,12 +67,10 @@ public: ? Utils::MessageKind::commonRealtime : Utils::MessageKind::channelVoice1)); - translator.dispatch (View {packets.data() }, - 0, - [&] (const BytestreamMidiView& roundTripped) - { - expect (equal (m, roundTripped.getMessage())); - }); + translator.dispatch (View { packets.data() }, 0, [&] (const BytestreamMidiView& roundTripped) + { + expect (equal (m, roundTripped.getMessage())); + }); }); } @@ -146,13 +144,10 @@ public: Conversion::toMidi1 (ump::BytestreamMidiView (meta), [&] (const auto p) { packets.add (p); }); MidiBuffer output; - converter.dispatch (packets.data(), - packets.data() + packets.size(), - 0, - [&] (const BytestreamMidiView& roundTripped) - { - output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); - }); + converter.dispatch (packets, 0, [&] (const BytestreamMidiView& roundTripped) + { + output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); + }); packets.clear(); expect (equal (expected, output)); @@ -189,13 +184,10 @@ public: } MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const BytestreamMidiView& roundTripped) - { - output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); - }); + converter.dispatch (modifiedPackets, 0, [&] (const BytestreamMidiView& roundTripped) + { + output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); + }); // All Utility messages should have been ignored expect (output.getNumEvents() == 1); @@ -227,13 +219,10 @@ public: } MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const BytestreamMidiView& roundTripped) - { - output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); - }); + converter.dispatch (modifiedPackets, 0, [&] (const BytestreamMidiView& roundTripped) + { + output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); + }); const auto numOutputs = output.getNumEvents(); const auto numInputs = realtimeMessages.getNumEvents(); @@ -294,13 +283,10 @@ public: } MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const BytestreamMidiView& roundTripped) - { - output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); - }); + converter.dispatch (modifiedPackets, 0, [&] (const BytestreamMidiView& roundTripped) + { + output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); + }); const auto numOutputs = output.getNumEvents(); const auto numInputs = realtimeMessages.getNumEvents(); @@ -377,13 +363,10 @@ public: const auto pushToOutput = [&] (const Packets& p) { - converter.dispatch (p.data(), - p.data() + p.size(), - 0, - [&] (const BytestreamMidiView& roundTripped) - { - output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); - }); + converter.dispatch (p, 0, [&] (const BytestreamMidiView& roundTripped) + { + output.addEvent (roundTripped.getMessage(), int (roundTripped.timestamp)); + }); }; pushToOutput (modifiedPackets); diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h index 54fd6b5f1e..86273c20f8 100644 --- a/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h +++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h @@ -136,8 +136,8 @@ struct BytestreamToUMPHandler : public BytestreamInputHandler void pushMidiData (const void* data, int bytes, double time) override { - const auto* ptr = static_cast (data); - dispatcher.dispatch (ptr, ptr + bytes, time, [&] (const View& v) + const auto* ptr = static_cast (data); + dispatcher.dispatch (Span { ptr, (size_t) bytes }, time, [&] (const View& v) { recipient.packetReceived (v, time); }); diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h index 4933524e21..c6d41ff539 100644 --- a/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h +++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h @@ -47,7 +47,7 @@ struct U32InputHandler virtual ~U32InputHandler() noexcept = default; virtual void reset() = 0; - virtual void pushMidiData (const uint32_t* begin, const uint32_t* end, double time) = 0; + virtual void pushMidiData (Span, double time) = 0; }; /** @@ -89,9 +89,9 @@ struct U32ToBytestreamHandler : public U32InputHandler void reset() override { dispatcher.reset(); } - void pushMidiData (const uint32_t* begin, const uint32_t* end, double time) override + void pushMidiData (Span words, double time) override { - dispatcher.dispatch (begin, end, time, [this] (const BytestreamMidiView& m) + dispatcher.dispatch (words, time, [this] (const BytestreamMidiView& m) { callback.handleIncomingMidiMessage (&input, m.getMessage()); }); @@ -142,9 +142,9 @@ struct U32ToUMPHandler : public U32InputHandler converter.reset(); } - void pushMidiData (const uint32_t* begin, const uint32_t* end, double time) override + void pushMidiData (Span words, double time) override { - dispatcher.dispatch (begin, end, time, [this] (const View& view, double thisTime) + dispatcher.dispatch (words, time, [this] (const View& view, double thisTime) { converter.convert (view, [&] (const View& converted) { diff --git a/modules/juce_audio_devices/native/juce_CoreMidi_mac.mm b/modules/juce_audio_devices/native/juce_CoreMidi_mac.mm index c704e2afc8..0092922495 100644 --- a/modules/juce_audio_devices/native/juce_CoreMidi_mac.mm +++ b/modules/juce_audio_devices/native/juce_CoreMidi_mac.mm @@ -641,8 +641,8 @@ namespace CoreMidiHelpers static_assert (sizeof (uint32_t) == sizeof (UInt32) && alignof (uint32_t) == alignof (UInt32), "If this fails, the cast below will be broken too!"); - u32InputHandler->pushMidiData (reinterpret_cast (packet->words), - reinterpret_cast (packet->words + packet->wordCount), + u32InputHandler->pushMidiData ({ reinterpret_cast (packet->words), + (size_t) packet->wordCount }, time); packet = MIDIEventPacketNext (packet); diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm index e1a22253c1..26c62bb7c6 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm @@ -1593,8 +1593,8 @@ public: for (uint32_t i = 0; i < list->numPackets; ++i) { - toBytestreamDispatcher.dispatch (reinterpret_cast (packet->words), - reinterpret_cast (packet->words + packet->wordCount), + toBytestreamDispatcher.dispatch ({ reinterpret_cast (packet->words), + (size_t) packet->wordCount }, static_cast (packet->timeStamp + inOffsetSampleFrame), [this] (const ump::BytestreamMidiView& message) { diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm index 3951a15ed8..6d1ce73460 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm @@ -1486,8 +1486,8 @@ private: for (uint32_t i = 0; i < list.numPackets; ++i) { - converter.dispatch (reinterpret_cast (packet->words), - reinterpret_cast (packet->words + packet->wordCount), + converter.dispatch ({ reinterpret_cast (packet->words), + (size_t) packet->wordCount }, static_cast (packet->timeStamp - (MIDITimeStamp) startTime), [this] (const ump::BytestreamMidiView& message) {