diff --git a/Timeline/Engine/Audio_File.C b/Timeline/Engine/Audio_File.C index 442af43..37fed10 100644 --- a/Timeline/Engine/Audio_File.C +++ b/Timeline/Engine/Audio_File.C @@ -55,6 +55,30 @@ Audio_File::all_supported_formats ( std::list &formats ) formats.push_back( fd->name ); } +static bool +is_absolute ( const char *name ) +{ + return *name == '/'; +} + +/** return a static pointer to /name/ corrected for relative path. */ +const char *Audio_File::realname ( const char *name ) +{ + static char rname[512]; + + if ( is_absolute( name ) ) + strncpy( rname, name, sizeof( rname ) ); + else + snprintf( rname, sizeof( rname ), "sources/%s", name ); + + return rname; +} + +const char * +Audio_File::filename ( void ) const +{ + return realname( _filename ); +} /** attmpet to open any supported filetype */ Audio_File * diff --git a/Timeline/Engine/Audio_File.H b/Timeline/Engine/Audio_File.H index 746975a..09b42ca 100644 --- a/Timeline/Engine/Audio_File.H +++ b/Timeline/Engine/Audio_File.H @@ -58,6 +58,8 @@ protected: static const format_desc * find_format ( const format_desc *fd, const char *name ); + static const char *realname ( const char *name ); + public: Audio_File ( ) : _peaks( this ) @@ -75,7 +77,9 @@ public: static Audio_File *from_file ( const char *filename ); + Peaks const * peaks ( ) { return &_peaks; } + const char *filename ( void ) const; const char *name ( void ) const { return _filename; } nframes_t length ( void ) const { return _length; } int channels ( void ) const { return _channels; } diff --git a/Timeline/Engine/Audio_File_SF.C b/Timeline/Engine/Audio_File_SF.C index 020a78f..d6f0187 100644 --- a/Timeline/Engine/Audio_File_SF.C +++ b/Timeline/Engine/Audio_File_SF.C @@ -61,7 +61,7 @@ Audio_File_SF::from_file ( const char *filename ) memset( &si, 0, sizeof( si ) ); - if ( ! ( in = sf_open( filename, SFM_READ, &si ) ) ) + if ( ! ( in = sf_open( realname( filename ), SFM_READ, &si ) ) ) return NULL; /* if ( si.samplerate != timeline->sample_rate() ) */ @@ -110,7 +110,7 @@ Audio_File_SF::create ( const char *filename, nframes_t samplerate, int channels char *name; asprintf( &name, "%s.%s", filename, fd->extension ); - if ( ! ( out = sf_open( name, SFM_WRITE, &si ) ) ) + if ( ! ( out = sf_open( realname( name ), SFM_WRITE, &si ) ) ) { printf( "couldn't create soundfile.\n" ); free( name ); @@ -140,7 +140,7 @@ Audio_File_SF::open ( void ) memset( &si, 0, sizeof( si ) ); - if ( ! ( _in = sf_open( _filename, SFM_READ, &si ) ) ) + if ( ! ( _in = sf_open( realname( _filename ), SFM_READ, &si ) ) ) return false; _current_read = 0; diff --git a/Timeline/Engine/Peaks.C b/Timeline/Engine/Peaks.C index b244207..c61a28e 100644 --- a/Timeline/Engine/Peaks.C +++ b/Timeline/Engine/Peaks.C @@ -353,7 +353,7 @@ Peaks::ready ( nframes_t s, int npeaks, nframes_t chunksize ) const { Peakfile _peakfile; - if ( ! _peakfile.open( _clip->name(), _clip->channels(), chunksize ) ) + if ( ! _peakfile.open( _clip->filename(), _clip->channels(), chunksize ) ) return false; return _peakfile.ready( s, npeaks ); @@ -377,7 +377,7 @@ Peaks::read_peakfile_peaks ( Peak *peaks, nframes_t s, int npeaks, nframes_t chu Peakfile _peakfile; - if ( ! _peakfile.open( _clip->name(), _clip->channels(), chunksize ) ) + if ( ! _peakfile.open( _clip->filename(), _clip->channels(), chunksize ) ) return 0; return _peakfile.read_peaks( peaks, s, npeaks, chunksize ); @@ -465,7 +465,7 @@ Peaks::read_peaks ( nframes_t s, int npeaks, nframes_t chunksize ) const bool Peaks::current ( void ) const { - return ! newer( _clip->name(), peakname( _clip->name() ) ); + return ! newer( _clip->filename(), peakname( _clip->filename() ) ); } bool @@ -507,7 +507,7 @@ Peaks::prepare_for_writing ( void ) assert( ! _peak_writer ); - _peak_writer = new Peaks::Streamer( _clip->name(), _clip->channels(), cache_minimum ); + _peak_writer = new Peaks::Streamer( _clip->filename(), _clip->channels(), cache_minimum ); } void @@ -678,7 +678,7 @@ Peaks::Builder::make_peaks_mipmap ( void ) Audio_File *_clip = _peaks->_clip; - const char *filename = _clip->name(); + const char *filename = _clip->filename(); FILE *rfp; @@ -728,7 +728,7 @@ Peaks::Builder::make_peaks_mipmap ( void ) /* open the peakfile for the previous cache level */ pf.open( rfp, _clip->channels(), cs >> Peaks::cache_step ); -// pf.open( _clip->name(), _clip->channels(), cs >> Peaks::cache_step ); +// pf.open( _clip->filename(), _clip->channels(), cs >> Peaks::cache_step ); write_block_header( cs ); @@ -758,7 +758,7 @@ Peaks::Builder::make_peaks ( void ) { Audio_File *_clip = _peaks->_clip; - const char *filename = _clip->name(); + const char *filename = _clip->filename(); DMESSAGE( "building peaks for \"%s\"", filename );