Handle peaks for multichannel files.
This commit is contained in:
parent
6cfe9e8b6c
commit
f8fb113886
10
Audio_File.C
10
Audio_File.C
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
10
Audio_File.H
10
Audio_File.H
|
@ -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; }
|
||||||
|
|
|
@ -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; */
|
||||||
|
|
||||||
if ( ! ( _in = sf_open( _filename, SFM_READ, &si ) ) )
|
/* memset( &si, 0, sizeof( 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
|
||||||
|
|
8
Peaks.C
8
Peaks.C
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
20
Peaks.H
20
Peaks.H
|
@ -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;
|
||||||
|
|
9
Region.C
9
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() );
|
// 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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
15
Waveform.C
15
Waveform.C
|
@ -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 );
|
||||||
|
|
||||||
{
|
const Peaks *pk = _clip->peaks( channel );
|
||||||
_clip->peaks()->fill_buffer( _start,
|
|
||||||
_start + timeline->x_to_ts( W ) );
|
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;
|
||||||
|
|
||||||
|
|
|
@ -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…
Reference in New Issue