Enhanced possible debugging output.
[jacksampler.git] / src / jacksampler.hh
1 /* JackSampler - JACK based sampler
2  * Copyright (C) 2009-2010 Stefan Westerfeld
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General
15  * Public License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 #ifndef JACK_SAMPLER_JACK_SAMPLER_HH
21 #define JACK_SAMPLER_JACK_SAMPLER_HH
22
23 #include <jack/jack.h>
24 #include <vector>
25 #include <string>
26 #include "main.hh"
27
28 struct Sample
29 {
30   double             mix_freq;
31   double             osc_freq;
32   std::vector<float> pcm_data;
33   int                instrument;
34   std::string        file_name;
35 };
36
37 struct Voice
38 {
39   enum { UNUSED, ON, RELEASE_DELAY, FADE_OUT } state;
40
41   double env;
42   double pos;
43   double frequency;
44   double velocity;
45   double rd_pos;
46   bool   pedal;
47   int note;
48
49   Sample *sample;
50
51   Voice()
52     : state (UNUSED),
53       pedal (false)
54   {
55   }
56 };
57
58 class JackSampler
59 {
60 protected:
61   double        jack_mix_freq;
62
63   jack_port_t  *input_port;
64   jack_port_t  *output_port;
65
66   int           instrument;
67   int           instrument_count;
68   bool          pedal_down;
69
70   double        release_delay_ms;
71   double        release_ms;
72   double        mout;
73
74   std::vector<Sample> samples;
75   std::vector<Voice> voices;
76
77   void        load_note (const Options& options, int note, const char *file_name, int instrument);
78   int         process (jack_nframes_t nframes);
79   static int  jack_process (jack_nframes_t nframes, void *arg);
80
81 public:
82   JackSampler();
83
84   void init (const Options& options, jack_client_t *client, int argc, char **argv);
85   void parse_config (const Options& options, int instrument, const char *name);
86   void change_instrument (int new_instrument);
87   void status();
88   void reset();
89 };
90
91 #endif
92