while (gtk_events_pending()) gtk_main_iteration(); gdk_flush();
gdk_flush();
- vtt_class::set_mix_buffer_size(globals.true_block_size);
- printf("\n* BENCHMARKING *\nBlocksize is %i samples.\n", globals.true_block_size);
+ vtt_class::set_sample_rate(48000);
+
+ printf("\n* BENCHMARKING *\n");
GTimer *bench_time = g_timer_new();
gulong micros;
i += ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &blocksize);
samples_per_buffer=blocksize/sizeof(int16_t);
- globals.true_block_size=samples_per_buffer/2;
tX_debug("tX_adudiodevice_oss::open() - blocksize: %i, samples_per_buffer: %i", blocksize, samples_per_buffer);
return -1;
}
- globals.true_block_size=periodsize;
-
/* Apply all that setup work.. */
if (snd_pcm_hw_params(pcm_handle, hw_params) < 0) {
tX_error("ALSA: Failed to apply settings to PCM device \"%s\"", pcm_name);
return -1;
}
- tX_debug("ALSA: samples_per_buffer: %i, bs: %i, period=%i", samples_per_buffer, globals.true_block_size, periodsize);
+ tX_debug("ALSA: samples_per_buffer: %i, period=%i", samples_per_buffer, periodsize);
snd_pcm_hw_params_free (hw_params);
return 0;
grab_request=true;
}
-void tX_engine :: loop_og() {
- int16_t *temp=NULL;
- int result;
-
- while (!thread_terminate) {
- /* Waiting for the trigger */
- pthread_mutex_lock(&start);
- loop_is_active=true;
- pthread_mutex_unlock(&start);
-
- /* Render first block */
- if (!stop_flag) {
- sequencer.step();
- temp=vtt_class::render_all_turntables();
- }
-
- while (!stop_flag) {
- /* Checking whether to grab or not */
- if (grab_request!=grab_active) {
- if (grab_request) {
- /* Activating grab... */
- result=mouse->grab();
- if (result!=0) {
- tX_error("tX_engine::loop(): failed to grab mouse - error %i", result);
- grab_active=false;
- /* Reseting grab_request, too - doesn't help keeping it, does it ? ;) */
- grab_request=false;
- mouse->ungrab();
- grab_off();
- } else {
- grab_active=true;
- }
- } else {
- /* Deactivating grab... */
- mouse->ungrab();
- grab_active=false;
- grab_off(); // for the mastergui this is...
- }
- }
-
- /* Handling input events... */
- if (grab_active) {
- if (mouse->check_event()) {
- /* If we're here the user pressed ESC */
- grab_request=false;
- }
- }
-
-#ifdef USE_ALSA_MIDI_IN
- if (midi->get_is_open()) midi->check_event();
-#endif
-
- /* Playback the audio... */
- device->play(temp);
-
- /* Record the audio if necessary... */
- if (is_recording()) tape->eat(temp);
-
- /* Forward the sequencer... */
- sequencer.step();
-
- /* Render the next block... */
- temp=vtt_class::render_all_turntables();
- }
-
- /* Stopping engine... */
- loop_is_active=false;
- }
-}
-
int16_t* tX_engine :: render_cycle() {
/* Checking whether to grab or not */
if (grab_request!=grab_active) {
}
}
-#ifdef USE_ALSA_MIDI_IN
-// if (midi->get_is_open()) midi->check_event();
-#endif
/* Forward the sequencer... */
sequencer.step();
tX_engine_error run();
void stop();
void loop();
- void loop_og();
void set_recording_request(bool recording);
bool get_recording_request() { return recording_request; }
globals.no_gui = 0;
globals.alternate_rc = 0;
-
strcpy(globals.xinput_device, "");
globals.xinput_enable=0;
globals.oss_buff_size=9;
globals.oss_samplerate=44100;
- strcpy(globals.alsa_device, "hw:0,0");
+ strcpy(globals.alsa_device, "00-00: Default");
globals.alsa_buff_no=2;
globals.alsa_buff_size=1024;
globals.alsa_samplerate=44100;
strcpy(globals.lrdf_path, "/usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf");
globals.fullscreen_enabled=1;
-
- if (!globals.true_block_size) globals.true_block_size=1<globals.oss_buff_size;
}
int load_globals_xml() {
restore_float("volume", globals.volume);
restore_float("flash_response", globals.flash_response);
restore_int("button_type", globals.button_type);
- restore_int("true_block_size", globals.true_block_size);
restore_string("tables_filename", globals.tables_filename);
restore_string("record_filename", globals.record_filename);
restore_string("file_editor", globals.file_editor);
store_float("volume", globals.volume);
store_float("flash_response", globals.flash_response);
store_int("button_type", globals.button_type);
- store_int("true_block_size", globals.true_block_size);
store_string("tables_filename", globals.tables_filename);
store_string("record_filename", globals.record_filename);
store_string("file_editor", globals.file_editor);
globals.current_path = NULL;
globals.pitch=1.0;
globals.volume=1.0;
- if (!globals.true_block_size) globals.true_block_size=1<globals.oss_buff_size;
}
#endif
char buffer[20];
guint32 samples;
guint32 minu,sec,hun;
+ guint32 sr;
- samples=timestamp*globals.true_block_size;
+ samples=timestamp*vtt_class::get_mix_buffer_size();
+ sr=vtt_class::get_last_sample_rate();
if (samples>0)
{
- minu=samples/2646000;
- samples-=2646000*minu;
+ minu=samples/(sr*60);
+ samples-=(sr*60)*minu;
- sec=samples/44100;
- samples-=44100*sec;
+ sec=samples/sr;
+ samples-=sr*sec;
- hun=samples/441;
+ hun=samples/(sr/100);
}
else
{
return -1;
}
- //cerr << event.type << ", " << event.number << ", " << event.value << endl;
- //event.print( __FUNCTION__ );
-
- list <tX_seqpar *> :: iterator sp;
-
+ // This should be solved with a hash table. Possibly.
+
+ list <tX_seqpar *> :: iterator sp;
+
for (sp=tX_seqpar::all.begin(); sp!=tX_seqpar::all.end(); sp++) {
if ( (*sp)->bound_midi_event.type_matches (event) ) {
(*sp)->handle_midi_input (event);
{
list <tX_seqpar *> :: iterator sp;
- /*
- tX_midievent event = {0,tX_midievent::CC,0,0,0};
- event.type = tX_midievent::CC;
- event.number = 11;
- event.channel = 0;
- */
-
GType types[3] = { G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER };
GtkListStore* model = gtk_list_store_newv(3, types);
GtkTreeIter iter;
1, tempstr,
2, (*sp),
-1 );
-
- //cerr << (*sp)->get_name() << endl;
}
}
// it will delete itself.
new midi_binding_gui(GTK_TREE_MODEL(model), this);
-
- //cerr << "window created." << endl;
-
- return;
}
tX_midiin::midi_binding_gui::midi_binding_gui ( GtkTreeModel* _model, tX_midiin* _midi )
gtk_widget_show (bind_button);
gtk_box_pack_start (GTK_BOX (vbox1), bind_button, FALSE, FALSE, 0);
+ GtkWidget* unbind_button = gtk_button_new_with_mnemonic ("Remove Binding");
+ gtk_widget_show (unbind_button);
+ gtk_box_pack_start (GTK_BOX (vbox1), unbind_button, FALSE, FALSE, 0);
+
GtkWidget* close_button = gtk_button_new_with_mnemonic ("Close");
gtk_widget_show (close_button);
gtk_box_pack_start (GTK_BOX (vbox1), close_button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(bind_button), "clicked", (GtkSignalFunc) bind_clicked, (void *) this);
+ gtk_signal_connect(GTK_OBJECT(unbind_button), "clicked", (GtkSignalFunc) unbind_clicked, (void *) this);
gtk_signal_connect(GTK_OBJECT(close_button), "clicked", (GtkSignalFunc) close_clicked, (void *) this);
+ gtk_signal_connect(GTK_OBJECT(window), "destroy", (GtkSignalFunc) close_clicked, (void *) this);
timer_tag = gtk_timeout_add( 100, (GtkFunction) timer, (void *) this);
gtk_widget_show_all( GTK_WIDGET( window ) );
}
-void tX_midiin::midi_binding_gui::bind_clicked( GtkButton *button, gpointer _this )
+void tX_midiin::midi_binding_gui::window_closed(GtkWidget *widget, gpointer _this )
+{
+ tX_midiin::midi_binding_gui* this_ = (tX_midiin::midi_binding_gui*)_this;
+
+ delete this_;
+}
+
+void tX_midiin::midi_binding_gui::unbind_clicked( GtkButton *button, gpointer _this )
{
tX_midiin::midi_binding_gui* this_ = (tX_midiin::midi_binding_gui*)_this;
GtkTreeModel* model;
GtkTreeSelection* selection;
GtkTreeIter iter;
+ char tmpstr[128];
tX_seqpar* param;
selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(this_->parameter_treeview) );
gtk_tree_selection_get_selected( selection, &model, &iter );
gtk_tree_model_get( model, &iter, 2, ¶m, -1 );
+
+ param->bound_midi_event.type=tX_midievent::NONE;
+ param->bound_midi_event.number=0;
+ param->bound_midi_event.channel=0;
+
+ snprintf( tmpstr, sizeof(tmpstr), "Type: %d, Number: %d, Channel: %d",
+ param->bound_midi_event.type, param->bound_midi_event.number,
+ param->bound_midi_event.channel );
+
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, param->get_name(), 1, tmpstr, 2, param, -1 );
+}
+
+
+void tX_midiin::midi_binding_gui::bind_clicked( GtkButton *button, gpointer _this )
+{
+ tX_midiin::midi_binding_gui* this_ = (tX_midiin::midi_binding_gui*)_this;
+ GtkTreeModel* model;
+ GtkTreeSelection* selection;
+ GtkTreeIter iter;
+ char tmpstr[128];
+ tX_seqpar* param;
+ selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(this_->parameter_treeview) );
+ gtk_tree_selection_get_selected( selection, &model, &iter );
+ gtk_tree_model_get( model, &iter, 2, ¶m, -1 );
+
param->bound_midi_event = this_->last_event;
+
+ snprintf( tmpstr, sizeof(tmpstr), "Type: %d, Number: %d, Channel: %d",
+ param->bound_midi_event.type, param->bound_midi_event.number,
+ param->bound_midi_event.channel );
+
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, param->get_name(), 1, tmpstr, 2, param, -1 );
}
void tX_midiin::midi_binding_gui::close_clicked( GtkButton *button, gpointer _this )
{
tX_midiin::midi_binding_gui* this_ = (tX_midiin::midi_binding_gui*)_this;
- gtk_widget_hide( this_->window );
+ gtk_widget_destroy( this_->window );
delete this_;
}
gint tX_midiin::midi_binding_gui::timer( gpointer _this )
{
tX_midiin::midi_binding_gui* this_ = (tX_midiin::midi_binding_gui*)_this;
-
- //this_->midi->check_event();
-
tX_midievent tmpevent = this_->midi->get_last_event();
if( tmpevent.type_matches( this_->last_event ) )
tX_midiin::midi_binding_gui::~midi_binding_gui ()
{
gtk_timeout_remove( timer_tag );
-
- //g_object_unref( window );
- gtk_widget_destroy( window );
}
#endif // USE_ALSA_MIDI_IN
tX_midievent last_event;
+ static void window_closed( GtkWidget *widget, gpointer _this );
+ static void unbind_clicked( GtkButton *button, gpointer _this );
static void bind_clicked( GtkButton *button, gpointer _this );
static void close_clicked( GtkButton *button, gpointer _this );
static gint timer( gpointer _this );
int run_save=run;
run=1;
- //if (!run) return;
- gui_update_max=(globals.update_idle * (globals.update_delay+1) * globals.true_block_size) >> 1;
-// printf("%i\n", gui_update_max);
+ gui_update_max=(globals.update_idle * (globals.update_delay+1) * 1000) >> 1;
gui_update=gui_update_max;
current_timestamp=0;
extern f_prec gui_get_audio_x_zoom(vtt_class *vtt);
extern void gui_set_audio_x_zoom(vtt_class *vtt, f_prec);
-
+int vtt_class::last_sample_rate=44100;
int vtt_class::vtt_amount=0;
list <vtt_class *> vtt_class::main_list;
list <vtt_class *> vtt_class::render_list;
void vtt_class :: set_sample_rate(int samplerate) {
list <vtt_class *> :: iterator vtt;
double sr=(double) samplerate;
+
+ last_sample_rate=samplerate;
for (vtt=main_list.begin(); vtt!=main_list.end() ; vtt++) {
if ((*vtt)->audiofile) {
static vtt_class * focused_vtt;
static int solo_ctr;
static int mix_buffer_size;
+ static int last_sample_rate;
/* the gui */
vtt_gui gui;
void set_mix_mute(int newstate);
void set_mix_solo(int newstate);
+ static int get_last_sample_rate() { return last_sample_rate; }
+
void calc_mute()
{
res_mute=((mute) || (mix_mute && (!mix_solo)) || ((solo_ctr>0)&&(!mix_solo)));
elementFound=0;
restore_int("ladspa_id", dummy);
- restore_bool("hidden", hidden);
+ restore_bool("panel_hidden", hidden);
if ((!elementFound) && (xmlStrcmp(cur->name, (xmlChar *) "param")==0)) {
val=0;
elementFound=1;