Fixing a memory corruption - and changing the way tX_midiin works. Not
authorterminatorX <>
Tue, 25 Mar 2003 23:31:21 +0000 (23:31 +0000)
committerterminatorX <>
Tue, 25 Mar 2003 23:31:21 +0000 (23:31 +0000)
fully finished yet - Alex

terminatorX/src/tX_engine.cc
terminatorX/src/tX_ladspa_class.cc
terminatorX/src/tX_midiin.cc
terminatorX/src/tX_midiin.h
terminatorX/src/tX_seqpar.cc
terminatorX/src/tX_seqpar.h

index e570fdf5828f513eab0c368e9793fbf0fd911721..604c0a9a81686c79766a0dfe8c7e652a8b8318a3 100644 (file)
@@ -171,7 +171,7 @@ int16_t* tX_engine :: render_cycle() {
        }
 
 #ifdef USE_ALSA_MIDI_IN                        
-       if (midi->get_is_open()) midi->check_event();
+//     if (midi->get_is_open()) midi->check_event();
 #endif                 
        /* Forward the sequencer... */
        sequencer.step();
@@ -195,7 +195,7 @@ void tX_engine :: loop() {
                loop_is_active=true;
                pthread_mutex_unlock(&start);
 
-               device->start(); // Hand flow control over to the device
+               if (!stop_flag) device->start(); // Hand flow control over to the device
                
                /* Stopping engine... */
                loop_is_active=false;
@@ -285,6 +285,7 @@ tX_engine :: tX_engine() {
        midi=new tX_midiin();
 #endif 
        tape=new tx_tapedeck();
+
        device=NULL;
        recording=false;
        recording_request=false;
index 9601ef786d9d8bb4aa328f9e24684416e4c3c6d2..0557fca0db3c92ecf2d57638f470c67e54c8c082 100644 (file)
@@ -134,7 +134,7 @@ void LADSPA_Class::scandir(char *dirname) {
                if ((strcmp(entry->d_name, ".")==0) ||
                        (strcmp(entry->d_name, "..")==0)) continue;
                
-               filename = (char *) malloc (dirlen + strlen(entry->d_name) + 1 + needslash);
+               filename = (char *) malloc (dirlen + strlen(entry->d_name) + 10 + needslash);
                
                strcpy(filename, "file:");
                strcat(filename, dirname);
index 394e1662241f17da5e1ac6ea1197a04090342bff..30d459a6148d48acdfd9d82a3d58e91f92d35ee0 100644 (file)
 
 using namespace std;
 
-/*
- disabled
-void tX_midievent::print( const char* prefix ) const
-{
-       cerr << prefix << ": channel=" << channel << ", type=" << type << ", number=" << number
-                << ", value=" << value << ", is_noteon=" << is_noteon << endl;          
+static gboolean midi_callback(GIOChannel *source, GIOCondition condition, gpointer data) {
+       tX_midiin *midi=(tX_midiin *) data;
+       midi->check_event();
 }
-*/
 
 tX_midiin::tX_midiin()
 {
@@ -49,7 +45,7 @@ tX_midiin::tX_midiin()
                tX_error("tX_midiin(): failed to open the default sequencer device.");
                return;
        }
-       snd_seq_set_client_name(ALSASeqHandle, "TerminatorX");
+       snd_seq_set_client_name(ALSASeqHandle, "terminatorX");
        portid =
                snd_seq_create_simple_port(ALSASeqHandle,
                                                                   "Control Input",
@@ -63,6 +59,18 @@ tX_midiin::tX_midiin()
 
        snd_seq_nonblock( ALSASeqHandle, 1 );
        
+       struct pollfd fds[32];
+       
+       int res=snd_seq_poll_descriptors (ALSASeqHandle, fds, 32, POLLIN);
+
+       if (res!=1) {
+               tX_error("Failed to poll ALSA descriptors: %i.\n", res);
+       }
+       
+       GIOChannel *ioc=g_io_channel_unix_new(fds[0].fd);
+       g_io_add_watch(ioc, (GIOCondition)( G_IO_IN ), midi_callback, (gpointer) this);
+       g_io_channel_unref(ioc);
+       
        is_open=true;
 
        tX_debug("tX_midiin(): sequencer successfully opened."); 
@@ -294,7 +302,7 @@ 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();
+       //this_->midi->check_event();
        
        tX_midievent tmpevent = this_->midi->get_last_event();
 
index 72d2c347a68c9b2e61a7a2542a24b856986b97fd..b3ff4e111241ce2e0736d4855f6674fa52a3f442 100644 (file)
@@ -53,6 +53,8 @@ class tX_midievent
                is_noteon = false;
        }
        
+       tX_midievent() : channel(0), type(NONE), value(0.0), is_noteon(false) {}
+       
        /* not being used anyway */
        // void print( const char* prefix ) const;
 };
index ad565cb2cb213023e2c8f24db8b88947b061ec64..a2c9dc40a1db0712f6ba3f0659d2575886237d3e 100644 (file)
@@ -38,7 +38,7 @@ pthread_mutex_t tX_seqpar :: update_lock = PTHREAD_MUTEX_INITIALIZER;
 
 #define tt ((vtt_class *) vtt)
 
-void tX_seqpar :: default_constructor()
+tX_seqpar :: tX_seqpar () : bound_midi_event()
 {
        touched=0;
        gui_active=1;
@@ -52,27 +52,6 @@ void tX_seqpar :: default_constructor()
        last_event_recorded=NULL;
 }
 
-tX_seqpar :: tX_seqpar ()
-{
-       default_constructor();
-}
-
-/*
-tX_seqpar :: tX_seqpar (void * mytt)
-{
-       default_constructor();
-       vtt=mytt;
-}
-
-tX_seqpar :: tX_seqpar (float max, float min, float scale, int mappable)
-{
-       default_constructor();
-       max_value=max;
-       min_value=min;
-       scale_value=scale;
-       is_mappable=mappable;
-}*/
-
 void tX_seqpar :: set_mapping_parameters(float max, float min, float scale, int mappable)
 {
        max_value=max;
@@ -81,18 +60,6 @@ void tX_seqpar :: set_mapping_parameters(float max, float min, float scale, int
        is_mappable=mappable;
 }
 
-/*
-tX_seqpar :: tX_seqpar (void *mytt, float max, float min, float scale, int mappable)
-{
-       default_constructor();
-       vtt=mytt;
-       max_value=max;
-       min_value=min;
-       scale_value=scale;
-       is_mappable=mappable;   
-}
-*/
-
 void tX_seqpar :: handle_mouse_input(float adjustment)
 {
        float tmpvalue;
@@ -129,14 +96,19 @@ void tX_seqpar :: handle_midi_input( const tX_midievent& event )
                }
 
                if (tmpvalue>max_value) tmpvalue=max_value;
-               if (tmpvalue<min_value) tmpvalue=min_value;
+               else if (tmpvalue<min_value) tmpvalue=min_value;
        }
        else
        {
                tmpvalue=event.value;
        }
-               
-       receive_input_value(tmpvalue);
+       
+       touch();
+
+       /* Not using receive() as we want immediate GUI update... */
+       do_exec(tmpvalue);
+       record_value(tmpvalue);
+       do_update_graphics();
 }
 #endif
 
@@ -409,7 +381,7 @@ void tX_seqpar_update_active_forward :: receive_forward_value(const float value)
 
 /**** Sequencable Parameter: MASTER VOLUME ****/
 
-tX_seqpar_master_volume :: tX_seqpar_master_volume()
+tX_seqpar_master_volume :: tX_seqpar_master_volume() 
 {
        set_mapping_parameters(2.5, 0, 0.1, 0);
 }
index ec110d5044e3f6bac79d85ace0d22e8ad2a1eeb4..c556c66e48ae9576d73a9a18611afaccb58e27b2 100644 (file)
@@ -60,8 +60,6 @@ class tX_seqpar
        guint32 persistence_id;
        guint32 touch_timestamp;                
        void *last_event_recorded;
-
-       void default_constructor();
        
        public:
        /* default constructor */