diff --git a/Audio_File.C b/Audio_File.C index f4eada4..ac7a60b 100644 --- a/Audio_File.C +++ b/Audio_File.C @@ -36,6 +36,14 @@ Audio_File::from_file ( const char * filename ) done: - a->_peaks.open(); + a->_peaks = new Peaks[ a->channels() ]; + + for ( int i = a->channels(); i-- ; ) + { + a->_peaks[i].channel( i ); + a->_peaks[i].clip( a ); + a->_peaks[i].open(); + } + return a; } diff --git a/Audio_File.H b/Audio_File.H index e7670c5..19659fc 100644 --- a/Audio_File.H +++ b/Audio_File.H @@ -32,22 +32,24 @@ class Audio_File protected: - Peaks _peaks; + const char *_filename; nframes_t _length; /* length of file in samples */ int _channels; + Peaks *_peaks; + public: - Audio_File ( ) : _peaks( this ) + Audio_File ( ) { _filename = NULL; - _length = 0; + _length = _channels = 0; } static Audio_File *from_file ( const char *filename ); - Peaks const * peaks ( void ) { return &_peaks; } + Peaks const * peaks ( int channel ) { return &_peaks[ channel ]; } const char *name ( void ) const { return _filename; } nframes_t length ( void ) const { return _length; } int channels ( void ) const { return _channels; } diff --git a/Audio_File_SF.C b/Audio_File_SF.C index 186795c..f0e77c5 100644 --- a/Audio_File_SF.C +++ b/Audio_File_SF.C @@ -59,7 +59,8 @@ Audio_File_SF::from_file ( const char *filename ) c->_length = si.frames; c->_channels = si.channels; - sf_close( in ); + c->_in = in; +// sf_close( in ); return c; @@ -72,12 +73,13 @@ invalid: bool Audio_File_SF::open ( void ) { - SF_INFO si; - memset( &si, 0, sizeof( si ) ); +/* SF_INFO si; */ - if ( ! ( _in = sf_open( _filename, SFM_READ, &si ) ) ) - return false; +/* memset( &si, 0, sizeof( si ) ); */ + +/* if ( ! ( _in = sf_open( _filename, SFM_READ, &si ) ) ) */ +/* return false; */ return true; } @@ -85,7 +87,7 @@ Audio_File_SF::open ( void ) void Audio_File_SF::close ( void ) { - sf_close( _in ); +// sf_close( _in ); } void diff --git a/Peaks.C b/Peaks.C index faf4199..dff5f0e 100644 --- a/Peaks.C +++ b/Peaks.C @@ -92,7 +92,7 @@ Peaks::clip_read_peaks ( Peak *peaks, int npeaks, int chunksize ) const for ( i = 0; i < npeaks; ++i ) { /* read in a buffer */ - len = _clip->read( fbuf, 0, chunksize ); + len = _clip->read( fbuf, _channel, chunksize ); Peak &p = peaks[ i ]; p.min = 0; @@ -178,13 +178,13 @@ Peaks::operator[] ( int X ) const return peak( timeline->x_to_ts( X ), timeline->x_to_ts( X + 1 ) ); } -static + const char * -peakname ( const char *filename ) +Peaks::peakname ( const char *filename ) const { static char file[512]; - snprintf( file, 512, "%s.peak", filename ); + snprintf( file, 512, "%s.peak-%d", filename, _channel ); return (const char*)&file; } diff --git a/Peaks.H b/Peaks.H index dcef47c..a943573 100644 --- a/Peaks.H +++ b/Peaks.H @@ -57,6 +57,7 @@ class Peaks static peakbuffer peakbuf; Audio_File *_clip; + int _channel; peakdata *_peaks; @@ -65,12 +66,25 @@ class Peaks void read_peaks ( int s, int e, int npeaks, int chunksize ) const; int clip_read_peaks ( Peak *peaks, int npeaks, int chunksize ) const; + const char *peakname ( const char *filename ) const; + Peak & peak ( nframes_t start, nframes_t end ) const; - Peaks ( ); + // Peaks ( ); public: + Peaks ( ) + { + _peaks = new peakdata; + + _peaks->chunksize = 0; + _len = 0; + _clip = NULL; + _channel = 0; + + } + Peaks ( Audio_File *c ) { _peaks = new peakdata; @@ -78,8 +92,12 @@ public: _peaks->chunksize = 0; _len = 0; _clip = c; + _channel = 0; } + void clip ( Audio_File *c ) { _clip = c; } + void channel ( int v ) { _channel = v; } + void fill_buffer ( int s, int e ) const; void downsample ( Peak *peaks, int s, int e, float *mhi, float *mlo ) const; diff --git a/Region.C b/Region.C index 5edacfb..a9bdb79 100644 --- a/Region.C +++ b/Region.C @@ -345,7 +345,11 @@ Region::draw ( int X, int Y, int W, int H ) // fl_push_clip( x() + Fl::box_dx( box() ), y(), w() - Fl::box_dw( box() ), h() ); - draw_waveform( rx, Y, rw, H, _clip, _start + offset, min( (_end - _start) - offset, _end), _scale, _selected ? _color : fl_invert_color( _color ) ); + int ch = H / _clip->channels(); + for ( int i = _clip->channels(); i--; ) + draw_waveform( rx, Y + (i * ch), rw, ch, _clip, i, + _start + offset, min( (_end - _start) - offset, _end), + _scale, _selected ? _color : fl_invert_color( _color ) ); timeline->draw_measure_lines( rx, Y, rw, H, _box_color ); @@ -376,7 +380,8 @@ Region::normalize ( void ) { printf( "normalize: start=%lu end=%lu\n", _start, _end ); - _scale = _clip->peaks()->normalization_factor( _start, _end ); + /* FIXME: punt */ + _scale = _clip->peaks( 0 )->normalization_factor( _start, _end ); } diff --git a/Waveform.C b/Waveform.C index 9f03e83..6896c60 100644 --- a/Waveform.C +++ b/Waveform.C @@ -31,7 +31,7 @@ /** draw a portion of /clip/'s waveform. coordinates are the portion to draw */ void -draw_waveform ( int X, int Y, int W, int H, Audio_File *_clip, nframes_t _start, nframes_t _end, float _scale, Fl_Color color ) +draw_waveform ( int X, int Y, int W, int H, Audio_File *_clip, int channel, nframes_t _start, nframes_t _end, float _scale, Fl_Color color ) { fl_push_clip( X, Y, W, H ); @@ -39,15 +39,14 @@ draw_waveform ( int X, int Y, int W, int H, Audio_File *_clip, nframes_t _start, int start = timeline->ts_to_x( _start ); - { - _clip->peaks()->fill_buffer( _start, - _start + timeline->x_to_ts( W ) ); - } + const Peaks *pk = _clip->peaks( channel ); + + pk->fill_buffer( _start, _start + timeline->x_to_ts( W ) ); j = start; for ( int x = X; x < X + W; ++x, ++j ) { - Peak p = (*_clip->peaks())[ j ]; + Peak p = (*pk)[ j ]; int mid = Y + (H / 2); @@ -73,7 +72,7 @@ draw_waveform ( int X, int Y, int W, int H, Audio_File *_clip, nframes_t _start, j = start; for ( int x = X; x < X + W; ++x, ++j ) { - Peak p = (*_clip->peaks())[ j ]; + Peak p = (*pk)[ j ]; p.min *= _scale; @@ -87,7 +86,7 @@ draw_waveform ( int X, int Y, int W, int H, Audio_File *_clip, nframes_t _start, j = start; for ( int x = X; x < X + W; ++x, ++j ) { - Peak p = (*_clip->peaks())[ j ]; + Peak p = (*pk)[ j ]; p.max *= _scale; diff --git a/Waveform.H b/Waveform.H index 45d6f06..f89e67e 100644 --- a/Waveform.H +++ b/Waveform.H @@ -26,4 +26,4 @@ #include "Audio_File.H" -void draw_waveform ( int X, int Y, int W, int H, Audio_File *_clip, nframes_t _start, nframes_t _end, float _scale, Fl_Color color ); +void draw_waveform ( int X, int Y, int W, int H, Audio_File *_clip, int channel, nframes_t _start, nframes_t _end, float _scale, Fl_Color color );