changed.
[v3.81]
+- terminatorX now has a JACK backend. Currently it works like this: on startup
+ tX will connect to the JACK daemon - if the daemon is not available on
+ startup JACK output is not available. When the audio engine is turned off,
+ tX emits silence via the JACK ports, so you can leave the ports connected.
+- sick of green - you can now configure the colors terminatorX should use for
+ the audio display as well as the vu meters in the Preferences dialog.
+- hopefully fixed wrong setting of the master volume when loading set files.
- some ALSA installations seem to core on snd_pcm_hw_params_free() after sound
device init. So freeing the hw_params can now be explicitly disabled in
the Preferences - if terminatorX crashes right after hitting the "Power On"
button it might be necessary to activate this for your ALSA setup. This
- probably results in a memory leak - but on leak vs core you might decide for
- leak.
+ probably results in a tiny memory leak - but on leak vs core you might decide
+ for leak.
- fixed a bug that caused turntable 1 to get the focus on entering Mouse Grab
mode even when it's audio panel was minimized.
- introduced a new way of assigning MIDI controllers to parameters: simply
- right-click on a parameters control: a menu with "MIDI Learn" and
- "Remove MIDI Binding" will pop up. Simply select "MIDI Learn" and send the
+ right-click on a parameter's control: a menu with "MIDI Learn" and
+ "Remove MIDI Binding" will pop up - select "MIDI Learn" and send the
corresponding MIDI event.
- fixed a bug in the MIDI callback thanks to
- the realtime scheduling reproducibly stalled separate machines. Unluckily
terminatorX NEWS:
-Sorry folks, I only maintain ChangeLog which from the GNU point of view
-rather is a NEWS then a ChangeLog file.
+Sorry, I only maintain ChangeLog which from the GNU point of view rather is a
+NEWS then a ChangeLog file.
#ifdef USE_JACK
void jack_check()
{
- if (!tX_jack_client::get_instance()) {
+ if ((!tX_jack_client::get_instance()) && (globals.audiodevice_type==JACK)) {
tx_note("Couldn't connect to JACK server - JACK output not available.\n\nIf you want to use JACK, ensure the JACK daemon is running before you start terminatorX.", true);
}
}
if (!globals.show_nag) {
display_mastergui();
-#ifdef USE_JACK
- jack_check();
-#endif
}
- if (globals.startup_set)
- {
+ if (globals.startup_set) {
while (gtk_events_pending()) gtk_main_iteration(); gdk_flush();
+ tX_cursor::set_cursor(tX_cursor::WAIT_CURSOR);
load_tt_part(globals.startup_set);
+ tX_cursor::reset_cursor();
}
-
+
+#ifdef USE_JACK
+ jack_check();
+#endif
+
#ifndef CREATE_BENCHMARK
// gdk_input_init();
}
}
-tX_jack_client::tX_jack_client():device(NULL)
+tX_jack_client::tX_jack_client():device(NULL),jack_shutdown(false)
{
jack_set_error_function(tX_jack_client::error);
int tX_jack_client::srate(jack_nframes_t nframes, void *arg)
{
- tX_error("tX_jack_client::srate() jack changed samplerate -> this is bad, stopping audio.");
+ tX_error("tX_jack_client::srate() jack changed samplerate - ignored.");
return 0;
}
void tX_jack_client::shutdown(void *arg)
{
- /***AARGH how to handle this?***/
+ tX_error("tX_jack_client::shutdown() jack daemon has shut down. Bad!");
+ if (instance) instance->jack_shutdown=true;
}
int tX_jack_client::process(jack_nframes_t nframes, void *arg)
void tX_audiodevice_jack::start()
{
- tX_debug("activating jack playback");
overrun_buffer=new f_prec[vtt_class::samples_in_mix_buffer];
client->set_device(this);
- while (!engine->is_stopped()) {
+ while ((!engine->is_stopped()) && !(client->get_jack_shutdown())) {
usleep(100);
}
- tX_debug("stopping jack playback");
client->set_device(NULL);
delete [] overrun_buffer;
~tX_jack_client();
private:
- tX_jack_client();
+ tX_jack_client();
static tX_jack_client *instance;
static void error(const char *desc);
static int srate(jack_nframes_t nframes, void *arg);
tX_audiodevice_jack *device;
jack_port_t *left_port;
jack_port_t *right_port;
+ bool jack_shutdown;
int play(jack_nframes_t nframes);
public:
int get_sample_rate();
+ bool get_jack_shutdown() { return jack_shutdown; }
void set_device(tX_audiodevice_jack *dev) { device=dev; }
};
#include "tX_vtt.h"
#include <dirent.h>
+#ifdef USE_JACK
+extern void jack_check();
+#endif
+
extern char *logo_xpm[];
GtkWidget *opt_dialog;
int opt_hidden=0;
gtk_widget_queue_draw(main_flash_l);
gtk_tx_flash_update_colors(GTK_TX_FLASH(main_flash_r));
gtk_widget_queue_draw(main_flash_r);
+
+#ifdef USE_JACK
+ jack_check();
+#endif
}
#endif
globals.use_stdout_cmdline=0;
strcpy(globals.current_path, "");
- globals.pitch=1.0;
- globals.volume=1.0;
-
strcpy(globals.lrdf_path, "/usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf");
globals.fullscreen_enabled=0;
globals.confirm_events=0;
globals.vtt_inertia=10.0;
- globals.alsa_free_hwstats=1;
+ globals.alsa_free_hwstats=0;
globals.filename_length=20;
globals.restore_midi_connections=1;
GtkSignalFunc master_volume_changed (GtkWidget *wid, void *d)
{
- sp_master_volume.receive_gui_value((float) 2.0-GTK_ADJUSTMENT(wid)->value);
+ sp_master_volume.receive_gui_value((float) GTK_ADJUSTMENT(wid)->value);
return NULL;
}
return NULL;
}
-GtkSignalFunc saturate_changed(GtkWidget *w, void *d)
-{
- vtt_class::enable_saturate (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
- return NULL;
-}
-
void mg_enable_critical_buttons(int enable)
{
gtk_widget_set_sensitive(seq_rec_btn, enable);
connect_adj(dumadj, master_volume_changed, NULL);
dummy=gtk_vscale_new(dumadj);
- //gtk_range_set_inverted(GTK_RANGE(dummy), TRUE);
+ gtk_range_set_inverted(GTK_RANGE(dummy), TRUE);
gtk_scale_set_draw_value(GTK_SCALE(dummy), False);
gtk_signal_connect(GTK_OBJECT(dummy), "button_press_event", (GtkSignalFunc) tX_seqpar::tX_seqpar_press, &sp_master_volume);
void tX_seqpar_master_volume :: do_update_graphics ()
{
- gtk_adjustment_set_value(volume_adj, 2.0-vtt_class::master_volume);
+ gtk_adjustment_set_value(volume_adj, vtt_class::master_volume);
}
const char * tX_seqpar_master_volume :: get_name()
pthread_mutex_t vtt_class::render_lock=PTHREAD_MUTEX_INITIALIZER;
f_prec vtt_class::master_volume=1.0;
f_prec vtt_class::res_master_volume=1.0;
-f_prec vtt_class::saturate_fac=0.1;
-int vtt_class::do_saturate=0;
+
vtt_class * vtt_class::sync_master=NULL;
int vtt_class::master_triggered=0;
int vtt_class::master_triggered_at=0;
}
}
-void vtt_class :: enable_saturate (int newstate)
-{
- do_saturate=newstate;
-}
-
void vtt_class :: focus_no(int no)
{
list <vtt_class *> :: iterator vtt;
static f_prec res_master_volume;
static f_prec vol_channel_adjust;
- static f_prec saturate_fac;
- static int do_saturate;
-
static vtt_class * sync_master;
static int master_triggered;
static int master_triggered_at;
static int set_mix_buffer_size(int);
static void set_master_volume(f_prec);
static void set_master_pitch(f_prec);
- static void enable_saturate(int);
static void focus_no(int);
static void focus_next();
static void unfocus();