From 87babc7da87da6e3cc2da2a23ad46f2b1479a8ce Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Tue, 25 Mar 2008 16:18:24 -0500 Subject: [PATCH] Add omitted file. --- Engine/objects.H | 183 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 Engine/objects.H diff --git a/Engine/objects.H b/Engine/objects.H new file mode 100644 index 0000000..6e38ae1 --- /dev/null +++ b/Engine/objects.H @@ -0,0 +1,183 @@ + +/*******************************************************************************/ +/* 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. */ +/*******************************************************************************/ + +/* these are all the objects whose state must be recorded, this + includes tracks, regions, etc. Relevant interfaces must be fully compatible + with those in the Timeline program. */ + +#include "Audio_File.H" +#include "Loggable.H" + +typedef unsigned long nframes_t; + +class Track_Widget +{ + +protected: + + nframes_t _offset; + nframes_t _start; + nframes_t _end; + bool _selected; + +}; + +/* macros to simplify serialization code */ +#define START( n ) char **sa = (char **)malloc( sizeof( char * ) * (1 + (n) ) ); int i = 0 +#define PUT( fmt, arg ) asprintf( &sa[ i++ ], (fmt), (arg) ) +#define END() sa[ i ] = NULL; return sa; + +#define SWITCH do +#define CASE( arg ) if ( ! strcmp( s, ( arg ) ) ) +#define GET( arg, act ) CASE( arg ) { act ; break; } + + +class Track : public Loggable +{ + + + +}; + +class Region : public Loggable, public Track_Widget +{ + + Track *_track; + Audio_File *_clip; /* clip this region represents */ + float _scale; /* amplitude adjustment */ + +protected: + + const char *class_name ( void ) { return "Region"; } + + char ** get ( void ) + { + START( 7 ); + + PUT( ":source \"%s\"", _clip ? _clip->name() : "" ); + PUT( ":track 0x%X", _track ? _track->id() : 0 ); + PUT( ":x %lu", _offset ); + PUT( ":l %lu", _start ); + PUT( ":r %lu", _end ); + PUT( ":selected %d", _selected ); + PUT( ":gain %f", _scale ); + + END(); + } + + void + set ( char **sa ) + { + for ( int i = 0; sa[i]; ++i ) + { + char *s = sa[i]; + char *v = s + strlen( s ) + 1; + + SWITCH + { + GET( ":x", _offset = atol( v ) ); + GET( ":l" , _start = atol( v ) ); + GET( ":r", _end = atol( v ) ); + CASE( ":selected" ) + { + if ( atoi( v ) ) + select(); + else + deselect(); + + break; + } + GET( ":gain", _scale = atof( v ) ); + CASE( ":source" ) + { + if ( ! ( _clip = Audio_File::from_file( v ) ) ) + printf( "Grave error: could not open source \"%s\"\n", v ); + break; + } + CASE( ":track" ) + { + int i; + sscanf( v, "%X", &i ); + Track *t = (Track*)Loggable::find( i ); + + assert( t ); + + t->add( this ); + break; + } + } + + + free( s ); + } + + free( sa ); + } +}; + + +class Time_Point : public Track_Widget +{ + +protected: + + char ** get ( void ) + { + START( 4 ); + + PUT( ":track 0x%X", _track ? _track->id() : 0 ); + PUT( ":x %lu", _offset ); + PUT( ":beats_per_bar %d", _time.beats_per_bar ); + PUT( ":beat_type %d", _time.beat_type ); + + END(); + } + + void + set ( char **sa ) + { + for ( int i = 0; sa[i]; ++i ) + { + char *s = sa[i]; + char *v = s + strlen( s ) + 1; + + SWITCH + { + GET( ":x", _offset = atol( v ) ); + GET( ":beats_per_bar", _time.beats_per_bar = atoi( v ) ); + GET( ":beat_type", _time.beat_type = atoi( v ) ); + CASE( ":track" ) + { + int i; + sscanf( v, "%X", &i ); + Track *t = (Track*)Loggable::find( i ); + + assert( t ); + + t->add( this ); + break; + } + + free( s ); + } + + free( sa ); + } + } +};