This commit is contained in:
Bob 2016-09-11 18:59:30 +02:00
parent f65d10b3dc
commit a62a639172
2 changed files with 45 additions and 31 deletions

View file

@ -32,24 +32,25 @@
#include <fcntl.h> #include <fcntl.h>
#include <sys/select.h> #include <sys/select.h>
#include <getopt.h> #include <getopt.h>
#include <algorithm>
volatile bool g_stop = false; volatile bool g_stop = false;
CAmpSwitch::CAmpSwitch(int argc, char *argv[]) CAmpSwitch::CAmpSwitch(int argc, char *argv[])
{ {
m_triggerlevel = 0.1f;
m_switchtime = 10.0f;
m_oncommand = NULL;
m_offcommand = NULL;
m_pipe[0] = -1;
m_pipe[1] = -1;
m_connected = false; m_connected = false;
m_client = NULL; m_client = NULL;
m_port = NULL; m_port = NULL;
m_switchedon = false;
m_triggerlevel = 0.5f;
m_pipe[0] = -1;
m_pipe[1] = -1;
m_switchtime = 10.0f;
m_samplecounter = 0;
m_samplerate = 0; m_samplerate = 0;
m_jackshutdown = false; m_jackshutdown = false;
m_oncommand = NULL; m_switchedon = false;
m_offcommand = NULL; m_samplecounter = 0;
struct option longoptions[] = struct option longoptions[] =
{ {
@ -142,6 +143,9 @@ void CAmpSwitch::Process()
system(m_offcommand); system(m_offcommand);
} }
//local switch state
bool switchedon = false;
while (!g_stop) while (!g_stop)
{ {
//if the jack daemon has shut down, clean up the jack client //if the jack daemon has shut down, clean up the jack client
@ -161,24 +165,25 @@ void CAmpSwitch::Process()
tv.tv_usec = 0; tv.tv_usec = 0;
select(m_pipe[0] + 1, &pipeset, NULL, NULL, &tv); select(m_pipe[0] + 1, &pipeset, NULL, NULL, &tv);
//clear the readable end of the pipe
uint8_t byte;
read(m_pipe[0], &byte, 1);
//if the jack thread has written a byte to the pipe, the switch state has changed //if the jack thread has written a byte to the pipe, the switch state has changed
//execute the switch on or switch off command if necessary //execute the switch on or switch off command if necessary
if (FD_ISSET(m_pipe[0], &pipeset)) if (switchedon != m_switchedon)
{ {
if (m_switchedon && m_oncommand) switchedon = m_switchedon;
if (switchedon && m_oncommand)
{ {
printf("switching on, executing \"%s\"\n", m_oncommand); printf("switching on, executing \"%s\"\n", m_oncommand);
system(m_oncommand); system(m_oncommand);
} }
else if (!m_switchedon && m_offcommand) else if (!switchedon && m_offcommand)
{ {
printf("switching off, executing \"%s\"\n", m_offcommand); printf("switching off, executing \"%s\"\n", m_offcommand);
system(m_offcommand); system(m_offcommand);
} }
//clear the readable end of the pipe
uint8_t byte;
while (read(m_pipe[0], &byte, 1) == 1);
} }
} }
} }
@ -292,26 +297,33 @@ int CAmpSwitch::PJackProcessCallback(jack_nframes_t nframes)
{ {
float* jackptr = (float*)jack_port_get_buffer(m_port, nframes); float* jackptr = (float*)jack_port_get_buffer(m_port, nframes);
//iterate over all samples
float* in = jackptr; float* in = jackptr;
float* inend = in + nframes; float* inend = in + nframes;
while (in != inend) while (in != inend)
{ {
if (m_samplecounter == 0) //if the absolute sample value is higher than the trigger level, set the switch state to on and reset the sample counter
{
bool trigger = fabsf(*(in++)) > m_triggerlevel; bool trigger = fabsf(*(in++)) > m_triggerlevel;
bool change = (m_switchedon && !trigger) || (!m_switchedon && trigger); if (trigger)
if (change)
{ {
m_switchedon = !m_switchedon; m_samplecounter = std::max((int)lround(m_switchtime * m_samplerate), 1);
m_samplecounter = m_switchtime * m_samplerate; if (!m_switchedon)
{
m_switchedon = true;
uint8_t msgbyte = 0; uint8_t msgbyte = 0;
write(m_pipe[1], &msgbyte, 1); write(m_pipe[1], &msgbyte, 1);
} }
} }
else else if (m_samplecounter > 0)
{ {
//if the sample counter expires, set the switch state to off
m_samplecounter--; m_samplecounter--;
if (m_samplecounter == 0)
{
m_switchedon = false;
uint8_t msgbyte = 0;
write(m_pipe[1], &msgbyte, 1);
}
} }
} }
@ -326,7 +338,7 @@ int CAmpSwitch::SJackSamplerateCallback(jack_nframes_t nframes, void *arg)
int CAmpSwitch::PJackSamplerateCallback(jack_nframes_t nframes) int CAmpSwitch::PJackSamplerateCallback(jack_nframes_t nframes)
{ {
//when the sample rate changes, update the sample counter so that it will represent the same amount of time //when the sample rate changes, update the sample counter so that it will represent the same amount of time
m_samplecounter = (double)m_samplecounter / (double)m_samplerate * (double)nframes; m_samplecounter = lround((double)m_samplecounter / (double)m_samplerate * (double)nframes);
m_samplerate = nframes; m_samplerate = nframes;
return 0; return 0;

View file

@ -49,19 +49,21 @@ class CAmpSwitch
static void SignalHandler(int signum); static void SignalHandler(int signum);
float m_triggerlevel;
float m_switchtime;
char* m_oncommand;
char* m_offcommand;
int m_pipe[2];
bool m_connected; bool m_connected;
jack_client_t* m_client; jack_client_t* m_client;
jack_port_t* m_port; jack_port_t* m_port;
int m_pipe[2];
bool m_switchedon;
float m_triggerlevel;
int m_samplerate; int m_samplerate;
float m_switchtime;
int m_samplecounter;
bool m_jackshutdown; bool m_jackshutdown;
char* m_oncommand; bool m_switchedon;
char* m_offcommand; int m_samplecounter;
}; };
#endif //AMPSWITCH_H #endif //AMPSWITCH_H