@@ -504,6 +504,7 @@ Canvas::draw_playhead ( void ) | |||||
} | } | ||||
} | } | ||||
copy(); | copy(); | ||||
for ( uint x = m.vp->w; x-- ; ) | for ( uint x = m.vp->w; x-- ; ) | ||||
@@ -512,6 +513,13 @@ Canvas::draw_playhead ( void ) | |||||
flip(); | flip(); | ||||
/* actually if we're recording, we should draw the grid once per | |||||
* playhead movement also */ | |||||
if ( pattern::recording() == m.grid ) | |||||
{ | |||||
draw(); | |||||
} | |||||
return 1; | return 1; | ||||
} | } | ||||
@@ -52,6 +52,7 @@ Grid::Grid ( void ) | |||||
viewport.y = 0; | viewport.y = 0; | ||||
_playing = false; | _playing = false; | ||||
_suspend_update = false; | |||||
_start = _end = _index = 0; | _start = _end = _index = 0; | ||||
} | } | ||||
@@ -124,7 +125,8 @@ Grid::unlock ( void ) | |||||
_rw = NULL; | _rw = NULL; | ||||
signal_events_change(); | |||||
if ( ! _suspend_update ) | |||||
signal_events_change(); | |||||
} | } | ||||
} | } | ||||
@@ -111,6 +111,8 @@ protected: | |||||
int _draw_shape; | int _draw_shape; | ||||
bool _suspend_update; | |||||
unsigned int _bpb; /* beats per bar */ | unsigned int _bpb; /* beats per bar */ | ||||
unsigned int _ppqn; /* pulses per quarter note (beat) */ | unsigned int _ppqn; /* pulses per quarter note (beat) */ | ||||
@@ -142,7 +144,7 @@ protected: | |||||
private: | private: | ||||
int _locked; | |||||
volatile int _locked; | |||||
public: | public: | ||||
@@ -89,19 +89,15 @@ static port_t input[2]; /* contro | |||||
jack_nframes_t nframes; /* for compatibility with older jack */ | jack_nframes_t nframes; /* for compatibility with older jack */ | ||||
/** get next recorded event, if any--runs in UI thread */ | /** get next recorded event, if any--runs in UI thread */ | ||||
midievent * | |||||
midi_input_event ( int port ) | |||||
bool | |||||
midi_input_event ( int port, midievent *me ) | |||||
{ | { | ||||
if ( jack_ringbuffer_read_space( input[ port ].ring_buf ) >= sizeof( midievent ) ) | if ( jack_ringbuffer_read_space( input[ port ].ring_buf ) >= sizeof( midievent ) ) | ||||
{ | { | ||||
midievent *me = new midievent; | |||||
// MESSAGE( "passing midi input to non-RT thread" ); | |||||
if ( jack_ringbuffer_read( input[ port ].ring_buf, (char *)me, sizeof( midievent ) ) ) | if ( jack_ringbuffer_read( input[ port ].ring_buf, (char *)me, sizeof( midievent ) ) ) | ||||
return me; | |||||
return true; | |||||
} | } | ||||
return NULL; | |||||
return false; | |||||
} | } | ||||
/** | /** | ||||
@@ -7,7 +7,7 @@ enum { CONTROL, PERFORMANCE }; | |||||
class midievent; | class midievent; | ||||
midievent * midi_input_event ( int port ); | |||||
bool midi_input_event ( int port, midievent *e ); | |||||
void midi_output_event ( int port, const midievent *e ); | void midi_output_event ( int port, const midievent *e ); | ||||
void midi_output_event ( int port, const midievent *e, tick_t duration ); | void midi_output_event ( int port, const midievent *e, tick_t duration ); | ||||
void midi_all_sound_off ( void ); | void midi_all_sound_off ( void ); | ||||
@@ -96,11 +96,10 @@ init_song ( void ) | |||||
void | void | ||||
handle_midi_input ( void ) | handle_midi_input ( void ) | ||||
{ | { | ||||
midievent *e; | |||||
while ( ( e = midi_input_event( PERFORMANCE ) ) ) | |||||
midievent e; | |||||
while ( ( midi_input_event( PERFORMANCE, &e ) ) ) | |||||
{ | { | ||||
pattern::record_event( e ); | |||||
delete e; | |||||
pattern::record_event( &e ); | |||||
} | } | ||||
} | } | ||||
@@ -136,6 +136,9 @@ pattern::reset ( void ) | |||||
} | } | ||||
} | } | ||||
/* records a MIDI event into a temporary buffer. It'll only be | |||||
* permanently added to pattern after recording stops or the pattern | |||||
* loops. */ | |||||
void | void | ||||
pattern::record_event ( const midievent *me ) | pattern::record_event ( const midievent *me ) | ||||
{ | { | ||||
@@ -232,8 +235,10 @@ pattern::record_event ( const midievent *me ) | |||||
el->unlink( e ); | el->unlink( e ); | ||||
p->_rw->events.insert( e ); | p->_rw->events.insert( e ); | ||||
} | } | ||||
p->_suspend_update = true; | |||||
p->unlock(); | p->unlock(); | ||||
p->_suspend_update = false; | |||||
} | } | ||||
} | } | ||||