diff --git a/.gitignore b/.gitignore index d163863..fd62742 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -build/ \ No newline at end of file +build/ +buildScript.sh +shaders/glava/rc_test.glsl \ No newline at end of file diff --git a/README.md b/README.md index f1c2148..2a238f7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ +***Note:*** *This fork of GLava introduces support for the JACK Audio Connector Kit.* + **GLava** is a general-purpose, highly configurable OpenGL audio spectrum visualizer for X11. Displayed to the left is the `radial` shader module, or for a more extensive demonstration [see this demo](https://streamable.com/dgpj8). Development is active, and reporting issues is encouranged. @@ -34,7 +36,8 @@ Note that versions since `2.0` use Meson for the build system, although the `Mak **Additional compile time requirements:** - Meson -- OBS (disable with `-Ddisable_obs=true`) +- OBS (disable with `-Ddisable-obs=true`) +- JACK **Optional requirements:** diff --git a/glava/jack_input.c b/glava/jack_input.c new file mode 100644 index 0000000..200ed86 --- /dev/null +++ b/glava/jack_input.c @@ -0,0 +1,115 @@ +#include +#include +#include + +#include + +#include "fifo.h" + + +/* GLava backend and configuration */ +struct audio_data *audio; +size_t buffer_size; + +/* JACK backend */ +jack_client_t *client; +jack_port_t *input_port1, *input_port2; + + + +/* + * Callback function for JACK. + * Appends new samples to GLava buffer and marks it as modified. + */ +int process (jack_nframes_t nframes, void *arg) { + float* samples1 = (jack_default_audio_sample_t*)jack_port_get_buffer + (input_port1, nframes); + float* samples2 = (jack_default_audio_sample_t*)jack_port_get_buffer + (input_port2, nframes); + + pthread_mutex_lock(&audio->mutex); + float* bl = (float*) audio->audio_out_l; + float* br = (float*) audio->audio_out_r; + + size_t buffer_steps = (size_t) nframes; + size_t buffer_offset = buffer_size - buffer_steps; + memmove(bl, &bl[buffer_steps], buffer_offset * sizeof(float)); + memmove(br, &br[buffer_steps], buffer_offset * sizeof(float)); + + for (int frame = 0; frame < buffer_steps; frame++) { + bl[buffer_offset + frame] = samples1[frame]; + br[buffer_offset + frame] = samples2[frame]; + } + + audio->modified = true; + pthread_mutex_unlock(&audio->mutex); + + return 0; +} + +void jack_shutdown (void *arg) { + //Do more cleanup here if needed +} + +static void init(struct audio_data* audio) { + if (!audio->source) + audio->source = strdup ("JACK"); + + const char *client_name = "GLava"; + const char *server_name = NULL; + jack_options_t options = JackNullOption; + jack_status_t status; + client = jack_client_open (client_name, options, &status, server_name); + + if (client == NULL) { + fprintf (stderr, "jack_client_open() failed, status = 0x%2.0x\n", + status); + if (status & JackServerFailed) { + printf ("Unable to connect to JACK server!\n"); + } + exit (1); + } + if (status & JackServerStarted) { + fprintf (stdout, "JACK server started\n"); + } + if (status & JackNameNotUnique) { + client_name = jack_get_client_name (client); + fprintf (stderr, "Unique name '%s' assigned!\n", client_name); + } + + jack_on_shutdown (client, jack_shutdown, 0); + + input_port1 = jack_port_register (client, "input1", JACK_DEFAULT_AUDIO_TYPE, + JackPortIsInput, 0); + input_port2 = jack_port_register (client, "input2", JACK_DEFAULT_AUDIO_TYPE, + JackPortIsInput, 0); + + if ((input_port1 == NULL) || (input_port2 == NULL)) { + fprintf (stderr, "No more JACK ports available!\n"); + exit (1); + } +} + +static void* entry(void* data) { + audio = (struct audio_data *) data; + buffer_size = audio->audio_buf_sz; + + jack_set_process_callback (client, process, NULL); + if (jack_activate (client)) { + fprintf (stderr, "Cannot activate client!\n"); + exit (1); + } + + while (true) { + sleep(1); + + if (audio->terminate == 1) { + break; + } + } + + jack_client_close (client); + return 0; +} + +AUDIO_ATTACH (jack); diff --git a/glava/jack_input.h b/glava/jack_input.h new file mode 100644 index 0000000..6448fa4 --- /dev/null +++ b/glava/jack_input.h @@ -0,0 +1,7 @@ + +#ifndef JACK_INPUT_H +#define JACK_INPUT_H + +#include "fifo.h" + +#endif diff --git a/meson.build b/meson.build index c3ba8cd..895ffa5 100644 --- a/meson.build +++ b/meson.build @@ -25,7 +25,8 @@ glava_dependencies = [ cc.find_library('dl'), cc.find_library('m'), cc.find_library('X11'), - cc.find_library('Xext') + cc.find_library('Xext'), + cc.find_library('jack') ] if cc.get_id() == 'clang'