summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/audiofile.cc6
-rw-r--r--src/audiofile.h2
-rw-r--r--src/drumgizmo.cc89
-rw-r--r--src/drumkitparser.cc24
-rw-r--r--src/drumkitparser.h4
-rw-r--r--src/midiplayer.cc2
-rw-r--r--src/midiplayer.h3
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);