|  | 
/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles                                     */
/*                                                                             */
/* This program is free software; you can redistribute it and/or modify it     */
/* under the terms of the GNU General Public License as published by the       */
/* Free Software Foundation; either version 2 of the License, or (at your      */
/* option) any later version.                                                  */
/*                                                                             */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       */
/* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for   */
/* more details.                                                               */
/*                                                                             */
/* You should have received a copy of the GNU General Public License along     */
/* with This program; see the file COPYING.  If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
/*******************************************************************************/
#include "../Timeline.H"
#include "../Transport.H" // for .rolling
#include "../Track.H"
#include "Record_DS.H"
#include "Playback_DS.H"
/** Initiate recording for all armed tracks */
bool
Timeline::record ( void )
{
    /* FIXME: right place for this? */
    transport->recording = true;
    Loggable::block_start();
    nframes_t frame = transport->frame;
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        if ( t->armed() && t->record_ds )
            t->record_ds->start( frame );
    }
    deactivate();
    return true;
}
/** stop recording for all armed tracks */
void
Timeline::stop ( void )
{
    nframes_t frame = transport->frame;
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        if ( t->armed() && t->record_ds )
            t->record_ds->stop( frame );
    }
    Loggable::block_end();
    activate();
    transport->recording = false;
}
/**********/
/* Engine */
/**********/
/** call process() on each track header */
nframes_t
Timeline::process ( nframes_t nframes )
{
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        t->process( nframes );
    }
    /* FIXME: BOGUS */
    return nframes;
}
/* THREAD: RT */
void
Timeline::seek ( nframes_t frame )
{
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        t->seek( frame );
    }
}
/* THREAD: RT (non-RT) */
void
Timeline::resize_buffers ( nframes_t nframes )
{
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        t->resize_buffers( nframes );
    }
}
/* THREAD: RT */
int
Timeline::seek_pending ( void )
{
    int r = 0;
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        if ( t->playback_ds )
            r += t->playback_ds->buffer_percent() < 50;
    }
    return r;
}
/* FIXME: shouldn't these belong to the engine? */
int
Timeline::total_input_buffer_percent ( void )
{
    int r = 0;
    int cnt = 0;
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        if ( t->record_ds )
        {
            ++cnt;
            r += t->record_ds->buffer_percent();
        }
    }
    if ( ! cnt )
        return 0;
    return r / cnt;
}
int
Timeline::total_output_buffer_percent ( void )
{
    int r = 0;
    int cnt = 0;
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        if ( t->playback_ds )
        {
            ++cnt;
            r += t->playback_ds->buffer_percent();
        }
    }
    if ( ! cnt )
        return 0;
    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 )
{
    int r = 0;
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        if ( t->playback_ds )
            r += t->playback_ds->xruns();
    }
    return r;
}
int
Timeline::total_capture_xruns ( void )
{
    int r = 0;
    for ( int i = tracks->children(); i-- ; )
    {
        Track *t = (Track*)tracks->child( i );
        if ( t->record_ds )
            r += t->record_ds->xruns();
    }
    return r;
}
 |