@@ -296,6 +296,8 @@ Engine::init ( void ) | |||
_sample_rate = frame_rate(); | |||
MESSAGE( "Jack sample rate is %lu", (unsigned long)_sample_rate ); | |||
timeline->_sample_rate = frame_rate(); | |||
/* we don't need to create any ports until tracks are created */ | |||
@@ -33,8 +33,8 @@ | |||
#include "Loggable.H" | |||
#include "Project.H" | |||
#include "Timeline.H" // for sample_rate(); | |||
#include "Timeline.H" // for sample_rate() | |||
#include "Engine/Engine.H" // for sample_rate() | |||
#include "TLE.H" // all this just for load and save... | |||
#include <FL/filename.H> | |||
@@ -51,6 +51,15 @@ const int PROJECT_VERSION = 1; | |||
const char *Project::_errstr[] = | |||
{ | |||
"Not a Non-DAW project", | |||
"Locked by another process", | |||
"Access denied", | |||
"Samplerate mismatch", | |||
"Incompatible project version" | |||
}; | |||
char Project::_name[256]; | |||
char Project::_path[512]; | |||
bool Project::_is_open = false; | |||
@@ -107,7 +116,7 @@ Project::write_info ( void ) | |||
} | |||
bool | |||
Project::read_info ( void ) | |||
Project::read_info ( int *version, nframes_t *sample_rate ) | |||
{ | |||
FILE *fp; | |||
@@ -124,27 +133,9 @@ Project::read_info ( void ) | |||
MESSAGE( "Info: %s = %s", name, value ); | |||
if ( ! strcmp( name, "sample rate" ) ) | |||
{ | |||
nframes_t rate = atoll( value ); | |||
if ( rate != timeline->sample_rate() ) | |||
WARNING( "incorrect samplerate" ); | |||
} | |||
*sample_rate = atoll( value ); | |||
else if ( ! strcmp( name, "version" ) ) | |||
{ | |||
int version = atoi( value ); | |||
if ( version < PROJECT_VERSION ) | |||
{ | |||
WARNING( "Incompatible project version. You must to use \"non-project-convert %d-%d\" to update this project's version", version, PROJECT_VERSION ); | |||
return false; | |||
} | |||
else if ( version > PROJECT_VERSION ) | |||
{ | |||
WARNING( "Incompatible project version (%d).", version ); | |||
return false; | |||
} | |||
} | |||
*version = atoi( value ); | |||
free( name ); | |||
free( value ); | |||
@@ -224,16 +215,21 @@ Project::open ( const char *name ) | |||
chdir( name ); | |||
if ( ! acquire_lock( &_lockfd, ".lock" ) ) | |||
{ | |||
WARNING( "Could not open project: locked by another process!" ); | |||
return Project::E_LOCKED; | |||
} | |||
return E_LOCKED; | |||
int version; | |||
nframes_t rate; | |||
if ( ! read_info() ) | |||
if ( ! read_info( &version, &rate ) ) | |||
return E_INVALID; | |||
if ( version != PROJECT_VERSION ) | |||
return E_VERSION; | |||
if ( ! Loggable::open( "history" ) ) | |||
FATAL( "error opening journal" ); | |||
return E_INVALID; | |||
timeline->sample_rate( rate ); | |||
set_name( name ); | |||
@@ -20,6 +20,8 @@ | |||
const char template_dir[] = "share/non-daw/templates"; | |||
const char user_template_dir[] = "~/.non-daw/templates"; | |||
#include "types.h" | |||
class Project | |||
{ | |||
@@ -29,9 +31,11 @@ class Project | |||
static char _path[512]; | |||
static bool write_info ( void ); | |||
static bool read_info ( void ); | |||
static bool read_info ( int *version, nframes_t *sample_rate ); | |||
static void set_name ( const char *name ); | |||
static const char *_errstr[]; | |||
public: | |||
enum | |||
@@ -39,8 +43,12 @@ public: | |||
E_INVALID = -1, | |||
E_LOCKED = -2, | |||
E_PERM = -3, | |||
E_SAMPLERATE = -4, | |||
E_VERSION = -5 | |||
}; | |||
static const char *errstr ( int n ) { return _errstr[ ( 0 - n ) - 1 ]; } | |||
static const char *name ( void ) { return Project::_name; } | |||
static void compact ( void ); | |||
static bool close ( void ); | |||
@@ -161,7 +161,7 @@ Loggable::progress_callback( &TLE::progress_cb, this );} {} | |||
} { | |||
Fl_Window main_window { | |||
label Timeline open | |||
xywh {174 117 1025 770} type Double resizable xclass Non_DAW visible | |||
xywh {279 117 1025 770} type Double resizable xclass Non_DAW visible | |||
} { | |||
Fl_Menu_Bar menubar {open | |||
xywh {0 0 1024 25} | |||
@@ -194,33 +194,7 @@ main_window->redraw();} | |||
label {&Open} | |||
callback {const char *name = fl_dir_chooser( "Open Project", NULL, NULL ); | |||
if ( ! name ) | |||
return; | |||
int r = Project::open( name ); | |||
if ( r < 0 ) | |||
{ | |||
const char *s = ""; | |||
switch ( r ) | |||
{ | |||
case Project::E_LOCKED: | |||
s = "Locked by another process"; | |||
break; | |||
case Project::E_PERM: | |||
s = "Access denied"; | |||
break; | |||
case Project::E_INVALID: | |||
s = "Not a Non-DAW project"; | |||
break; | |||
} | |||
fl_alert( "Could not open project \\"%s\\":\\n\\n\\t%s", name, s ); | |||
// we are in a somewhar ambiguous state now with no project open. | |||
}} | |||
open( name );} | |||
xywh {10 10 40 25} | |||
} | |||
MenuItem {} { | |||
@@ -230,7 +204,7 @@ if ( r < 0 ) | |||
if ( n != 2 ) | |||
return; | |||
Project::compact();} selected | |||
Project::compact();} | |||
xywh {20 20 40 25} | |||
} | |||
Submenu {} { | |||
@@ -850,6 +824,21 @@ progress->redraw(); | |||
Fl::check();} {} | |||
} | |||
Function {open( const char *name )} {open | |||
} { | |||
code {if ( ! name ) | |||
return; | |||
int r = Project::open( name ); | |||
if ( r < 0 ) | |||
{ | |||
const char *s = Project::errstr( r ); | |||
fl_alert( "Could not open project \\"%s\\":\\n\\n\\t%s", name, s ); | |||
}} {selected | |||
} | |||
} | |||
} | |||
class New_Project_Dialog {open | |||
@@ -146,6 +146,7 @@ public: | |||
nframes_t fpp ( void ) const { return 1 << _fpp; } | |||
nframes_t length ( void ) const; | |||
void sample_rate ( nframes_t r ) { _sample_rate = r; } | |||
nframes_t sample_rate ( void ) const { return _sample_rate; } | |||
int ts_to_x( nframes_t ts ) const { return ts >> _fpp; } | |||
nframes_t x_to_ts ( int x ) const { return x << _fpp; } | |||
@@ -140,10 +140,7 @@ main ( int argc, char **argv ) | |||
tle->run(); | |||
if ( argc > 1 ) | |||
if ( Project::open( argv[ 1 ] ) != 0 ) | |||
FATAL( "Could not open project specified on command line" ); | |||
/* FIXME: open project in /tmp if none is given? */ | |||
tle->open( argv[ 1 ] ); | |||
Fl::run(); | |||