From 7cb0fe9dad9f7ef24d1142d866450305102bf3a9 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sat, 7 Jul 2018 02:03:01 +0200 Subject: sequencer API to turn tracks on/off/solo --- src/midi_sequencer_impl.hpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'src/midi_sequencer_impl.hpp') diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index ce70c3e..d8edbfb 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -271,7 +271,8 @@ BW_MidiSequencer::BW_MidiSequencer() : m_atEnd(false), m_loopStart(false), m_loopEnd(false), - m_invalidLoop(false) + m_invalidLoop(false), + m_trackSolo(~(size_t)0) {} BW_MidiSequencer::~BW_MidiSequencer() @@ -307,6 +308,25 @@ BW_MidiSequencer::FileFormat BW_MidiSequencer::getFormat() return m_format; } +size_t BW_MidiSequencer::getTrackCount() const +{ + return m_trackData.size(); +} + +bool BW_MidiSequencer::setTrackEnabled(size_t track, bool enable) +{ + size_t trackCount = m_trackData.size(); + if(track >= trackCount) + return false; + m_trackDisable[track] = !enable; + return true; +} + +void BW_MidiSequencer::setSoloTrack(size_t track) +{ + m_trackSolo = track; +} + const std::vector BW_MidiSequencer::getRawCmfInstruments() { return m_cmfInstruments; @@ -362,6 +382,8 @@ bool BW_MidiSequencer::buildTrackData(const std::vector > & m_fullSongTimeLength = 0.0; m_loopStartTime = -1.0; m_loopEndTime = -1.0; + m_trackDisable.clear(); + m_trackSolo = ~(size_t)0; m_musTitle.clear(); m_musCopyright.clear(); m_musTrackTitles.clear(); @@ -369,6 +391,7 @@ bool BW_MidiSequencer::buildTrackData(const std::vector > & m_trackData.clear(); const size_t trackCount = trackData.size(); m_trackData.resize(trackCount, MidiTrackQueue()); + m_trackDisable.resize(trackCount); m_invalidLoop = false; bool gotLoopStart = false, gotLoopEnd = false, gotLoopEventInThisRow = false; @@ -1122,6 +1145,11 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEvent &evt, int32_t &status) { + if(m_trackSolo != ~(size_t)0 && track != m_trackSolo) + return; + if(m_trackDisable[track]) + return; + if(m_interface->onEvent) { m_interface->onEvent(m_interface->onEvent_userData, -- cgit v1.2.3