Browse Source

Handle peaks for multichannel files.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
f8fb113886
8 changed files with 61 additions and 27 deletions
  1. +9
    -1
      Audio_File.C
  2. +6
    -4
      Audio_File.H
  3. +8
    -6
      Audio_File_SF.C
  4. +4
    -4
      Peaks.C
  5. +19
    -1
      Peaks.H
  6. +7
    -2
      Region.C
  7. +7
    -8
      Waveform.C
  8. +1
    -1
      Waveform.H

+ 9
- 1
Audio_File.C View File

@@ -36,6 +36,14 @@ Audio_File::from_file ( const char * filename )


done: 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; return a;
} }

+ 6
- 4
Audio_File.H View File

@@ -32,22 +32,24 @@ class Audio_File


protected: protected:


Peaks _peaks;
const char *_filename; const char *_filename;
nframes_t _length; /* length of file in samples */ nframes_t _length; /* length of file in samples */
int _channels; int _channels;


Peaks *_peaks;

public: public:


Audio_File ( ) : _peaks( this )
Audio_File ( )
{ {
_filename = NULL; _filename = NULL;
_length = 0;
_length = _channels = 0;
} }


static Audio_File *from_file ( const char *filename ); 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; } const char *name ( void ) const { return _filename; }
nframes_t length ( void ) const { return _length; } nframes_t length ( void ) const { return _length; }
int channels ( void ) const { return _channels; } int channels ( void ) const { return _channels; }


+ 8
- 6
Audio_File_SF.C View File

@@ -59,7 +59,8 @@ Audio_File_SF::from_file ( const char *filename )
c->_length = si.frames; c->_length = si.frames;
c->_channels = si.channels; c->_channels = si.channels;


sf_close( in );
c->_in = in;
// sf_close( in );


return c; return c;


@@ -72,12 +73,13 @@ invalid:
bool bool
Audio_File_SF::open ( void ) Audio_File_SF::open ( void )
{ {
SF_INFO si;


memset( &si, 0, sizeof( si ) );
/* SF_INFO si; */

/* memset( &si, 0, sizeof( si ) ); */


if ( ! ( _in = sf_open( _filename, SFM_READ, &si ) ) )
return false;
/* if ( ! ( _in = sf_open( _filename, SFM_READ, &si ) ) ) */
/* return false; */


return true; return true;
} }
@@ -85,7 +87,7 @@ Audio_File_SF::open ( void )
void void
Audio_File_SF::close ( void ) Audio_File_SF::close ( void )
{ {
sf_close( _in );
// sf_close( _in );
} }


void void


+ 4
- 4
Peaks.C View File

@@ -92,7 +92,7 @@ Peaks::clip_read_peaks ( Peak *peaks, int npeaks, int chunksize ) const
for ( i = 0; i < npeaks; ++i ) for ( i = 0; i < npeaks; ++i )
{ {
/* read in a buffer */ /* read in a buffer */
len = _clip->read( fbuf, 0, chunksize );
len = _clip->read( fbuf, _channel, chunksize );


Peak &p = peaks[ i ]; Peak &p = peaks[ i ];
p.min = 0; 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 ) ); return peak( timeline->x_to_ts( X ), timeline->x_to_ts( X + 1 ) );
} }


static
const char * const char *
peakname ( const char *filename )
Peaks::peakname ( const char *filename ) const
{ {
static char file[512]; static char file[512];


snprintf( file, 512, "%s.peak", filename );
snprintf( file, 512, "%s.peak-%d", filename, _channel );


return (const char*)&file; return (const char*)&file;
} }


+ 19
- 1
Peaks.H View File

@@ -57,6 +57,7 @@ class Peaks
static peakbuffer peakbuf; static peakbuffer peakbuf;


Audio_File *_clip; Audio_File *_clip;
int _channel;


peakdata *_peaks; peakdata *_peaks;


@@ -65,12 +66,25 @@ class Peaks
void read_peaks ( int s, int e, int npeaks, int chunksize ) const; void read_peaks ( int s, int e, int npeaks, int chunksize ) const;
int clip_read_peaks ( Peak *peaks, 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; Peak & peak ( nframes_t start, nframes_t end ) const;


Peaks ( );
// Peaks ( );


public: public:


Peaks ( )
{
_peaks = new peakdata;

_peaks->chunksize = 0;
_len = 0;
_clip = NULL;
_channel = 0;

}

Peaks ( Audio_File *c ) Peaks ( Audio_File *c )
{ {
_peaks = new peakdata; _peaks = new peakdata;
@@ -78,8 +92,12 @@ public:
_peaks->chunksize = 0; _peaks->chunksize = 0;
_len = 0; _len = 0;
_clip = c; _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 fill_buffer ( int s, int e ) const;


void downsample ( Peak *peaks, int s, int e, float *mhi, float *mlo ) const; void downsample ( Peak *peaks, int s, int e, float *mhi, float *mlo ) const;


+ 7
- 2
Region.C View File

@@ -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() ); // 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 ); 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 ); 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 );
} }






+ 7
- 8
Waveform.C View File

@@ -31,7 +31,7 @@


/** draw a portion of /clip/'s waveform. coordinates are the portion to draw */ /** draw a portion of /clip/'s waveform. coordinates are the portion to draw */
void 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 ); 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 ); 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; j = start;
for ( int x = X; x < X + W; ++x, ++j ) for ( int x = X; x < X + W; ++x, ++j )
{ {
Peak p = (*_clip->peaks())[ j ];
Peak p = (*pk)[ j ];


int mid = Y + (H / 2); 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; j = start;
for ( int x = X; x < X + W; ++x, ++j ) for ( int x = X; x < X + W; ++x, ++j )
{ {
Peak p = (*_clip->peaks())[ j ];
Peak p = (*pk)[ j ];


p.min *= _scale; 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; j = start;
for ( int x = X; x < X + W; ++x, ++j ) for ( int x = X; x < X + W; ++x, ++j )
{ {
Peak p = (*_clip->peaks())[ j ];
Peak p = (*pk)[ j ];


p.max *= _scale; p.max *= _scale;




+ 1
- 1
Waveform.H View File

@@ -26,4 +26,4 @@


#include "Audio_File.H" #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 );

Loading…
Cancel
Save