diff --git a/Timeline/Audio_Track.C b/Timeline/Audio_Track.C index 03d1d8c..6db587a 100644 --- a/Timeline/Audio_Track.C +++ b/Timeline/Audio_Track.C @@ -108,3 +108,36 @@ Audio_Track::handle ( int m ) return Track::handle( m ); } } + + +/**********/ +/* Engine */ +/**********/ + +/* THREAD: IO */ +/** determine region coverage and fill /buf/ with interleaved samples + * from /frame/ to /nframes/ for exactly /channels/ channels. */ +void +Audio_Track::play ( sample_t *buf, nframes_t frame, nframes_t nframes, int channels ) +{ + sample_t *cbuf = new sample_t[ nframes ]; + + /* quick and dirty--let the regions figure out coverage for themselves */ + for ( list ::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ ) + { + const Region *r = (Region*)i; + + for ( int i = channels; i-- ) + { + memset( cbuf, 0, nframes * sizeof( sample_t ) ); + + if ( ! r->read( cbuf, frame, nframes, i ) ) + /* error ? */; + + /* interleave */ + int k = 0; + for ( int j = 0; j < nframes; j += channels ) + buf[ j ] = cbuf[ k++ ]; + } + } +} diff --git a/Timeline/Audio_Track.H b/Timeline/Audio_Track.H index 0b12158..0564923 100644 --- a/Timeline/Audio_Track.H +++ b/Timeline/Audio_Track.H @@ -53,4 +53,6 @@ public: void dump ( void ); void remove_selected ( void ); + void play ( sample_t *buf, nframes_t frame, nframes_t nframes, int channels ); + }; diff --git a/Timeline/Disk_Stream.C b/Timeline/Disk_Stream.C index dc28c92..bd94b70 100644 --- a/Timeline/Disk_Stream.C +++ b/Timeline/Disk_Stream.C @@ -17,6 +17,8 @@ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*******************************************************************************/ +#include "Track_Header.H" + static float seconds_to_buffer = 5.0f; /* A Disk_Stream uses a separate I/O thread to stream a track's @@ -57,6 +59,12 @@ virtual ~Disk_Stream::Disk_Stream ( ) jack_ringbuffer_free( _rb[ i ] ); } +Audio_Track * +Disk_Stream::track ( void ) const +{ + return (Audio_Track*)_th->track(); +} + /** start Disk_Stream thread */ void Disk_Stream::run ( void ) @@ -77,7 +85,7 @@ Disk_Stream::io_thread ( void *arg ) void Disk_Stream::read_block ( sample_t *buf ) { - if ( _th->track()->play( buf, _frame, _nframes, channels() ) ) + if ( track()->play( buf, _frame, _nframes, channels() ) ) _frame += _nframes; else /* error */; diff --git a/Timeline/Disk_Stream.H b/Timeline/Disk_Stream.H index 42673a8..9813441 100644 --- a/Timeline/Disk_Stream.H +++ b/Timeline/Disk_Stream.H @@ -22,7 +22,10 @@ #include #include -#include "Track_Header.H" +#include +using std::vector; + +class Track_Header; class Disk_Stream { @@ -39,7 +42,7 @@ class Disk_Stream int channels ( void ) const { return _rb.size(); } - Track * track ( void ) const { return _th->track(); } + Audio_Track * track ( void ) const; protected: diff --git a/Timeline/Port.H b/Timeline/Port.H index d2288ea..6980dc8 100644 --- a/Timeline/Port.H +++ b/Timeline/Port.H @@ -30,6 +30,6 @@ public: bool connected ( void ) const { return jack_port_connected( _port ); } const char * name ( void ) const { return _name; } - nframes_t write ( sample_t *buf, nframes_t nframes ); + void write ( sample_t *buf, nframes_t nframes ); };