From 4c2f53ea784b04356b3688ed676abb471af1bbdc Mon Sep 17 00:00:00 2001 From: Arjan van Vught Date: Fri, 24 Jan 2025 16:39:53 +0100 Subject: [PATCH] #297 - source=midi is now working --- lib-ltc/.settings/language.settings.xml | 2 +- lib-ltc/include/arm/ltcoutputs.h | 3 ++- lib-ltc/include/arm/midireader.h | 6 +++--- lib-ltc/src/arm/ltcoutputs.cpp | 11 +++++----- lib-ltc/src/arm/midireader.cpp | 28 ++++++++++++++----------- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/lib-ltc/.settings/language.settings.xml b/lib-ltc/.settings/language.settings.xml index 1cf55e05b..6d50147dc 100644 --- a/lib-ltc/.settings/language.settings.xml +++ b/lib-ltc/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/lib-ltc/include/arm/ltcoutputs.h b/lib-ltc/include/arm/ltcoutputs.h index 15d5b8289..64e8b5118 100755 --- a/lib-ltc/include/arm/ltcoutputs.h +++ b/lib-ltc/include/arm/ltcoutputs.h @@ -32,7 +32,7 @@ class LtcOutputs { public: LtcOutputs(const ltc::Source source, const bool bShowSysTime); - void Init(); + void Init(const bool bDisableRtpMidi = false); void Update(const struct ltc::TimeCode *ptLtcTimeCode); void ShowSysTime(); @@ -51,6 +51,7 @@ class LtcOutputs { private: bool m_bShowSysTime; bool m_bMidiQuarterFramePieceRunning { false }; + bool m_bEnableRtpMidi { false }; ltc::Type m_TypePrevious { ltc::Type::INVALID }; int32_t m_nSecondsPrevious { 60 }; diff --git a/lib-ltc/include/arm/midireader.h b/lib-ltc/include/arm/midireader.h index 8489d1615..416436f04 100755 --- a/lib-ltc/include/arm/midireader.h +++ b/lib-ltc/include/arm/midireader.h @@ -2,7 +2,7 @@ * @file midireader.h * */ -/* Copyright (C) 2019-2024 by Arjan van Vught mailto:info@gd32-dmx.org +/* Copyright (C) 2019-2025 by Arjan van Vught mailto:info@gd32-dmx.org * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -42,11 +42,11 @@ class MidiReader { void Update(); private: + uint32_t m_nMtcQfFramePrevious { 0 }; + uint32_t m_nMtcQfFramesDelta { 0 }; midi::TimecodeType m_TimeCodeType { midi::TimecodeType::UNKNOWN }; uint8_t m_nPartPrevious { 0 }; bool m_bDirection { true }; - uint32_t m_nMtcQfFramePrevious { 0 }; - uint32_t m_nMtcQfFramesDelta { 0 }; MidiBPM m_MidiBPM; }; diff --git a/lib-ltc/src/arm/ltcoutputs.cpp b/lib-ltc/src/arm/ltcoutputs.cpp index 6194011d5..5b38d067c 100755 --- a/lib-ltc/src/arm/ltcoutputs.cpp +++ b/lib-ltc/src/arm/ltcoutputs.cpp @@ -162,14 +162,15 @@ LtcOutputs::LtcOutputs(const ltc::Source source, const bool bShowSysTime): m_bSh DEBUG_EXIT } -void LtcOutputs::Init() { +void LtcOutputs::Init(const bool bDisableRtpMidi) { DEBUG_ENTRY + m_bEnableRtpMidi = ltc::Destination::IsEnabled(ltc::Destination::Output::RTPMIDI) && !bDisableRtpMidi; m_TypePrevious = ltc::Type::INVALID; m_bMidiQuarterFramePieceRunning = false; sv_nMidiQuarterFramePiece = 0; - if (ltc::Destination::IsEnabled(ltc::Destination::Output::RTPMIDI) || ltc::Destination::IsEnabled(ltc::Destination::Output::MIDI)) { + if (m_bEnableRtpMidi || ltc::Destination::IsEnabled(ltc::Destination::Output::MIDI)) { #if defined (H3) irq_timer_set(IRQ_TIMER_1, static_cast(irq_timer1_midi_handler)); #elif defined (GD32) @@ -201,7 +202,7 @@ void LtcOutputs::Update(const struct ltc::TimeCode *pLtcTimeCode) { m_bMidiQuarterFramePieceRunning = false; sv_nMidiQuarterFramePiece = 0; - if (ltc::Destination::IsEnabled(ltc::Destination::Output::RTPMIDI)) { + if (m_bEnableRtpMidi) { RtpMidi::Get()->SendTimeCode(reinterpret_cast(pLtcTimeCode)); } @@ -238,7 +239,7 @@ void LtcOutputs::Update(const struct ltc::TimeCode *pLtcTimeCode) { const auto data = create_quarter_frame(reinterpret_cast(pLtcTimeCode)); - if (ltc::Destination::IsEnabled(ltc::Destination::Output::RTPMIDI)) { + if (m_bEnableRtpMidi) { RtpMidi::Get()->SendQf(data); } @@ -257,7 +258,7 @@ void LtcOutputs::Update(const struct ltc::TimeCode *pLtcTimeCode) { __DMB(); } - m_bMidiQuarterFramePieceRunning = true; + m_bMidiQuarterFramePieceRunning = (m_bEnableRtpMidi || ltc::Destination::IsEnabled(ltc::Destination::Output::MIDI)); if (ltc::Destination::IsEnabled(ltc::Destination::Output::NTP_SERVER)) { NtpServer::Get()->SetTimeCode(pLtcTimeCode); diff --git a/lib-ltc/src/arm/midireader.cpp b/lib-ltc/src/arm/midireader.cpp index f2174560f..02cbef7d6 100644 --- a/lib-ltc/src/arm/midireader.cpp +++ b/lib-ltc/src/arm/midireader.cpp @@ -48,11 +48,14 @@ #include "ltcsender.h" #include "artnetnode.h" #include "ltcetc.h" +#include "net/rtpmidi.h" #include "arm/ltcmidisystemrealtime.h" #include "arm/ltcoutputs.h" #include "arm/platform_ltc.h" +#include "debug.h" + static uint8_t s_qf[8] __attribute__ ((aligned (4))) = { 0, 0, 0, 0, 0, 0, 0, 0 }; #if defined (H3) @@ -74,6 +77,9 @@ void MidiReader::Start() { #endif Midi::Get()->Init(midi::Direction::INPUT); + LtcOutputs::Get()->Init(true); + Hardware::Get()->SetMode(hardware::ledblink::Mode::NORMAL); + DEBUG_EXIT } @@ -93,6 +99,10 @@ void MidiReader::HandleMtc() { g_ltc_LtcTimeCode.nFrames = pSystemExclusive[8]; g_ltc_LtcTimeCode.nType = static_cast(pSystemExclusive[5] >> 5); + if (ltc::Destination::IsEnabled(ltc::Destination::Output::RTPMIDI)) { + RtpMidi::Get()->SendTimeCode(reinterpret_cast(&g_ltc_LtcTimeCode)); + } + Update(); gv_ltc_bTimeCodeAvailable = false; @@ -101,6 +111,11 @@ void MidiReader::HandleMtc() { void MidiReader::HandleMtcQf() { uint8_t nData1, nData2; Midi::Get()->GetMessageData(nData1, nData2); + + if (ltc::Destination::IsEnabled(ltc::Destination::Output::RTPMIDI)) { + RtpMidi::Get()->SendQf(nData1); + } + const auto nPart = static_cast((nData1 & 0x70) >> 4); s_qf[nPart] = nData1 & 0x0F; @@ -138,7 +153,7 @@ void MidiReader::HandleMtcQf() { #if defined (H3) H3_TIMER->TMR1_CTRL |= TIMER_CTRL_SINGLE_MODE; H3_TIMER->TMR1_INTV = TimeCodeConst::TMR_INTV[g_ltc_LtcTimeCode.nType]; - H3_TIMER->TMR1_CTRL |= (TIMER_CTRL_EN_START | TIMER_CTRL_RELOAD); + H3_TIMER->TMR1_CTRL |= (TIMER_CTRL_EN_START); #elif defined (GD32) platform::ltc::timer11_set_type(g_ltc_LtcTimeCode.nType); #endif @@ -245,17 +260,6 @@ void MidiReader::Run() { } Update(); - - if (m_nMtcQfFramesDelta == 2) { - m_nMtcQfFramesDelta = 0; -#if defined (H3) - H3_TIMER->TMR1_CTRL |= TIMER_CTRL_SINGLE_MODE; - H3_TIMER->TMR1_INTV = TimeCodeConst::TMR_INTV[g_ltc_LtcTimeCode.nType]; - H3_TIMER->TMR1_CTRL |= (TIMER_CTRL_EN_START | TIMER_CTRL_RELOAD); -#elif defined (GD32) - platform::ltc::timer11_set_type(g_ltc_LtcTimeCode.nType); -#endif - } } if (Midi::Get()->GetUpdatesPerSecond() != 0) {