Replace Clip class with Audio_File abstract class who's children are interfaces to

various libraries.
pull/3/head
Jonathan Moore Liles 2008-02-22 02:19:20 -06:00
parent 8b92eb9318
commit 97b344d3dd
13 changed files with 136 additions and 107 deletions

43
Audio_File.C Normal file
View File

@ -0,0 +1,43 @@
/*******************************************************************************/
/* 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. */
/*******************************************************************************/
#include "Audio_File.H"
#include "Audio_File_SF.H"
/** attmpet to open any supported filetype */
Audio_File *
Audio_File::from_file ( const char * filename )
{
Audio_File *a;
if ( ( a = Audio_File_SF::from_file( filename ) ) )
goto done;
a->_peaks.open();
// TODO: other formats
return NULL;
done:
a->_peaks.open();
return a;
}

61
Audio_File.H Normal file
View File

@ -0,0 +1,61 @@
/*******************************************************************************/
/* 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
/* Base class for all audio file library interfaces */
#include <stdlib.h>
typedef unsigned long nframes_t;
typedef float sample_t;
#include "Peaks.H"
class Audio_File
{
protected:
Peaks _peaks;
const char *_filename;
nframes_t _length; /* length of file in samples */
public:
Audio_File ( ) : _peaks( this )
{
_filename = NULL;
_length = 0;
}
static Audio_File *from_file ( const char *filename );
Peaks const * peaks ( void ) { return &_peaks; }
const char *name ( void ) { return _filename; }
nframes_t length ( void ) { return _length; }
// Peaks const * peaks ( void ) { return &_peaks; }
virtual bool open ( void ) = 0;
virtual void close ( void ) = 0;
virtual void seek ( nframes_t offset ) = 0;
virtual nframes_t read ( sample_t *buf, nframes_t len ) = 0;
virtual nframes_t read ( sample_t *buf, nframes_t start, nframes_t end ) = 0;
};

View File

