From dbf28d2215caf120a37ebff058c618f7f9594336 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 9 Feb 2014 20:44:53 +0100 Subject: [PATCH] more work --- src/ampswitch.cpp | 45 +++++++++++++++++++++++++++++++++++++++------ src/ampswitch.h | 7 +++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/ampswitch.cpp b/src/ampswitch.cpp index ce9c7af..d4f48aa 100644 --- a/src/ampswitch.cpp +++ b/src/ampswitch.cpp @@ -46,6 +46,7 @@ CAmpSwitch::CAmpSwitch(int argc, char *argv[]) m_switchtime = 10.0f; m_samplecounter = 0; m_samplerate = 0; + m_jackshutdown = false; } CAmpSwitch::~CAmpSwitch() @@ -70,6 +71,9 @@ void CAmpSwitch::Process() { while (!g_stop) { + if (m_jackshutdown) + JackDisconnect(); + if (!m_connected) Connect(); @@ -86,8 +90,6 @@ void CAmpSwitch::Process() uint8_t byte; while (read(m_pipe[0], &byte, 1) == 1); - - sleep(1); } } @@ -122,6 +124,8 @@ bool CAmpSwitch::JackConnect() m_samplerate = jack_get_sample_rate(m_client); + jack_on_info_shutdown(m_client, SJackInfoShutdownCallback, this); + returnv = jack_set_process_callback(m_client, SJackProcessCallback, this); if (returnv != 0) { @@ -129,6 +133,10 @@ bool CAmpSwitch::JackConnect() return false; } + returnv = jack_set_sample_rate_callback(m_client, SJackSamplerateCallback, this); + if (returnv != 0) + printf("ERROR: Unable to set sample rate callback\n"); + m_port = jack_port_register(m_client, "Input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); if (m_port == NULL) { @@ -154,13 +162,12 @@ void CAmpSwitch::JackDisconnect() { printf("Disconnecting from jack\n"); - jack_port_unregister(m_client, m_port); - m_port = NULL; - - jack_deactivate(m_client); jack_client_close(m_client); + m_port = NULL; m_client = NULL; } + m_jackshutdown = false; + m_connected = false; } int CAmpSwitch::SJackProcessCallback(jack_nframes_t nframes, void *arg) @@ -198,6 +205,32 @@ int CAmpSwitch::PJackProcessCallback(jack_nframes_t nframes) return 0; } +int CAmpSwitch::SJackSamplerateCallback(jack_nframes_t nframes, void *arg) +{ + return ((CAmpSwitch*)arg)->PJackSamplerateCallback(nframes); +} + +int CAmpSwitch::PJackSamplerateCallback(jack_nframes_t nframes) +{ + m_samplecounter = (double)m_samplecounter / (double)m_samplerate * (double)nframes; + m_samplerate = nframes; + + return 0; +} + +void CAmpSwitch::SJackInfoShutdownCallback(jack_status_t code, const char *reason, void *arg) +{ + ((CAmpSwitch*)arg)->PJackInfoShutdownCallback(code, reason); +} + +void CAmpSwitch::PJackInfoShutdownCallback(jack_status_t code, const char *reason) +{ + uint8_t msgbyte = 0; + write(m_pipe[1], &msgbyte, 1); + + m_jackshutdown = true; +} + void CAmpSwitch::SignalHandler(int signum) { if (signum == SIGINT || signum == SIGKILL) diff --git a/src/ampswitch.h b/src/ampswitch.h index 3b7a60c..c0903a8 100644 --- a/src/ampswitch.h +++ b/src/ampswitch.h @@ -39,6 +39,12 @@ class CAmpSwitch static int SJackProcessCallback(jack_nframes_t nframes, void *arg); int PJackProcessCallback(jack_nframes_t nframes); + static int SJackSamplerateCallback(jack_nframes_t nframes, void *arg); + int PJackSamplerateCallback(jack_nframes_t nframes); + + static void SJackInfoShutdownCallback(jack_status_t code, const char *reason, void *arg); + void PJackInfoShutdownCallback(jack_status_t code, const char *reason); + static void SignalHandler(int signum); bool m_connected; @@ -50,6 +56,7 @@ class CAmpSwitch int m_samplerate; float m_switchtime; int m_samplecounter; + bool m_jackshutdown; }; #endif //AMPSWITCH_H