Browse Source

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

various libraries.
tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
97b344d3dd
13 changed files with 136 additions and 107 deletions
  1. +43
    -0
      Audio_File.C
  2. +61
    -0
      Audio_File.H
  3. +10
    -57
      Audio_File_SF.C
  4. +4
    -21
      Audio_File_SF.H
  5. +1
    -1
      Audio_Track.H
  6. +2
    -2
      Makefile
  7. +1
    -1
      Peaks.C
  8. +5
    -3
      Peaks.H
  9. +1
    -1
      Region.C
  10. +3
    -3
      Region.H
  11. +1
    -1
      Timeline.H
  12. +2
    -15
      Waveform.C
  13. +2
    -2
      Waveform.H

+ 43
- 0
Audio_File.C 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
- 0
Audio_File.H 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;

};

Clip.C → Audio_File_SF.C View File

@@ -17,7 +17,7 @@
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/ /*******************************************************************************/


#include "Clip.H"
#include "Audio_File_SF.H"
#include "Timeline.H" #include "Timeline.H"


#include <sndfile.h> #include <sndfile.h>
@@ -25,56 +25,13 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.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; SNDFILE *in;
SF_INFO si; SF_INFO si;


Clip *c = NULL;
Audio_File_SF *c = NULL;


memset( &si, 0, sizeof( si ) ); memset( &si, 0, sizeof( si ) );


@@ -96,18 +53,15 @@ Clip::from_file ( const char *filename )
goto invalid; goto invalid;
} }


c = new Clip;
c = new Audio_File_SF;


c->_filename = filename; c->_filename = filename;
c->_length = si.frames; c->_length = si.frames;


sf_close( in ); sf_close( in );


c->_peaks.open();

return c; return c;



invalid: invalid:


sf_close( in ); sf_close( in );
@@ -115,7 +69,7 @@ invalid:
} }


bool bool
Clip::open ( void )
Audio_File_SF::open ( void )
{ {
SF_INFO si; SF_INFO si;


@@ -128,27 +82,26 @@ Clip::open ( void )
} }


void void
Clip::close ( void )
Audio_File_SF::close ( void )
{ {
sf_close( _in ); sf_close( _in );
} }


void void
Clip::seek ( nframes_t offset )
Audio_File_SF::seek ( nframes_t offset )
{ {
sf_seek( _in, offset, SEEK_SET ); sf_seek( _in, offset, SEEK_SET );
} }



nframes_t 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 ); return sf_read_float ( _in, buf, len );
} }


/** read samples from /start/ to /end/ into /buf/ */ /** read samples from /start/ to /end/ into /buf/ */
nframes_t 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(); open();



Clip.H → Audio_File_SF.H View File

@@ -17,36 +17,19 @@
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* 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> #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; SNDFILE *_in;


public: 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 ); bool open ( void );
void close ( void ); void close ( void );

+ 1
- 1
Audio_Track.H View File

@@ -66,7 +66,7 @@ public:


printf( "pasted file \"%s\"\n", file ); printf( "pasted file \"%s\"\n", file );


Clip *c = Clip::from_file( file );
Audio_File *c = Audio_File::from_file( file );


if ( ! c ) if ( ! c )
{ {


+ 2
- 2
Makefile View File

@@ -5,7 +5,7 @@ CXXFLAGS=-ggdb -Wall -O0
LIBS=-lsndfile `fltk-config --ldflags` LIBS=-lsndfile `fltk-config --ldflags`
# CXXFLAGS=`fltk-config -cxxflags` # 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) OBJS=$(SRCS:.C=.o)


@@ -24,7 +24,7 @@ test: $(OBJS)
$(CXX) $(CXXFLAGS) $(LIBS) $(OBJS) -o $@ $(CXX) $(CXXFLAGS) $(LIBS) $(OBJS) -o $@


clean: clean:
rm -f $(OBJS) test
rm -f $(OBJS) test makedepend


valgrind: valgrind:
valgrind ./test valgrind ./test


+ 1
- 1
Peaks.C View File

@@ -31,7 +31,7 @@


#include <sndfile.h> #include <sndfile.h>


#include "Clip.H"
#include "Audio_File.H"


#include "assert.h" #include "assert.h"




+ 5
- 3
Peaks.H View File

@@ -28,7 +28,7 @@ struct Peak {
float max; float max;
}; };


class Clip;
class Audio_File;


class Peaks class Peaks
{ {
@@ -56,7 +56,7 @@ class Peaks


static peakbuffer peakbuf; static peakbuffer peakbuf;


Clip *_clip;
Audio_File *_clip;


peakdata *_peaks; peakdata *_peaks;


@@ -67,9 +67,11 @@ class Peaks


Peak & peak ( nframes_t start, nframes_t end ) const; Peak & peak ( nframes_t start, nframes_t end ) const;


Peaks ( );

public: public:


Peaks ( Clip *c )
Peaks ( Audio_File *c )
{ {
_peaks = new peakdata; _peaks = new peakdata;




+ 1
- 1
Region.C View File

@@ -81,7 +81,7 @@ Region::Region ( const Region & rhs )
_scale = rhs._scale; _scale = rhs._scale;
} }


Region::Region ( Clip *c )
Region::Region ( Audio_File *c )
{ {
init(); init();
_clip = c; _clip = c;


+ 3
- 3
Region.H View File

@@ -23,7 +23,7 @@


// #include "Waveform.H" // #include "Waveform.H"


#include "Clip.H"
#include "Audio_File.H"
#include "Track.H" #include "Track.H"
#include "Timeline.H" #include "Timeline.H"


@@ -38,7 +38,7 @@ using namespace std;
class Region : public Track_Widget class Region : public Track_Widget
{ {


Clip *_clip; /* clip this region represents */
Audio_File *_clip; /* clip this region represents */


float _scale; /* amplitude adjustment */ float _scale; /* amplitude adjustment */


@@ -56,7 +56,7 @@ public:
Fl_Boxtype box ( void ) const { return Region::_box; } Fl_Boxtype box ( void ) const { return Region::_box; }


Region ( const Region & rhs ); Region ( const Region & rhs );
Region ( Clip *c );
Region ( Audio_File *c );


int handle ( int m ); int handle ( int m );
void draw_box( int X, int Y, int W, int H ); void draw_box( int X, int Y, int W, int H );


+ 1
- 1
Timeline.H View File

@@ -24,7 +24,7 @@
#include <FL/Fl_Scrollbar.H> #include <FL/Fl_Scrollbar.H>
#include <FL/Fl_Widget.H> #include <FL/Fl_Widget.H>


#include "Clip.H"
#include "Audio_File.H" // just for nframes_t
#include <math.h> #include <math.h>


#include <assert.h> #include <assert.h>


+ 2
- 15
Waveform.C View File

@@ -24,27 +24,14 @@
#include <FL/fl_draw.H> #include <FL/fl_draw.H>


#include "Timeline.H" #include "Timeline.H"
// #include "Waveform.H"
#include "Clip.H"
#include "Audio_File.H"


// extern Timeline timeline;
// #include "Timeline.H"


#include <math.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 */ /** draw a portion of /clip/'s waveform. coordinates are the portion to draw */
void 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 ); fl_push_clip( X, Y, W, H );




+ 2
- 2
Waveform.H View File

@@ -24,6 +24,6 @@


#include "Timeline.H" #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 );

Loading…
Cancel
Save