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); | 
