Browse Source

Handle missing sources gracefully.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
fc6ffee22e
6 changed files with 93 additions and 25 deletions
  1. +27
    -20
      Timeline/Audio_File.C
  2. +3
    -1
      Timeline/Audio_File.H
  3. +53
    -0
      Timeline/Audio_File_Dummy.H
  4. +0
    -3
      Timeline/Audio_File_SF.C
  5. +2
    -0
      Timeline/Audio_File_SF.H
  6. +8
    -1
      Timeline/Audio_Region.C

+ 27
- 20
Timeline/Audio_File.C View File

@@ -17,18 +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. */
/*******************************************************************************/ /*******************************************************************************/


/* FIXME: need locking for when disk thread and peak reader are
* interested in the same source? */

#include "Audio_File.H" #include "Audio_File.H"
#include "Audio_File_SF.H" #include "Audio_File_SF.H"
#include "Audio_File_Dummy.H"


#include "debug.h"


std::map <std::string, Audio_File*> Audio_File::_open_files; std::map <std::string, Audio_File*> Audio_File::_open_files;


Audio_File::~Audio_File ( ) Audio_File::~Audio_File ( )
{ {
_open_files[ std::string( _filename ) ] = NULL; _open_files[ std::string( _filename ) ] = NULL;
if ( _filename )
free( _filename );
} }


void void
@@ -58,14 +59,15 @@ Audio_File::from_file ( const char * filename )


// TODO: other formats // 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; _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 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;
}
} }

+ 3
- 1
Timeline/Audio_File.H View File

@@ -50,7 +50,7 @@ protected:
unsigned long id; unsigned long id;
}; };


const char *_filename;
char *_filename;
volatile nframes_t _length; /* length of file in samples */ volatile nframes_t _length; /* length of file in samples */
nframes_t _samplerate; /* sample rate */ nframes_t _samplerate; /* sample rate */
int _channels; int _channels;
@@ -79,6 +79,8 @@ public:


virtual ~Audio_File ( ); virtual ~Audio_File ( );


virtual bool dummy ( void ) const { return false; }

static void all_supported_formats ( std::list <const char *> &formats ); static void all_supported_formats ( std::list <const char *> &formats );


static Audio_File *from_file ( const char *filename ); static Audio_File *from_file ( const char *filename );


+ 53
- 0
Timeline/Audio_File_Dummy.H View File

@@ -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; }
};

+ 0
- 3
Timeline/Audio_File_SF.C View File

@@ -58,10 +58,7 @@ Audio_File_SF::from_file ( const char *filename )
memset( &si, 0, sizeof( si ) ); memset( &si, 0, sizeof( si ) );


if ( ! ( in = sf_open( filename, SFM_READ, &si ) ) ) if ( ! ( in = sf_open( filename, SFM_READ, &si ) ) )
{
printf( "couldn't open file\n" );
return NULL; return NULL;
}


/* if ( si.samplerate != timeline->sample_rate() ) */ /* if ( si.samplerate != timeline->sample_rate() ) */
/* { */ /* { */


+ 2
- 0
Timeline/Audio_File_SF.H View File

@@ -17,6 +17,8 @@
/* 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

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


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


+ 8
- 1
Timeline/Audio_Region.C View File

@@ -636,7 +636,14 @@ Audio_Region::draw ( void )
/* fl_line( rx, Y, rx, Y + H ); */ /* fl_line( rx, Y, rx, Y + H ); */
/* fl_line( rx + rw - 1, Y, rx + rw - 1, 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() ) */ /* if ( current() ) */
/* { */ /* { */


Loading…
Cancel
Save