Browse Source

Work on freewheel mode.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
60132b8595
4 changed files with 51 additions and 27 deletions
  1. +32
    -21
      Timeline/Engine.C
  2. +1
    -1
      Timeline/Engine.H
  3. +9
    -0
      Timeline/Timeline.C
  4. +9
    -5
      Timeline/Timeline.H

+ 32
- 21
Timeline/Engine.C View File

@@ -95,8 +95,10 @@ Engine::freewheel ( bool starting )
{
_freewheeling = starting;

if ( _freewheeling )
FATAL( "Freewheeling mode is unimplemented" );
if ( starting )
DMESSAGE( "entering freewheeling mode" );
else
DMESSAGE( "leaving freewheeling mode" );
}

/* THREAD: RT */
@@ -174,29 +176,38 @@ Engine::process ( nframes_t nframes )
{
transport->poll();

if ( ! trylock() )
if ( freewheeling() )
{
/* the data structures we need to access here (tracks and
* their ports, but not track contents) may be in an
* inconsistent state at the moment. Just punt and drop this
* buffer. */
++_buffers_dropped;
return 0;
/* freewheeling mode/export. We're actually running
non-RT. Assume that everything is quiescent, locking is
unecessary and do I/O synchronously */
if ( timeline )
timeline->process( nframes );

/* because we're going faster than realtime. */
timeline->wait_for_buffers();
}
else
{
if ( ! trylock() )
{
/* the data structures we need to access here (tracks and
* their ports, but not track contents) may be in an
* inconsistent state at the moment. Just punt and drop this
* buffer. */
++_buffers_dropped;
return 0;
}

/* if ( ! transport->rolling ) */
/* timeline->silence( nframes ); */
/* return 0; */


/* handle chicken/egg problem */
if ( timeline )
/* this will initiate the process() call graph for the various
* number and types of tracks, which will in turn send data out
* the appropriate ports. */
timeline->process( nframes );
/* handle chicken/egg problem */
if ( timeline )
/* this will initiate the process() call graph for the various
* number and types of tracks, which will in turn send data out
* the appropriate ports. */
timeline->process( nframes );

unlock();
unlock();
}

return 0;
}


+ 1
- 1
Timeline/Engine.H View File

@@ -79,7 +79,7 @@ public:
nframes_t sample_rate ( void ) const { return _sample_rate; }
int xruns ( void ) const { return _xruns; };
int dropped ( void ) const { return _buffers_dropped; }
bool freehweeling ( void ) const { return _freewheeling; }
bool freewheeling ( void ) const { return _freewheeling; }
void freewheeling ( bool yes );

float cpu_load ( void ) const { return jack_cpu_load( _client ); }


+ 9
- 0
Timeline/Timeline.C View File

@@ -1284,6 +1284,15 @@ Timeline::total_output_buffer_percent ( void )
return r / cnt;
}

/** wait for I/O threads to fill their buffers */
void
Timeline::wait_for_buffers ( void )
{
while ( total_output_buffer_percent() + total_input_buffer_percent() < 200 )
usleep( 5000 );
}


int
Timeline::total_playback_xruns ( void )
{


+ 9
- 5
Timeline/Timeline.H View File

@@ -183,6 +183,14 @@ public:
void add_track ( Track *track );
void remove_track ( Track *track );


void zoom ( float secs );
void zoom_in ( void );
void zoom_out ( void );
void zoom_fit ( void );


/* Engine */
int total_input_buffer_percent ( void );
int total_output_buffer_percent ( void );

@@ -192,11 +200,7 @@ public:
bool record ( void );
void stop ( void );

void zoom ( float secs );
void zoom_in ( void );
void zoom_out ( void );
void zoom_fit ( void );

void wait_for_buffers ( void );

private:



Loading…
Cancel
Save