From edb7c17e5daa6f082b755eed3b01f30cc3dc7349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Marie=20de=20Jouvencel?= Date: Fri, 8 Jun 2018 14:38:56 +0200 Subject: [PATCH 1/4] When Jack is used, start / stop jack transport --- include/AudioJack.h | 1 + include/AudioJack.h.gch | Bin 0 -> 13564 bytes include/Song.h | 2 ++ src/core/Song.cpp | 13 ++++++++++++- src/core/audio/AudioJack.cpp | 11 +++++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 include/AudioJack.h.gch diff --git a/include/AudioJack.h b/include/AudioJack.h index 83717f251ee..d18a3d362a9 100644 --- a/include/AudioJack.h +++ b/include/AudioJack.h @@ -66,6 +66,7 @@ class AudioJack : public QObject, public AudioDevice "JACK (JACK Audio Connection Kit)" ); } + void syncTransport( bool playing ); class setupWidget : public AudioDeviceSetupWidget { diff --git a/include/AudioJack.h.gch b/include/AudioJack.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..477d7c92a96f8a6a1819efe4ff9abc98b1a80f05 GIT binary patch literal 13564 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 w #include @@ -32,6 +34,7 @@ #include +#include "AudioJack.h" #include "AutomationTrack.h" #include "AutomationEditor.h" #include "BBEditor.h" @@ -105,6 +108,8 @@ Song::Song() : /* connect( &m_masterPitchModel, SIGNAL( dataChanged() ), this, SLOT( masterPitchChanged() ) );*/ + connect( this, SIGNAL( playbackStateChanged() ), this, SLOT( onPlaybackStateChanged() ) ); + qRegisterMetaType( "Note" ); setType( SongContainer ); } @@ -119,7 +124,13 @@ Song::~Song() } - +void Song::onPlaybackStateChanged() +{ + AudioJack *device = dynamic_cast(Engine::mixer()->audioDev()); + if (device) { + device->syncTransport(m_playing); + } +} void Song::masterVolumeChanged() { diff --git a/src/core/audio/AudioJack.cpp b/src/core/audio/AudioJack.cpp index 4d730eed412..db3deae46e4 100644 --- a/src/core/audio/AudioJack.cpp +++ b/src/core/audio/AudioJack.cpp @@ -96,6 +96,17 @@ AudioJack::~AudioJack() +void AudioJack::syncTransport( bool playing ) +{ + if (playing) { + jack_transport_start( m_client ); + } else { + jack_transport_stop( m_client ); + } +} + + + void AudioJack::restartAfterZombified() { if( initJackClient() ) From 3411b0a076006c6eb86357238dc2216cba8f0c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Marie=20de=20Jouvencel?= Date: Sat, 9 Jun 2018 18:38:02 +0200 Subject: [PATCH 2/4] Only compile jack specific stuff when jack is enabled --- src/core/Song.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/Song.cpp b/src/core/Song.cpp index daf3ec6fa3e..75493272190 100644 --- a/src/core/Song.cpp +++ b/src/core/Song.cpp @@ -126,10 +126,12 @@ Song::~Song() void Song::onPlaybackStateChanged() { + #ifdef LMMS_HAVE_JACK AudioJack *device = dynamic_cast(Engine::mixer()->audioDev()); if (device) { device->syncTransport(m_playing); } + #endif } void Song::masterVolumeChanged() From dfa8f8cbc18fad2e3ffeb005c2973e70cef87663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Marie=20de=20Jouvencel?= Date: Thu, 14 Jun 2018 16:36:24 +0200 Subject: [PATCH 3/4] When the song is paused, sync jack transport position --- CMakeLists.txt | 2 +- include/AudioJack.h | 1 + src/core/audio/AudioJack.cpp | 5 +++++ src/gui/editors/SongEditor.cpp | 24 ++++++++++++++++++++++-- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c67e9316c7..c9d91865b2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -380,7 +380,7 @@ IF(WANT_JACK) SET(STATUS_JACK "OK (weak linking enabled)") SET(JACK_INCLUDE_DIRS "") # use dlsym instead - SET(JACK_LIBRARIES ${CMAKE_DL_LIBS}) + SET(JACK_LIBRARIES ${CMAKE_DL_LIBS} jackserver) ELSE() SET(STATUS_JACK "OK") ENDIF() diff --git a/include/AudioJack.h b/include/AudioJack.h index d18a3d362a9..dec93eddcd2 100644 --- a/include/AudioJack.h +++ b/include/AudioJack.h @@ -67,6 +67,7 @@ class AudioJack : public QObject, public AudioDevice } void syncTransport( bool playing ); + void repositionTransport(jack_position_t pos); class setupWidget : public AudioDeviceSetupWidget { diff --git a/src/core/audio/AudioJack.cpp b/src/core/audio/AudioJack.cpp index db3deae46e4..5c98956d018 100644 --- a/src/core/audio/AudioJack.cpp +++ b/src/core/audio/AudioJack.cpp @@ -105,6 +105,11 @@ void AudioJack::syncTransport( bool playing ) } } +void AudioJack::repositionTransport(jack_position_t pos) +{ + jack_transport_reposition(m_client, &pos); +} + void AudioJack::restartAfterZombified() diff --git a/src/gui/editors/SongEditor.cpp b/src/gui/editors/SongEditor.cpp index a2e52e200a6..bc72d44bbe4 100644 --- a/src/gui/editors/SongEditor.cpp +++ b/src/gui/editors/SongEditor.cpp @@ -34,6 +34,10 @@ #include #include "AutomatableSlider.h" +#ifdef LMMS_HAVE_JACK +#include "AudioJack.h" +#include +#endif #include "ComboBox.h" #include "ConfigManager.h" #include "CPULoadWidget.h" @@ -551,10 +555,26 @@ static inline void animateScroll( QScrollBar *scrollBar, int newVal, bool smooth } - - void SongEditor::updatePosition( const MidiTime & t ) { + #ifdef LMMS_HAVE_JACK + AudioJack *device = dynamic_cast(Engine::mixer()->audioDev()); + if (device && m_song->playMode() == Song::PlayModes::Mode_None) { + jack_position_t pos; + pos.valid = jack_position_bits_t::JackPositionBBT; + pos.bar = m_song->currentTact() + 1; + pos.beat = m_song->getBeat() + 1; + pos.tick = m_song->getBeatTicks() + 1; + pos.bar_start_tick = m_song->getTicks(); + pos.beats_per_bar = m_song->getTimeSigModel().numeratorModel().value(); + pos.beat_type = m_song->getTimeSigModel().denominatorModel().value(); + pos.ticks_per_beat = m_song->getPlayPos().ticksPerBeat(m_song->getTimeSigModel()); + pos.beats_per_minute = m_song->getTempo(); + pos.frame = m_song->currentFrame(); + device->repositionTransport(pos); + } + #endif + int widgetWidth, trackOpWidth; if( ConfigManager::inst()->value( "ui", "compacttrackbuttons" ).toInt() ) { From 54e9303a9f047e7b48ef1c0602dbc43ffacb2d24 Mon Sep 17 00:00:00 2001 From: Tres Finocchiaro Date: Sun, 6 Jan 2019 22:05:36 -0500 Subject: [PATCH 4/4] Remove link to jackserver --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c9d91865b2d..6c67e9316c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -380,7 +380,7 @@ IF(WANT_JACK) SET(STATUS_JACK "OK (weak linking enabled)") SET(JACK_INCLUDE_DIRS "") # use dlsym instead - SET(JACK_LIBRARIES ${CMAKE_DL_LIBS} jackserver) + SET(JACK_LIBRARIES ${CMAKE_DL_LIBS}) ELSE() SET(STATUS_JACK "OK") ENDIF()