@@ -90,7 +90,7 @@ class Midi1ToBytestreamTranslator
9090 if (Utils::getMessageType (firstWord) != 0x00 )
9191 {
9292 const auto message = fromUmp (PacketX1 { firstWord }, time);
93- callback ( message);
93+ dispatchMessage (callback, message);
9494 }
9595
9696 break ;
@@ -187,10 +187,29 @@ class Midi1ToBytestreamTranslator
187187 void terminateSysExMessage (MessageCallback&& callback)
188188 {
189189 pendingSysExData.push_back (std::byte { 0xf7 });
190- callback (BytestreamMidiView (pendingSysExData, pendingSysExTime).getMessage ());
190+ const BytestreamMidiView view (pendingSysExData, pendingSysExTime);
191+ dispatchMessage (callback, view);
191192 pendingSysExData.clear ();
192193 }
193194
195+ template <typename MessageCallback>
196+ static void dispatchMessage (MessageCallback&& callback, const MidiMessage& message)
197+ {
198+ if constexpr (std::is_invocable_v<MessageCallback, const MidiMessage&>)
199+ callback (message);
200+ else
201+ callback (BytestreamMidiView (&message));
202+ }
203+
204+ template <typename MessageCallback>
205+ static void dispatchMessage (MessageCallback&& callback, const BytestreamMidiView& view)
206+ {
207+ if constexpr (std::is_invocable_v<MessageCallback, const MidiMessage&>)
208+ callback (view.getMessage ());
209+ else
210+ callback (view);
211+ }
212+
194213 static bool shouldPacketTerminateSysExEarly (uint32_t firstWord)
195214 {
196215 return ! (isSysExContinuation (firstWord)
0 commit comments