| @@ -84,7 +84,7 @@ Audio_File_SF::create ( const char *filename, nframes_t samplerate, int channels | |||
| /* FIXME: bogus */ | |||
| si.format = SF_FORMAT_WAV | SF_FORMAT_PCM_24 | SF_ENDIAN_CPU; | |||
| if ( ! ( out = sf_open( filename, SFM_WRITE, &si ) ) ) | |||
| if ( ! ( out = sf_open( filename, SFM_RDWR, &si ) ) ) | |||
| { | |||
| printf( "couldn't create soundfile.\n" ); | |||
| return NULL; | |||
| @@ -143,7 +143,7 @@ Audio_File_SF::seek ( nframes_t offset ) | |||
| { | |||
| if ( offset != _current_read ) | |||
| { | |||
| sf_seek( _in, _current_read = offset, SEEK_SET ); | |||
| sf_seek( _in, _current_read = offset, SEEK_SET | SFM_READ ); | |||
| } | |||
| } | |||
| @@ -196,7 +196,6 @@ Audio_File_SF::read ( sample_t *buf, int channel, nframes_t start, nframes_t end | |||
| return len; | |||
| } | |||
| /** write /nframes/ from /buf/ to soundfile. Should be interleaved for | |||
| * the appropriate number of channels */ | |||
| nframes_t | |||
| @@ -204,5 +203,9 @@ Audio_File_SF::write ( sample_t *buf, nframes_t nframes ) | |||
| { | |||
| _peak_writer->write( buf, nframes ); | |||
| return sf_writef_float( _in, buf, nframes ); | |||
| nframes_t l = sf_writef_float( _in, buf, nframes ); | |||
| _length += l; | |||
| return l; | |||
| } | |||
| @@ -41,7 +41,7 @@ Record_DS::write_block ( sample_t *buf, nframes_t nframes ) | |||
| // timeline->wrlock(); | |||
| _af->write( buf, nframes ); | |||
| _th->write( buf, nframes ); | |||
| // track()->record( buf, _frame, nframes, channels() ); | |||
| @@ -141,9 +141,11 @@ Record_DS::start ( nframes_t frame ) | |||
| return; | |||
| } | |||
| _af = Audio_File_SF::create( "testing.wav", 48000, channels(), "Wav/24" ); | |||
| _frame = frame; | |||
| _th->record( frame ); | |||
| run(); | |||
| _recording = true; | |||
| @@ -165,21 +167,23 @@ Record_DS::stop ( nframes_t frame ) | |||
| /* FIXME: flush buffers here? */ | |||
| char *name = strdup( _af->name() ); | |||
| delete _af; | |||
| _af = NULL; | |||
| /* char *name = strdup( _af->name() ); */ | |||
| /* delete _af; */ | |||
| /* _af = NULL; */ | |||
| Audio_File *af = Audio_File::from_file( name ); | |||
| /* Audio_File *af = Audio_File::from_file( name ); */ | |||
| if ( ! af ) | |||
| printf( "impossible!\n" ); | |||
| /* if ( ! af ) */ | |||
| /* printf( "impossible!\n" ); */ | |||
| new Region( af, track(), _frame ); | |||
| /* new Region( af, track(), _frame ); */ | |||
| track()->redraw(); | |||
| /* track()->redraw(); */ | |||
| _recording = false; | |||
| _th->stop( frame ); | |||
| printf( "recording finished\n" ); | |||
| } | |||
| @@ -101,6 +101,7 @@ private: | |||
| Fade _fade_in; | |||
| Fade _fade_out; | |||
| friend class Track_Header; /* for _clip */ | |||
| protected: | |||
| const char *class_name ( void ) { return "Region"; } | |||
| @@ -231,6 +232,8 @@ class Region : public Region_Base | |||
| bool current ( void ) const { return this == belowmouse(); } | |||
| friend class Track_Header; /* for _clip in Track_Header::write() */ | |||
| public: | |||
| @@ -333,3 +333,44 @@ Track_Header::seek ( nframes_t frame ) | |||
| if ( playback_ds ) | |||
| return playback_ds->seek( frame ); | |||
| } | |||
| /* FIXME: what about theading issues with this region/audiofile being | |||
| accessible from the UI thread? Need locking? */ | |||
| #include "Region.H" | |||
| /* THREAD: IO */ | |||
| /** create capture region and prepare to record */ | |||
| void | |||
| Track_Header::record ( nframes_t nframes ) | |||
| { | |||
| assert( _capture == NULL ); | |||
| /* FIXME: hack */ | |||
| Audio_File *af = Audio_File_SF::create( "testing.wav", 48000, input.size(), "Wav/24" ); | |||
| _capture = new Region( af, track(), nframes ); | |||
| /* FIXME: wrong place for this */ | |||
| _capture->_r->end = 0; | |||
| } | |||
| /* THREAD: IO */ | |||
| /** write a block to the (already opened) capture file */ | |||
| void | |||
| Track_Header::write ( sample_t *buf, nframes_t nframes ) | |||
| { | |||
| _capture->_r->end +=_capture->_clip->write( buf, nframes ); | |||
| /* FIXME: too much? */ | |||
| _capture->redraw(); | |||
| } | |||
| /* THREAD: IO */ | |||
| void | |||
| Track_Header::stop ( nframes_t nframes ) | |||
| { | |||
| _capture = NULL; | |||
| } | |||
| @@ -32,6 +32,7 @@ | |||
| // #include "Port.H" | |||
| /* TODO: rename this to Audio_Track_Header or something since it's audio specific. */ | |||
| #include <vector> | |||
| using std::vector; | |||
| @@ -65,6 +66,8 @@ private: | |||
| Track *_track; | |||
| Region *_capture; /* capture region */ | |||
| public: | |||
| Fl_Input * name_field; | |||
| @@ -274,5 +277,9 @@ public: | |||
| /* Engine */ | |||
| nframes_t process ( nframes_t nframes ); | |||
| void seek ( nframes_t frame ); | |||
| void record ( nframes_t nframes ); | |||
| void write ( sample_t *buf, nframes_t nframes ); | |||
| void stop ( nframes_t nframes ); | |||
| }; | |||
| #endif | |||