52302f13f554e5669cec5e4560831175b24cfd60
[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 "main.hh"
26
27 struct Sample
28 {
29   double             mix_freq;
30   double             osc_freq;
31   std::vector<float> pcm_data;
32   int                instrument;
33 };
34
35 struct Voice
36 {
37   enum { UNUSED, ON, RELEASE_DELAY, FADE_OUT } state;
38
39   double env;
40   double pos;
41   double frequency;
42   double velocity;
43   double rd_pos;
44   bool   pedal;
45   int note;
46
47   Sample *sample;
48
49   Voice()
50     : state (UNUSED),
51       pedal (false)
52   {
53   }
54 };
55
56 class JackSampler
57 {
58 protected:
59   double        jack_mix_freq;
60
61   jack_port_t  *input_port;
62   jack_port_t  *output_port;
63
64   int           instrument;
65   int           instrument_count;
66   bool          pedal_down;
67
68   double        release_delay_ms;
69   double        release_ms;
70   double        mout;
71
72   std::vector<Sample> samples;
73   std::vector<Voice> voices;
74
75   void        load_note (const Options& options, int note, const char *file_name, int instrument);
76   int         process (jack_nframes_t nframes);
77   static int  jack_process (jack_nframes_t nframes, void *arg);
78
79 public:
80   JackSampler();
81
82   void init (const Options& options, jack_client_t *client, int argc, char **argv);
83   void parse_config (const Options& options, int instrument, const char *name);
84   void change_instrument (int new_instrument);
85   void status();
86   void reset();
87 };
88
89 #endif
90