Be more efficient when recording.

This commit is contained in:
Jonathan Moore Liles 2012-02-29 19:57:23 -08:00
parent 71e0583696
commit 9974e9bb47
7 changed files with 28 additions and 16 deletions

View File

@ -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;
} }

View File

@ -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,6 +125,7 @@ Grid::unlock ( void )
_rw = NULL; _rw = NULL;
if ( ! _suspend_update )
signal_events_change(); signal_events_change();
} }
} }

View File

@ -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:

View File

@ -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 * bool
midi_input_event ( int port ) 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;
} }
/** /**

View File

@ -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 );

View File

@ -96,11 +96,10 @@ init_song ( void )
void void
handle_midi_input ( void ) handle_midi_input ( void )
{ {
midievent *e; midievent e;
while ( ( e = midi_input_event( PERFORMANCE ) ) ) while ( ( midi_input_event( PERFORMANCE, &e ) ) )
{ {
pattern::record_event( e ); pattern::record_event( &e );
delete e;
} }
} }

View File

@ -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 )
{ {
@ -233,7 +236,9 @@ pattern::record_event ( const midievent *me )
p->_rw->events.insert( e ); p->_rw->events.insert( e );
} }
p->_suspend_update = true;
p->unlock(); p->unlock();
p->_suspend_update = false;
} }
} }