@ -17,7 +17,7 @@
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include "Clip.H"
#include "Audio_File_SF.H"
#include "Timeline.H"
#include <sndfile.h>
@ -25,56 +25,13 @@
#include <stdlib.h>
#include <string.h>
Clip::Clip ( void ) : _peaks( this )
{
_filename = NULL;
_length = 0;
}
/* Clip::Clip ( const char *filename ) : _peaks( this ) */
/* { */
/* _filename = filename; */
/* SNDFILE *in; */
/* SF_INFO si; */
/* memset( &si, 0, sizeof( si ) ); */
/* if ( ! ( in = sf_open( filename, SFM_READ, &si ) ) ) */
/* { */
/* printf( "couldn't open file\n" ); */
/* return; */
/* } */
/* if ( si.channels != 1 ) */
/* { */
/* printf( "error: incompatible format\n" ); */
/* return; */
/* } */
/* if ( si.samplerate != timeline->sample_rate ) */
/* { */
/* printf( "error: samplerate mismatch!\n" ); */
/* return; */
/* } */
/* _length = si.frames; */
/* sf_close( in ); */
/* _peaks.open(); */
/* } */
Clip *
Clip::from_file ( const char *filename )
Audio_File_SF *
Audio_File_SF::from_file ( const char *filename )
{
SNDFILE *in;
SF_INFO si;
Clip *c = NULL;
Audio_File_SF *c = NULL;
memset( &si, 0, sizeof( si ) );
@ -96,18 +53,15 @@ Clip::from_file ( const char *filename )
goto invalid;
}
c = new Clip;
c = new Audio_File_SF;
c->_filename = filename;
c->_length = si.frames;
sf_close( in );
c->_peaks.open();
return c;
invalid:
sf_close( in );
@ -115,7 +69,7 @@ invalid:
}
bool
Clip::open ( void )
Audio_File_SF::open ( void )
{
SF_INFO si;
@ -128,27 +82,26 @@ Clip::open ( void )
}
void
Clip::close ( void )
Audio_File_SF::close ( void )
{
sf_close( _in );
}
void
Clip::seek ( nframes_t offset )
Audio_File_SF::seek ( nframes_t offset )
{
sf_seek( _in, offset, SEEK_SET );
}
nframes_t
Clip::read ( sample_t *buf, nframes_t len )
Audio_File_SF::read ( sample_t *buf, nframes_t len )
{
return sf_read_float ( _in, buf, len );
}
/** read samples from /start/ to /end/ into /buf/ */
nframes_t
Clip::read ( sample_t *buf, nframes_t start, nframes_t end )
Audio_File_SF::read ( sample_t *buf, nframes_t start, nframes_t end )
{
open();

View File

@ -17,36 +17,19 @@
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#pragma once
typedef unsigned long nframes_t;
typedef float sample_t;
#include "Peaks.H"
#include "Audio_File.H"
#include <sndfile.h>
class Clip
class Audio_File_SF : public Audio_File
{
const char *_filename;
Peaks _peaks;
nframes_t _length; /* length of clip in samples */
// Audio_File_SF ( const char *filename )
SNDFILE *_in;
public:
Clip ( );
// Clip ( const char *filename );
static Clip *from_file ( const char *filename );
Peaks const * peaks ( void ) { return &_peaks; }
const char *name ( void ) { return _filename; }
nframes_t length ( void ) { return _length; }
static Audio_File_SF *from_file ( const char *filename );
bool open ( void );
void close ( void );

View File

@ -66,7 +66,7 @@ public:
printf( "pasted file \"%s\"\n", file );
Clip *c = Clip::from_file( file );
Audio_File *c = Audio_File::from_file( file );
if ( ! c )
{

View File

@ -5,7 +5,7 @@ CXXFLAGS=-ggdb -Wall -O0
LIBS=-lsndfile `fltk-config --ldflags`
# CXXFLAGS=`fltk-config -cxxflags`
SRCS= Clip.C Waveform.C Region.C Peaks.C main.C Track.C Timeline.C
SRCS= Waveform.C Region.C Peaks.C main.C Track.C Timeline.C Audio_File.C Audio_File_SF.C
OBJS=$(SRCS:.C=.o)
@ -24,7 +24,7 @@ test: $(OBJS)
$(CXX) $(CXXFLAGS) $(LIBS) $(OBJS) -o $@
clean:
rm -f $(OBJS) test
rm -f $(OBJS) test makedepend
valgrind:
valgrind ./test

View File

@ -31,7 +31,7 @@
#include <sndfile.h>
#include "Clip.H"
#include "Audio_File.H"
#include "assert.h"

View File

@ -28,7 +28,7 @@ struct Peak {
float max;
};
class Clip;
class Audio_File;
class Peaks
{
@ -56,7 +56,7 @@ class Peaks
static peakbuffer peakbuf;
Clip *_clip;
Audio_File *_clip;
peakdata *_peaks;
@ -67,9 +67,11 @@ class Peaks
Peak & peak ( nframes_t start, nframes_t end ) const;
Peaks ( );
public:
Peaks ( Clip *c )
Peaks ( Audio_File *c )
{
_peaks = new peakdata;

View File

@ -81,7 +81,7 @@ Region::Region ( const Region & rhs )
_scale = rhs._scale;
}
Region::Region ( Clip *c )
Region::Region ( Audio_File *c )
{
init();
_clip = c;

View File

@ -23,7 +23,7 @@
// #include "Waveform.H"
#include "Clip.H"
#include "Audio_File.H"
#include "Track.H"
#include "Timeline.H"
@ -38,7 +38,7 @@ using namespace std;
class Region : public Track_Widget
{
Clip *_clip; /* clip this region represents */
Audio_File *_clip; /* clip this region represents */
float _scale; /* amplitude adjustment */
@ -56,7 +56,7 @@ public:
Fl_Boxtype box ( void ) const { return Region::_box; }
Region ( const Region & rhs );
Region ( Clip *c );
Region ( Audio_File *c );
int handle ( int m );
void draw_box( int X, int Y, int W, int H );

View File

@ -24,7 +24,7 @@
#include <FL/Fl_Scrollbar.H>
#include <FL/Fl_Widget.H>
#include "Clip.H"
#include "Audio_File.H" // just for nframes_t
#include <math.h>
#include <assert.h>

View File

@ -24,27 +24,14 @@
#include <FL/fl_draw.H>
#include "Timeline.H"
// #include "Waveform.H"
#include "Clip.H"
#include "Audio_File.H"
// extern Timeline timeline;
// #include "Timeline.H"
#include <math.h>
/* void */
/* Waveform::draw ( void ) */
/* { */
/* int X, Y, W, H; */
/* fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); */
/* draw( X, y(), W, h() ); */
/* } */
/** draw a portion of /clip/'s waveform. coordinates are the portion to draw */
void
draw_waveform ( int X, int Y, int W, int H, Clip *_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, nframes_t _start, nframes_t _end, float _scale, Fl_Color color )
{
fl_push_clip( X, Y, W, H );

View File

@ -24,6 +24,6 @@
#include "Timeline.H"
#include "Clip.H"
#include "Audio_File.H"
void draw_waveform ( int X, int Y, int W, int H, Clip *_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, nframes_t _start, nframes_t _end, float _scale, Fl_Color color );