Avoid opening libsndfile sources in RDWR mode (doesn't work with FLAC)

pull/3/head
Jonathan Moore Liles 2008-04-26 01:33:44 -05:00
parent 7980d4b147
commit d426aac08d
5 changed files with 28 additions and 15 deletions

View File

@ -69,6 +69,7 @@ Audio_File_SF::from_file ( const char *filename )
c = new Audio_File_SF; c = new Audio_File_SF;
c->_peak_writer = NULL;
c->_current_read = 0; c->_current_read = 0;
c->_filename = strdup( filename ); c->_filename = strdup( filename );
c->_length = si.frames; c->_length = si.frames;
@ -124,7 +125,7 @@ Audio_File_SF::create ( const char *filename, nframes_t samplerate, int channels
c->_in = out; c->_in = out;
/* FIXME: 256 ? */ /* FIXME: 256 ? */
c->_peak_writer = new Peak_Writer( filename, 256, channels ); c->_peak_writer = new Peak_Writer( name, 256, channels );
return c; return c;
} }

View File

@ -893,10 +893,6 @@ Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channel ) co
/* now that we know how much and where to read, get on with it */ /* now that we know how much and where to read, get on with it */
/* FIXME: seeking can be very expensive. Esp. with compressed
* formats. We should attempt to avoid it. But here or in the
* Audio_File class? */
// printf( "reading region ofs = %lu, sofs = %lu, %lu-%lu\n", ofs, sofs, start, end ); // printf( "reading region ofs = %lu, sofs = %lu, %lu-%lu\n", ofs, sofs, start, end );
cnt = _clip->read( buf + ofs, channel, start, end ); cnt = _clip->read( buf + ofs, channel, start, end );
@ -947,19 +943,23 @@ Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channel ) co
/** write /nframes/ from /buf/ to source. /buf/ is interleaved and /** write /nframes/ from /buf/ to source. /buf/ is interleaved and
must match the channel layout of the write source! */ must match the channel layout of the write source! */
nframes_t nframes_t
Region::write ( sample_t *buf, nframes_t nframes ) Region::write ( nframes_t nframes )
{ {
nframes_t l = _clip->write( buf, nframes ); _range.end += nframes;
_range.end += l;
/* FIXME: too much? */ /* FIXME: too much? */
// _track->damage( FL_DAMAGE_EXPOSE, x() + w(), y(), 10/* FIXME: guess */, h() ); // _track->damage( FL_DAMAGE_EXPOSE, x() + w(), y(), 10/* FIXME: guess */, h() );
if ( 0 == ( timeline->ts_to_x( _range.end ) % 20 ) ) if ( 0 == ( timeline->ts_to_x( _range.end ) % 20 ) )
redraw(); {
/* FIXME: hack to get new size */
_clip->close();
_clip->open();
return l; redraw();
}
return nframes;
} }

View File

@ -201,7 +201,7 @@ public:
/* Engine */ /* Engine */
nframes_t read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channel ) const; nframes_t read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channel ) const;
nframes_t write ( sample_t *buf, nframes_t nframes ); nframes_t write ( nframes_t nframes );
void prepare ( void ); void prepare ( void );
bool finalize ( void ); bool finalize ( void );

View File

@ -643,8 +643,16 @@ Track::record ( nframes_t frame )
snprintf( pat, sizeof( pat ), "%s-%llu", name(), uuid() ); snprintf( pat, sizeof( pat ), "%s-%llu", name(), uuid() );
/* FIXME: hack */ _capture_af = Audio_File_SF::create( pat, 48000, input.size(), Track::capture_format );
Audio_File *af = Audio_File_SF::create( pat, 48000, input.size(), Track::capture_format );
if ( ! _capture_af )
{
/* ERROR */
}
/* open it again for reading in the GUI thread */
Audio_File *af = Audio_File::from_file( _capture_af->name() );
_capture = new Region( af, track(), frame ); _capture = new Region( af, track(), frame );
@ -656,7 +664,9 @@ Track::record ( nframes_t frame )
void void
Track::write ( sample_t *buf, nframes_t nframes ) Track::write ( sample_t *buf, nframes_t nframes )
{ {
_capture->write( buf, nframes ); nframes_t l = _capture_af->write( buf, nframes );
_capture->write( l );
} }
#include <stdio.h> #include <stdio.h>

View File

@ -45,6 +45,7 @@ class Playback_DS;
class Record_DS; class Record_DS;
class Port; class Port;
class Region; class Region;
class Audio_File;
class Track : public Fl_Group, public Loggable class Track : public Fl_Group, public Loggable
{ {
@ -75,6 +76,7 @@ private:
Sequence *_track; Sequence *_track;
Region *_capture; /* capture region */ Region *_capture; /* capture region */
Audio_File *_capture_af; /* capture write source */
bool configure_outputs ( int n ); bool configure_outputs ( int n );
bool configure_inputs ( int n ); bool configure_inputs ( int n );