Skip to content

Commit

Permalink
More fixes to rewind on Jack transport
Browse files Browse the repository at this point in the history
  • Loading branch information
gvnnz committed Jun 13, 2020
1 parent b12c649 commit 062ccb5
Show file tree
Hide file tree
Showing 9 changed files with 67 additions and 36 deletions.
1 change: 0 additions & 1 deletion src/core/channels/sampleController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ void SampleController::parse(const mixer::Event& e) const
kill(e.delta); break;

case mixer::EventType::SEQUENCER_FIRST_BEAT:
case mixer::EventType::SEQUENCER_REWIND:
if (clock::isRunning())
onFirstBeat(e.delta);
break;
Expand Down
6 changes: 3 additions & 3 deletions src/core/clock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ int midiTCseconds_ = 0;
int midiTCminutes_ = 0;
int midiTChours_ = 0;

#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD)
#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD) || defined(G_OS_MAC)
kernelAudio::JackState jackStatePrev_;
#endif

Expand Down Expand Up @@ -387,7 +387,7 @@ void sendMIDIrewind()
/* -------------------------------------------------------------------------- */


#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD)
#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD) || defined(G_OS_MAC)

void recvJackSync()
{
Expand All @@ -400,7 +400,7 @@ void recvJackSync()

if (jackStateCurr.frame != jackStatePrev_.frame && jackStateCurr.frame == 0) {
G_DEBUG("JackState received - rewind to frame 0");
sequencer::rewind(/*jack=*/false); // Avoid infinite recursion
sequencer::rewind();
}

if (jackStateCurr.bpm != jackStatePrev_.bpm && jackStateCurr.bpm > 1.0f) { // 0 bpm if Jack does not send that info
Expand Down
2 changes: 1 addition & 1 deletion src/core/clock.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Rewinds timecode to beat 0 and also send a MTC full frame to cue the slave. */

void sendMIDIrewind();

#if defined(__linux__) || defined(__FreeBSD__)
#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD) || defined(G_OS_MAC)
void recvJackSync();
#endif

Expand Down
1 change: 0 additions & 1 deletion src/core/kernelAudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,6 @@ int getAPI() { return api; }

#if defined(__linux__) || defined(__FreeBSD__)


JackState jackTransportQuery()
{
if (api != G_SYS_API_JACK)
Expand Down
4 changes: 1 addition & 3 deletions src/core/mixer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,11 +336,9 @@ int masterPlay(void* outBuf, void* inBuf, unsigned bufferSize,

processing_.store(true);

#if defined(__linux__) || defined(__FreeBSD__)

#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD) || defined(G_OS_MAC)
if (kernelAudio::getAPI() == G_SYS_API_JACK)
clock::recvJackSync();

#endif

AudioBuffer out, in;
Expand Down
67 changes: 45 additions & 22 deletions src/core/sequencer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@


#include "core/model/model.h"
#include "core/const.h"
#include "core/mixer.h"
#include "core/quantizer.h"
#include "core/clock.h"
Expand Down Expand Up @@ -108,19 +109,52 @@ void renderMetronome_(AudioBuffer& outBuf, Frame f)
/* -------------------------------------------------------------------------- */


void rewind_(Frame delta)
void rewindQ_(Frame delta)
{
clock::rewind();
mixer::pumpEvent({ mixer::EventType::SEQUENCER_REWIND, delta });
}


void rewindJack_(Frame delta)
/* -------------------------------------------------------------------------- */


void start_()
{
#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD) || defined(G_OS_MAC)
if (kernelAudio::getAPI() == G_SYS_API_JACK)
kernelAudio::jackStart();
else
#endif
start();
}


/* -------------------------------------------------------------------------- */


void stop_()
{
rewind_(delta);
#ifdef __linux__
kernelAudio::jackSetPosition(0);
#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD) || defined(G_OS_MAC)
if (kernelAudio::getAPI() == G_SYS_API_JACK)
kernelAudio::jackStop();
else
#endif
stop();
}


/* -------------------------------------------------------------------------- */


void rewind_()
{
#if defined(G_OS_LINUX) || defined(G_OS_FREEBSD) || defined(G_OS_MAC)
if (kernelAudio::getAPI() == G_SYS_API_JACK)
kernelAudio::jackSetPosition(0);
else
#endif
rewind();
}


Expand All @@ -138,7 +172,7 @@ Quantizer quantizer_;

void init()
{
quantizer_.schedule(Q_ACTION_REWIND, rewindJack_);
quantizer_.schedule(Q_ACTION_REWIND, rewindQ_);
clock::rewind();
}

Expand Down Expand Up @@ -180,13 +214,13 @@ void parse(const mixer::EventBuffer& events)
{
for (const mixer::Event& e : events) {
if (e.type == mixer::EventType::SEQUENCER_START) {
start(); break;
start_(); break;
}
if (e.type == mixer::EventType::SEQUENCER_STOP) {
stop(); break;
stop_(); break;
}
if (e.type == mixer::EventType::SEQUENCER_REWIND_REQ) {
rewind(); break;
rewind_(); break;
}
}
}
Expand Down Expand Up @@ -221,10 +255,6 @@ void start()
default:
break;
}

#ifdef __linux__
kernelAudio::jackStart();
#endif
}


Expand All @@ -235,10 +265,6 @@ void stop()
{
clock::setStatus(ClockStatus::STOPPED);

#ifdef __linux__
kernelAudio::jackStop();
#endif

/* If recordings (both input and action) are active deactivate them, but
store the takes. RecManager takes care of it. */

Expand All @@ -253,15 +279,12 @@ void stop()
/* -------------------------------------------------------------------------- */


void rewind(bool jack)
void rewind()
{
if (clock::canQuantize())
quantizer_.trigger(Q_ACTION_REWIND);
else
if (jack)
rewindJack_(/*delta=*/0);
else
rewind_(/*delta=*/0);
rewindQ_(/*delta=*/0);
}


Expand Down
2 changes: 1 addition & 1 deletion src/core/sequencer.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void advance(AudioBuffer& outBuf);

void start();
void stop();
void rewind(bool jack=true);
void rewind();

bool isMetronomeOn();
void toggleMetronome();
Expand Down
18 changes: 14 additions & 4 deletions src/glue/events.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <cassert>
#include <FL/Fl.H>
#include "core/model/model.h"
#include "core/const.h"
#include "core/clock.h"
#include "core/mixer.h"
#include "core/midiEvent.h"
Expand Down Expand Up @@ -243,12 +244,21 @@ void divideBeats()
/* -------------------------------------------------------------------------- */


void startSequencer(Thread t)
{
pushEvent_({ m::mixer::EventType::SEQUENCER_START, 0 }, t);
}


void stopSequencer(Thread t)
{
pushEvent_({ m::mixer::EventType::SEQUENCER_STOP, 0 }, t);
}


void toggleSequencer(Thread t)
{
if (m::clock::isRunning())
pushEvent_({ m::mixer::EventType::SEQUENCER_STOP, 0 }, t);
else
pushEvent_({ m::mixer::EventType::SEQUENCER_START, 0 }, t);
m::clock::isRunning() ? stopSequencer(t) : startSequencer(t);
}


Expand Down
2 changes: 2 additions & 0 deletions src/glue/events.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ void setMasterInVolume (float v, Thread t);
void setMasterOutVolume (float v, Thread t);
void multiplyBeats ();
void divideBeats ();
void startSequencer (Thread t);
void stopSequencer (Thread t);
void toggleSequencer (Thread t);
void rewindSequencer (Thread t);
void toggleActionRecording();
Expand Down

0 comments on commit 062ccb5

Please sign in to comment.