| @@ -17,18 +17,19 @@ | |||
| /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
| /*******************************************************************************/ | |||
| /* FIXME: need locking for when disk thread and peak reader are | |||
| * interested in the same source? */ | |||
| #include "Audio_File.H" | |||
| #include "Audio_File_SF.H" | |||
| #include "Audio_File_Dummy.H" | |||
| #include "debug.h" | |||
| std::map <std::string, Audio_File*> Audio_File::_open_files; | |||
| Audio_File::~Audio_File ( ) | |||
| { | |||
| _open_files[ std::string( _filename ) ] = NULL; | |||
| if ( _filename ) | |||
| free( _filename ); | |||
| } | |||
| void | |||
| @@ -58,14 +59,15 @@ Audio_File::from_file ( const char * filename ) | |||
| // TODO: other formats | |||
| return NULL; | |||
| DWARNING( "creating dummy source for \"%s\"", filename ); | |||
| done: | |||
| /* FIXME: wrong place for this? */ | |||
| if ( ( a = Audio_File_Dummy::from_file( filename ) ) ) | |||
| goto done; | |||
| /* a->_peaks = new Peaks; */ | |||
| return NULL; | |||
| /* a->_peaks->clip( a ); */ | |||
| /* a->_peaks->open(); */ | |||
| done: | |||
| _open_files[ std::string( filename ) ] = a; | |||
| @@ -78,21 +80,26 @@ Audio_File::read_peaks( float fpp, nframes_t start, nframes_t end, int *peaks, P | |||
| { | |||
| // Peaks pk; | |||
| *peaks = 0; | |||
| *channels = 0; | |||
| *pbuf = NULL; | |||
| // pk.clip( this ); | |||
| if ( dummy() ) | |||
| { | |||
| *peaks = (end - start) / fpp; | |||
| *channels = 0; | |||
| *pbuf = NULL; | |||
| /* /\* only open peaks (and potentially generate) when first requested *\/ */ | |||
| /* if ( ! _peaks.open() ) */ | |||
| /* return false; */ | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| *peaks = 0; | |||
| *channels = 0; | |||
| *pbuf = NULL; | |||
| *peaks = _peaks.fill_buffer( fpp, start, end ); | |||
| *peaks = _peaks.fill_buffer( fpp, start, end ); | |||
| *channels = this->channels(); | |||
| *channels = this->channels(); | |||
| *pbuf = _peaks.peakbuf(); | |||
| *pbuf = _peaks.peakbuf(); | |||
| return true; | |||
| return true; | |||
| } | |||
| } | |||
| @@ -50,7 +50,7 @@ protected: | |||
| unsigned long id; | |||
| }; | |||
| const char *_filename; | |||
| char *_filename; | |||
| volatile nframes_t _length; /* length of file in samples */ | |||
| nframes_t _samplerate; /* sample rate */ | |||
| int _channels; | |||
| @@ -79,6 +79,8 @@ public: | |||
| virtual ~Audio_File ( ); | |||
| virtual bool dummy ( void ) const { return false; } | |||
| static void all_supported_formats ( std::list <const char *> &formats ); | |||
| static Audio_File *from_file ( const char *filename ); | |||
| @@ -0,0 +1,53 @@ | |||
| /*******************************************************************************/ | |||
| /* Copyright (C) 2008 Jonathan Moore Liles */ | |||
| /* */ | |||
| /* This program is free software; you can redistribute it and/or modify it */ | |||
| /* under the terms of the GNU General Public License as published by the */ | |||
| /* Free Software Foundation; either version 2 of the License, or (at your */ | |||
| /* option) any later version. */ | |||
| /* */ | |||
| /* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
| /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
| /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
| /* more details. */ | |||
| /* */ | |||
| /* You should have received a copy of the GNU General Public License along */ | |||
| /* with This program; see the file COPYING. If not,write to the Free Software */ | |||
| /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
| /*******************************************************************************/ | |||
| #pragma once | |||
| #include "Audio_File.H" | |||
| class Audio_File_Dummy : public Audio_File | |||
| { | |||
| Audio_File_Dummy ( ) | |||
| { | |||
| } | |||
| public: | |||
| /* static const Audio_File::format_desc supported_formats[]; */ | |||
| static Audio_File_Dummy *from_file ( const char *filename ) | |||
| { | |||
| Audio_File_Dummy *d = new Audio_File_Dummy; | |||
| d->_filename = strdup( filename ); | |||
| return d; | |||
| } | |||
| bool dummy ( void ) const { return true; } | |||
| ~Audio_File_Dummy ( ) | |||
| { | |||
| } | |||
| bool open ( void ) { return true; } | |||
| void close ( void ) { } | |||
| void seek ( nframes_t ) { } | |||
| nframes_t read ( sample_t *, int, nframes_t len ) { return len; } | |||
| nframes_t read ( sample_t *, int, nframes_t start, nframes_t end ) { return end - start; } | |||
| nframes_t write ( sample_t *, nframes_t nframes ) { return nframes; } | |||
| }; | |||
| @@ -58,10 +58,7 @@ Audio_File_SF::from_file ( const char *filename ) | |||
| memset( &si, 0, sizeof( si ) ); | |||
| if ( ! ( in = sf_open( filename, SFM_READ, &si ) ) ) | |||
| { | |||
| printf( "couldn't open file\n" ); | |||
| return NULL; | |||
| } | |||
| /* if ( si.samplerate != timeline->sample_rate() ) */ | |||
| /* { */ | |||
| @@ -17,6 +17,8 @@ | |||
| /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
| /*******************************************************************************/ | |||
| #pragma once | |||
| #include "Audio_File.H" | |||
| #include <sndfile.h> | |||
| @@ -636,7 +636,14 @@ Audio_Region::draw ( void ) | |||
| /* fl_line( rx, Y, rx, Y + H ); */ | |||
| /* fl_line( rx + rw - 1, Y, rx + rw - 1, Y + H ); */ | |||
| draw_label( _clip->name(), align() ); | |||
| if ( _clip->dummy() ) | |||
| { | |||
| char pat[256]; | |||
| snprintf( pat, sizeof( pat ), "Missing Source!: %s", _clip->name() ); | |||
| draw_label( pat, align() ); | |||
| } | |||
| else | |||
| draw_label( _clip->name(), align() ); | |||
| /* if ( current() ) */ | |||
| /* { */ | |||