diff options
-rw-r--r-- | src/audiofile.cc | 6 | ||||
-rw-r--r-- | src/audiofile.h | 2 | ||||
-rw-r--r-- | src/drumgizmo.cc | 89 | ||||
-rw-r--r-- | src/drumkitparser.cc | 24 | ||||
-rw-r--r-- | src/drumkitparser.h | 4 | ||||
-rw-r--r-- | src/midiplayer.cc | 2 | ||||
-rw-r--r-- | src/midiplayer.h | 3 |
7 files changed, 116 insertions, 14 deletions
diff --git a/src/audiofile.cc b/src/audiofile.cc index d52e010..c3dba3c 100644 --- a/src/audiofile.cc +++ b/src/audiofile.cc @@ -31,12 +31,12 @@ #include <sndfile.h> -AudioFile::AudioFile(std::string filename) +AudioFile::AudioFile(std::string filename, bool preload) { this->filename = filename; data = NULL; size = 0; - // load(); + if(preload) load(); } AudioFile::~AudioFile() @@ -57,8 +57,6 @@ void AudioFile::load() { if(data) return; - filename = "/tmp/aasimonster/" + filename; - SF_INFO sf_info; SNDFILE *fh = sf_open(filename.c_str(), SFM_READ, &sf_info); diff --git a/src/audiofile.h b/src/audiofile.h index b716a8c..4cd863b 100644 --- a/src/audiofile.h +++ b/src/audiofile.h @@ -32,7 +32,7 @@ class AudioFile { public: - AudioFile(std::string filename); + AudioFile(std::string filename, bool preload = false); ~AudioFile(); void load(); diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 4445712..77b8433 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -24,21 +24,104 @@ * along with DrumGizmo; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ - +#include <config.h> +#include <getopt.h> #include "jackclient.h" #include "drumkitparser.h" #include "midiplayer.h" +static const char version_str[] = +"DrumGizmo v" VERSION "\n" +; + +static const char copyright_str[] = +"Copyright (C) 2008-2009 Bent Bisballe Nyeng - Aasimon.org.\n" +"This is free software. You may redistribute copies of it under the terms of\n" +"the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +"Written by Bent Bisballe Nyeng (deva@aasimon.org)\n" +; + +static const char usage_str[] = +"Usage: %s [options] drumkitfile\n" +"Options:\n" +" -p, --preload Load entire kit audio files into memory (uses ALOT of memory).\n" +" -m, --midi midifile Load midifile, and play it.\n" +" -v, --version Print version information and exit.\n" +" -h, --help Print this message and exit.\n" +; + int main(int argc, char *argv[]) { - DrumKitParser parser("/tmp/aasimonster/aasimonster.xml"); + int c; + + char *midifile = NULL; + bool preload = false; + + int option_index = 0; + while(1) { + static struct option long_options[] = { + {"midi", required_argument, 0, 'm'}, + {"help", no_argument, 0, 'h'}, + {"version", no_argument, 0, 'v'}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "hvpm:", long_options, &option_index); + + if (c == -1) + break; + + switch(c) { + case 'm': + midifile = strdup(optarg); + break; + + case 'p': + preload = true; + break; + + case '?': + case 'h': + printf(version_str); + printf(usage_str, argv[0]); + return 0; + + case 'v': + printf(version_str); + printf(copyright_str); + return 0; + + default: + break; + } + } + + if(argc < option_index + 2) { + fprintf(stderr, "Missing kitfile.\n"); + printf(usage_str, argv[0]); + return 1; + } + + if(argc > option_index + 2) { + fprintf(stderr, "Can only handle a single kitfile.\n"); + printf(usage_str, argv[0]); + return 1; + } + + std::string kitfile = argv[option_index + 1]; + + printf("Using kitfile: %s\n", kitfile.c_str()); + + DrumKitParser parser(kitfile, preload); if(parser.parse()) return 1; JackClient client(parser.getDrumkit()); client.activate(); - MidiPlayer player("dimmer.mid"); + if(midifile) MidiPlayer player(midifile); while(1) sleep(1); diff --git a/src/drumkitparser.cc b/src/drumkitparser.cc index 14e4a88..3f16dd2 100644 --- a/src/drumkitparser.cc +++ b/src/drumkitparser.cc @@ -26,10 +26,28 @@ */ #include "drumkitparser.h" -DrumKitParser::DrumKitParser(char *file) +#define DIR_SEPERATOR '/' + +DrumKitParser::DrumKitParser(std::string kitfile, bool preload) { + std::string file; + std::string path; + + char *split = strrchr(kitfile.c_str(), DIR_SEPERATOR); + if(split) { + file = split + 1; + split = '\0'; + path = kitfile.substr(0, kitfile.length() - file.length()); + // All drum samples are relative to the kitfile, so we must chdir there to be able to open them. + chdir(path.c_str()); + } else { + file = kitfile; + } + + this->preload = preload; + dk = NULL; - fd = fopen(file, "r"); + fd = fopen(file.c_str(), "r"); if(!fd) return; dk = new DrumKit(); } @@ -62,7 +80,7 @@ void DrumKitParser::startTag(std::string name, std::map< std::string, std::strin } if(name == "audiofile") { - AudioFile *af = new AudioFile(attributes["name"]); + AudioFile *af = new AudioFile(attributes["name"], preload); af->channel = attributes["channel"]; lastsample->audiofiles[attributes["name"]] = af; } diff --git a/src/drumkitparser.h b/src/drumkitparser.h index 6fd696c..6192286 100644 --- a/src/drumkitparser.h +++ b/src/drumkitparser.h @@ -32,7 +32,7 @@ class DrumKitParser : public SAXParser { public: - DrumKitParser(char *file); + DrumKitParser(std::string kitfile, bool preload = false); ~DrumKitParser(); void startTag(std::string name, std::map< std::string, std::string> attributes); @@ -50,6 +50,8 @@ private: Sample *lastsample; Instrument *lastinstrument; Velocity *lastvelocity; + + bool preload; }; #endif/*__DRUMGIZMO_DRUMKITPARSER_H__*/ diff --git a/src/midiplayer.cc b/src/midiplayer.cc index d936eae..f8c462b 100644 --- a/src/midiplayer.cc +++ b/src/midiplayer.cc @@ -33,7 +33,7 @@ int _process(jack_nframes_t nframes, void *arg) return ((MidiPlayer*)arg)->process(nframes); } -MidiPlayer::MidiPlayer(char *filename) +MidiPlayer::MidiPlayer(std::string filename) { jack_status_t status; diff --git a/src/midiplayer.h b/src/midiplayer.h index 5069ec6..3694939 100644 --- a/src/midiplayer.h +++ b/src/midiplayer.h @@ -29,10 +29,11 @@ #include <jack/jack.h> #include <jack/midiport.h> +#include <string> class MidiPlayer { public: - MidiPlayer(char *filename); + MidiPlayer(std::string midifile); ~MidiPlayer(); int process(jack_nframes_t nframes); |