changed.
[v3.81]
+- fixed a bug that caused enabling sync-client setting via MIDI to fail.
- when compiled with rt-scheduling suppport terminatorX will now display the
resulting scheduling policy in the about dialog.
- if terminatorX was setup to use realtime priority for the audio engine thread
#include "tX_dialog.h"
#include <gtk/gtk.h>
#include <glib.h>
+#include <string.h>
#include "tX_ladspa.h"
#include "tX_ladspa_class.h"
value=getenv(name);
if (value) {
- length=strnlen(value, PATH_MAX+1);
+ length=strlen(value);
+ /*
+ strnlen requires extra macros...
+ length=strnlen(value, PATH_MAX+1);
+ */
if (length>=PATH_MAX) {
tX_error("Your \"%s\" environment variable seems malicious (%i chars).", name, length);
# include <audiofile.h>
#endif
+#define min(a,b) ((a) < (b) ? (a) : (b))
+
tx_audiofile :: tx_audiofile()
{
mem_type=TX_AUDIO_UNDEFINED;
#endif
#ifdef USE_BUILTIN_WAV
-#define min(a,b) ((a) < (b) ? (a) : (b))
tX_audio_error tx_audiofile :: load_wav() {
tX_debug("tx_audiofile::load_wav()");
{
cap_t caps;
cap_flag_value_t cap;
- pid_t pid;
caps=cap_get_proc();
sep=gtk_hseparator_new();
add_about_wid_fix(sep);
- char about_prefix_umlaut[]="\nThis is "PACKAGE" Release "VERSION" - Copyright (C) 1999-2003 by Alexander K\xC3\xB6nig";
- char about_rest[]="\n\nSend comments, patches and scratches to: alex@lisas.de\n"
- "terminatorX-homepage: http://www.terminatorX.cx\n\nThis binary has been compiled with the following flags: "
- "Sox support: "
+
+ label=gtk_label_new("This is "PACKAGE" release "VERSION" - Copyright (C) 1999-2003 by Alexander K\xC3\xB6nig"
+ "\nSend comments, patches and scratches to: alex@lisas.de\nterminatorX-homepage: http://www.terminatorX.cx");
+
+ gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
+ add_about_wid_fix(label);
+
+ sep=gtk_hseparator_new();
+ add_about_wid_fix(sep);
+
+ label=gtk_label_new(
+ "Compilation flags: "
+ "sox: "
#ifdef USE_SOX_INPUT
"ON"
#else
"OFF"
#endif
- " - mpg123 support: "
+ " - mpg123: "
#ifdef USE_MPG123_INPUT
"ON"
#else
"OFF"
#endif
- " - \nogg123 support: "
+ " - ogg123: "
#ifdef USE_OGG123_INPUT
"ON"
#else
"OFF"
#endif
+ " - libmad: "
+#ifdef USE_MAD_INPUT
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - libvorbis: "
+#ifdef USE_VORBIS_INPUT
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - libaudiofile: "
+#ifdef USE_AUDIOFILE_INPUT
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - MIDI: "
+#ifdef USE_ALSA_MIDI_IN
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - OSS: "
+#ifdef USE_OSS
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - ALSA: "
+#ifdef USE_ALSA
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - JACK: "
+#ifdef USE_JACK
+ "ON"
+#else
+ "OFF"
+#endif
- " - enhanced scheduling: "
+ " - liblrdf: "
+#ifdef USE_LRDF
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - rt scheduling: "
#ifdef USE_SCHEDULER
"ON"
#else
"OFF"
#endif
- " - for a "
+
+ " - capabilities: "
+#ifdef USE_CAPABILITIES
+ "ON"
+#else
+ "OFF"
+#endif
+
+ " - "
#ifdef WORDS_BIGENDIAN
"big"
-
#else
"little"
#endif
- " endian machine.\n";
-
- char buffer[4096];
-
- strcpy(buffer, about_prefix_umlaut);
- strcat(buffer, about_rest);
-
- label=gtk_label_new(buffer);
-
+ " endian.");
+
+ gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
add_about_wid_fix(label);
-
+
#ifdef USE_SCHEDULER
+ sep=gtk_hseparator_new();
+ add_about_wid_fix(sep);
+
+ char buffer[4096];
int prio=sched_getscheduler(tX_engine::get_instance()->get_pid());
char prio_str[32]="";
#include <sys/time.h>
#include <sys/resource.h>
-tX_engine *tX_engine :: engine=NULL;
+tX_engine *tX_engine::engine=NULL;
-tX_engine *tX_engine :: get_instance() {
+tX_engine *tX_engine::get_instance() {
if (!engine) {
engine=new tX_engine();
}
return engine;
}
-void tX_engine :: set_grab_request() {
+void tX_engine::set_grab_request() {
grab_request=true;
}
-int16_t* tX_engine :: render_cycle() {
+int16_t* tX_engine::render_cycle() {
/* Checking whether to grab or not */
if (grab_request!=grab_active) {
if (grab_request) {
/* Activating grab... */
int result=mouse->grab();
if (result!=0) {
- tX_error("tX_engine::loop(): failed to grab mouse - error %i", result);
+ tX_error("tX_engine::render_cycle(): failed to grab mouse - error %i", result);
grab_active=false;
/* Reseting grab_request, too - doesn't help keeping it, does it ? ;) */
grab_request=false;
return data;
}
-void tX_engine :: loop() {
+void tX_engine::loop() {
while (!thread_terminate) {
/* Waiting for the trigger */
pthread_mutex_lock(&start);
}
}
+#ifdef USE_SCHEDULER
pid_t pid=getpid();
- tX_engine::get_instance()->set_pid(pid);
-#ifdef USE_SCHEDULER
#ifdef USE_CAPABILITIES
if (have_nice_capability()) {
if (globals.use_realtime) {
tX_warning("engine_thread_entry(): can't set SCHED_FIFO -> lacking capabilities.");
}
#endif //USE_CAPABILITIES
+ engine->set_pid(pid);
if (sched_getscheduler(pid)!=SCHED_FIFO) {
tX_warning("engine_thread_entry() - engine has no realtime priority scheduling.");
pthread_mutex_init(&start, NULL);
pthread_mutex_lock(&start);
thread_terminate=false;
- pid=0;
+#ifdef USE_SCHEDULER
+ pid=-1;
+#endif
/* Creating the actual engine thread.. */
#ifdef USE_SCHEDULER
plugin_list.push_back(this);
strcpy(file, filename);
- sprintf (info_string, " LADSPA-Plugin: %s \n Label: %s \n File: %s \n Unique ID: %li \n Maker: %s \n Copyright: %s ", ld->Name, ld->Label, file, ld->UniqueID, ld->Maker, ld->Copyright);
+ sprintf(info_string, "LADSPA-Plugin: %s\nLabel: %s\nFile: %s\nUnique ID: %li\nMaker: %s\nCopyright: %s", ld->Name, ld->Label, file, ld->UniqueID, ld->Maker, ld->Copyright);
LADSPA_Class::add_plugin(this);
}
gtk_label_set_markup(GTK_LABEL(label), "Delete <b>all</b> events for <b>all</b> turntables.");
gtk_widget_show(del_dialog);
+
+ return NULL;
}
GCallback menu_delete_all_events_for_vtt(GtkWidget *, vtt_class *vtt)
{
midi->sp_to_learn=NULL;
gtk_widget_destroy(midi->learn_dialog);
+
+ return FALSE;
}
gboolean tX_midiin::midi_learn_destroy(GtkWidget *widget, tX_midiin *midi)
{
midi->cancel_midi_learn();
+
+ return FALSE;
}
void tX_midiin::store_connections(FILE *rc, char *indent)
tX_seqpar_vtt_sync_client :: tX_seqpar_vtt_sync_client()
{
set_mapping_parameters(0,0,0,0);
+ is_boolean=true;
}
void tX_seqpar_vtt_sync_client :: do_exec(const float value)
item = gtk_menu_item_new_with_label("MIDI Learn");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(item);
+#ifdef USE_ALSA_MIDI_IN
g_signal_connect(item, "activate", (GCallback) tX_seqpar::learn_midi_binding, sp);
-
+#else
+ gtk_widget_set_sensitive(item, FALSE);
+#endif
+
item = gtk_menu_item_new_with_label("Remove MIDI Binding");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(item);
if (sp->bound_midi_event.type==tX_midievent::NONE) {
gtk_widget_set_sensitive(item, FALSE);
}
+#ifdef USE_ALSA_MIDI_IN
g_signal_connect(item, "activate", (GCallback) tX_seqpar::remove_midi_binding, sp);
-
+#else
+ gtk_widget_set_sensitive(item, FALSE);
+#endif
if (!sp->is_boolean) {
item = gtk_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
item = gtk_menu_item_new_with_label("Set Upper MIDI Bound");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(item);
+
+#ifdef USE_ALSA_MIDI_IN
g_signal_connect(item, "activate", (GCallback) tX_seqpar::set_midi_upper_bound, sp);
+#else
+ gtk_widget_set_sensitive(item, FALSE);
+#endif
item = gtk_menu_item_new_with_label("Reset Upper MIDI Bound");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show(item);
+ gtk_widget_show(item);
+#ifdef USE_ALSA_MIDI_IN
g_signal_connect(item, "activate", (GCallback) tX_seqpar::reset_midi_upper_bound, sp);
+#else
+ gtk_widget_set_sensitive(item, FALSE);
+#endif
if (!sp->midi_upper_bound_set) {
gtk_widget_set_sensitive(item, FALSE);
item = gtk_menu_item_new_with_label("Set Lower MIDI Bound");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_widget_show(item);
+#ifdef USE_ALSA_MIDI_IN
g_signal_connect(item, "activate", (GCallback) tX_seqpar::set_midi_lower_bound, sp);
+#else
+ gtk_widget_set_sensitive(item, FALSE);
+#endif
item = gtk_menu_item_new_with_label("Reset Lower MIDI Bound");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
- gtk_widget_show(item);
+ gtk_widget_show(item);
+#ifdef USE_ALSA_MIDI_IN
g_signal_connect(item, "activate", (GCallback) tX_seqpar::reset_midi_lower_bound, sp);
+#else
+ gtk_widget_set_sensitive(item, FALSE);
+#endif
if (!sp->midi_lower_bound_set) {
gtk_widget_set_sensitive(item, FALSE);
return FALSE;
}
+#ifdef USE_ALSA_MIDI_IN
+
gboolean tX_seqpar::remove_midi_binding(GtkWidget *widget, gpointer data) {
tX_seqpar *sp=(tX_seqpar *) data;
return TRUE;
}
+
+#endif // USE_ALSA_MIDI_IN
void reset_lower_midi_bound() { midi_lower_bound_set=false; }
static gboolean tX_seqpar_press(GtkWidget *widget, GdkEventButton *event, gpointer data);
+
+#ifdef USE_ALSA_MIDI_IN
static gboolean remove_midi_binding(GtkWidget *widget, gpointer data);
static gboolean learn_midi_binding(GtkWidget *widget, gpointer data);
static gboolean set_midi_lower_bound(GtkWidget *widget, gpointer data);
static gboolean reset_midi_lower_bound(GtkWidget *widget, gpointer data);
+#endif
};
class tX_seqpar_update : public tX_seqpar
void vtt_class :: set_sync_client(int slave, int cycles)
{
+ tX_debug("vtt_class::set_sync_client() setting %i, %i.", slave, cycles);
is_sync_client=slave;
sync_cycles=cycles;
// sync_countdown=cycles;