fluid_synth.c
上传用户:tjmskj2
上传日期:2020-08-17
资源大小:577k
文件大小:181k
源码类别:

midi

开发平台:

C/C++

  1. /* FluidSynth - A Software Synthesizer
  2.  *
  3.  * Copyright (C) 2003  Peter Hanappe and others.
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Library General Public License
  7.  * as published by the Free Software Foundation; either version 2 of
  8.  * the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Library General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Library General Public
  16.  * License along with this library; if not, write to the Free
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18.  * 02111-1307, USA
  19.  */
  20. #include <math.h>
  21. #include "fluid_synth.h"
  22. #include "fluid_sys.h"
  23. #include "fluid_chan.h"
  24. #include "fluid_tuning.h"
  25. #include "fluid_settings.h"
  26. #include "fluid_sfont.h"
  27. #include "fluid_hash.h"
  28. #ifdef TRAP_ON_FPE
  29. #define _GNU_SOURCE
  30. #include <fenv.h>
  31. /* seems to not be declared in fenv.h */
  32. extern int feenableexcept (int excepts);
  33. #endif
  34. /* A descriptive alias for fluid_return_if_fail/fluid_return_val_if_fail */
  35. #define fluid_synth_is_synth_thread(_s)     (fluid_thread_get_id() == (_s)->synth_thread_id)
  36. /* Macro used to check if an event should be queued or not (not in synthesis thread context?) */
  37. #define fluid_synth_should_queue(_s)   (!fluid_synth_is_synth_thread(_s))
  38. static void fluid_synth_init(void);
  39. static void fluid_synth_return_event_process_thread (void* data);
  40. static fluid_event_queue_t *fluid_synth_get_event_queue (fluid_synth_t* synth);
  41. static int fluid_synth_queue_midi_event (fluid_synth_t* synth, int type, int chan,
  42.                                          int param1, int param2);
  43. static int fluid_synth_queue_gen_event (fluid_synth_t* synth, int chan,
  44.                                         int param, float value, int absolute);
  45. static int fluid_synth_queue_int_event (fluid_synth_t* synth, int type, int val);
  46. static void fluid_synth_thread_queue_destroy_notify (void *data);
  47. static int fluid_synth_noteon_LOCAL(fluid_synth_t* synth, int chan, int key,
  48.                                        int vel);
  49. static int fluid_synth_noteoff_LOCAL(fluid_synth_t* synth, int chan, int key);
  50. static int fluid_synth_damp_voices_LOCAL(fluid_synth_t* synth, int chan);
  51. static int fluid_synth_cc_LOCAL(fluid_synth_t* synth, int channum, int num);
  52. static int fluid_synth_update_device_id (fluid_synth_t *synth, char *name,
  53.                                          int value);
  54. static int fluid_synth_sysex_midi_tuning (fluid_synth_t *synth, const char *data,
  55.                                           int len, char *response,
  56.                                           int *response_len, int avail_response,
  57.                                           int *handled, int dryrun);
  58. static int fluid_synth_all_notes_off_LOCAL(fluid_synth_t* synth, int chan);
  59. static int fluid_synth_all_sounds_off_LOCAL(fluid_synth_t* synth, int chan);
  60. static int fluid_synth_system_reset_LOCAL(fluid_synth_t* synth);
  61. static int fluid_synth_modulate_voices_LOCAL(fluid_synth_t* synth, int chan,
  62.                                              int is_cc, int ctrl);
  63. static int fluid_synth_modulate_voices_all_LOCAL(fluid_synth_t* synth, int chan);
  64. static int fluid_synth_update_channel_pressure_LOCAL(fluid_synth_t* synth, int channum);
  65. static int fluid_synth_update_pitch_bend_LOCAL(fluid_synth_t* synth, int chan);
  66. static int fluid_synth_update_pitch_wheel_sens_LOCAL(fluid_synth_t* synth, int chan);
  67. static int fluid_synth_set_preset (fluid_synth_t *synth, int chan,
  68.                                    fluid_preset_t *preset);
  69. static fluid_preset_t*
  70. fluid_synth_get_preset(fluid_synth_t* synth, unsigned int sfontnum,
  71.                        unsigned int banknum, unsigned int prognum);
  72. static fluid_preset_t*
  73. fluid_synth_get_preset_by_sfont_name(fluid_synth_t* synth, const char *sfontname,
  74.                                      unsigned int banknum, unsigned int prognum);
  75. static void fluid_synth_update_presets(fluid_synth_t* synth);
  76. static int fluid_synth_update_gain(fluid_synth_t* synth,
  77.                                    char* name, double value);
  78. static void fluid_synth_update_gain_LOCAL(fluid_synth_t* synth);
  79. static int fluid_synth_update_polyphony(fluid_synth_t* synth,
  80.                                         char* name, int value);
  81. static int fluid_synth_update_polyphony_LOCAL(fluid_synth_t* synth);
  82. static void init_dither(void);
  83. static inline int roundi (float x);
  84. static int fluid_synth_one_block(fluid_synth_t* synth, int do_not_mix_fx_to_out);
  85. static void fluid_synth_core_thread_func (void* data);
  86. static FLUID_INLINE void fluid_synth_process_event_queue_LOCAL
  87.   (fluid_synth_t *synth, fluid_event_queue_t *queue);
  88. static fluid_voice_t* fluid_synth_free_voice_by_kill_LOCAL(fluid_synth_t* synth);
  89. static void fluid_synth_kill_by_exclusive_class_LOCAL(fluid_synth_t* synth,
  90.                                                       fluid_voice_t* new_voice);
  91. static fluid_sfont_info_t *new_fluid_sfont_info (fluid_synth_t *synth,
  92.                                                  fluid_sfont_t *sfont);
  93. static void fluid_synth_sfont_unref (fluid_synth_t *synth, fluid_sfont_t *sfont);
  94. static int fluid_synth_sfunload_callback(void* data, unsigned int msec);
  95. static void fluid_synth_release_voice_on_same_note_LOCAL(fluid_synth_t* synth,
  96.                                                             int chan, int key);
  97. static fluid_tuning_t* fluid_synth_get_tuning(fluid_synth_t* synth,
  98.                                               int bank, int prog);
  99. static int fluid_synth_replace_tuning_LOCK (fluid_synth_t* synth,
  100.                                             fluid_tuning_t *tuning,
  101.                                             int bank, int prog, int apply);
  102. static void fluid_synth_replace_tuning_LOCAL (fluid_synth_t *synth,
  103.                                               fluid_tuning_t *old_tuning,
  104.                                               fluid_tuning_t *new_tuning,
  105.                                               int apply, int unref_new);
  106. static void fluid_synth_update_voice_tuning_LOCAL (fluid_synth_t *synth,
  107.                                                    fluid_channel_t *channel);
  108. static int fluid_synth_set_tuning_LOCAL (fluid_synth_t *synth, int chan,
  109.                                          fluid_tuning_t *tuning, int apply);
  110. static void fluid_synth_set_gen_LOCAL (fluid_synth_t* synth, int chan,
  111.                                        int param, float value, int absolute);
  112. static void fluid_synth_stop_LOCAL (fluid_synth_t *synth, unsigned int id);
  113. fluid_sfloader_t* new_fluid_defsfloader(void);
  114. /***************************************************************
  115.  *
  116.  *                         GLOBAL
  117.  */
  118. /* has the synth module been initialized? */
  119. static int fluid_synth_initialized = 0;
  120. static void fluid_synth_init(void);
  121. static void init_dither(void);
  122. /* default modulators
  123.  * SF2.01 page 52 ff:
  124.  *
  125.  * There is a set of predefined default modulators. They have to be
  126.  * explicitly overridden by the sound font in order to turn them off.
  127.  */
  128. fluid_mod_t default_vel2att_mod;        /* SF2.01 section 8.4.1  */
  129. fluid_mod_t default_vel2filter_mod;     /* SF2.01 section 8.4.2  */
  130. fluid_mod_t default_at2viblfo_mod;      /* SF2.01 section 8.4.3  */
  131. fluid_mod_t default_mod2viblfo_mod;     /* SF2.01 section 8.4.4  */
  132. fluid_mod_t default_att_mod;            /* SF2.01 section 8.4.5  */
  133. fluid_mod_t default_pan_mod;            /* SF2.01 section 8.4.6  */
  134. fluid_mod_t default_expr_mod;           /* SF2.01 section 8.4.7  */
  135. fluid_mod_t default_reverb_mod;         /* SF2.01 section 8.4.8  */
  136. fluid_mod_t default_chorus_mod;         /* SF2.01 section 8.4.9  */
  137. fluid_mod_t default_pitch_bend_mod;     /* SF2.01 section 8.4.10 */
  138. /* reverb presets */
  139. static fluid_revmodel_presets_t revmodel_preset[] = {
  140.   /* name */    /* roomsize */ /* damp */ /* width */ /* level */
  141.   { "Test 1",          0.2f,      0.0f,       0.5f,       0.9f },
  142.   { "Test 2",          0.4f,      0.2f,       0.5f,       0.8f },
  143.   { "Test 3",          0.6f,      0.4f,       0.5f,       0.7f },
  144.   { "Test 4",          0.8f,      0.7f,       0.5f,       0.6f },
  145.   { "Test 5",          0.8f,      1.0f,       0.5f,       0.5f },
  146.   { NULL, 0.0f, 0.0f, 0.0f, 0.0f }
  147. };
  148. /***************************************************************
  149.  *
  150.  *               INITIALIZATION & UTILITIES
  151.  */
  152. void fluid_synth_settings(fluid_settings_t* settings)
  153. {
  154.   fluid_settings_register_int(settings, "synth.verbose", 0, 0, 1,
  155.                               FLUID_HINT_TOGGLED, NULL, NULL);
  156.   fluid_settings_register_int(settings, "synth.dump", 0, 0, 1,
  157.                               FLUID_HINT_TOGGLED, NULL, NULL);
  158.   fluid_settings_register_int(settings, "synth.reverb.active", 1, 0, 1,
  159.                               FLUID_HINT_TOGGLED, NULL, NULL);
  160.   fluid_settings_register_int(settings, "synth.chorus.active", 1, 0, 1,
  161.                               FLUID_HINT_TOGGLED, NULL, NULL);
  162.   fluid_settings_register_int(settings, "synth.ladspa.active", 0, 0, 1,
  163.                               FLUID_HINT_TOGGLED, NULL, NULL);
  164.   fluid_settings_register_str(settings, "midi.portname", "", 0, NULL, NULL);
  165.   fluid_settings_register_int(settings, "synth.polyphony",
  166.       256, 16, 4096, 0, NULL, NULL);
  167.   fluid_settings_register_int(settings, "synth.midi-channels",
  168.       16, 16, 256, 0, NULL, NULL);
  169.   fluid_settings_register_num(settings, "synth.gain",
  170.       0.2f, 0.0f, 10.0f,
  171.       0, NULL, NULL);
  172.   fluid_settings_register_int(settings, "synth.audio-channels",
  173.       1, 1, 128, 0, NULL, NULL);
  174.   fluid_settings_register_int(settings, "synth.audio-groups",
  175.       1, 1, 128, 0, NULL, NULL);
  176.   fluid_settings_register_int(settings, "synth.effects-channels",
  177.       2, 2, 2, 0, NULL, NULL);
  178.   fluid_settings_register_num(settings, "synth.sample-rate",
  179.       44100.0f, 22050.0f, 96000.0f,
  180.       0, NULL, NULL);
  181.   fluid_settings_register_int(settings, "synth.device-id",
  182.       0, 0, 126, 0, NULL, NULL);
  183.   fluid_settings_register_int(settings, "synth.cpu-cores", 1, 1, 256, 0, NULL, NULL);
  184.   fluid_settings_register_int(settings, "synth.min-note-length", 10, 0, 65535, 0, NULL, NULL);
  185. }
  186. /**
  187.  * Get FluidSynth runtime version.
  188.  * @param major Location to store major number
  189.  * @param minor Location to store minor number
  190.  * @param micro Location to store micro number
  191.  */
  192. void fluid_version(int *major, int *minor, int *micro)
  193. {
  194.   *major = FLUIDSYNTH_VERSION_MAJOR;
  195.   *minor = FLUIDSYNTH_VERSION_MINOR;
  196.   *micro = FLUIDSYNTH_VERSION_MICRO;
  197. }
  198. /**
  199.  * Get FluidSynth runtime version as a string.
  200.  * @return FluidSynth version string, which is internal and should not be
  201.  *   modified or freed.
  202.  */
  203. char *
  204. fluid_version_str (void)
  205. {
  206.   return FLUIDSYNTH_VERSION;
  207. }
  208. /*
  209.  * void fluid_synth_init
  210.  *
  211.  * Does all the initialization for this module.
  212.  */
  213. static void
  214. fluid_synth_init(void)
  215. {
  216.   fluid_synth_initialized++;
  217. #ifdef TRAP_ON_FPE
  218.   /* Turn on floating point exception traps */
  219.   feenableexcept (FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID);
  220. #endif
  221.   fluid_conversion_config();
  222.   fluid_dsp_float_config();
  223.   fluid_sys_config();
  224.   init_dither();
  225.   /* SF2.01 page 53 section 8.4.1: MIDI Note-On Velocity to Initial Attenuation */
  226.   fluid_mod_set_source1(&default_vel2att_mod, /* The modulator we are programming here */
  227.        FLUID_MOD_VELOCITY,    /* Source. VELOCITY corresponds to 'index=2'. */
  228.        FLUID_MOD_GC           /* Not a MIDI continuous controller */
  229.        | FLUID_MOD_CONCAVE    /* Curve shape. Corresponds to 'type=1' */
  230.        | FLUID_MOD_UNIPOLAR   /* Polarity. Corresponds to 'P=0' */
  231.        | FLUID_MOD_NEGATIVE   /* Direction. Corresponds to 'D=1' */
  232.        );
  233.   fluid_mod_set_source2(&default_vel2att_mod, 0, 0); /* No 2nd source */
  234.   fluid_mod_set_dest(&default_vel2att_mod, GEN_ATTENUATION);  /* Target: Initial attenuation */
  235.   fluid_mod_set_amount(&default_vel2att_mod, 960.0);          /* Modulation amount: 960 */
  236.   /* SF2.01 page 53 section 8.4.2: MIDI Note-On Velocity to Filter Cutoff
  237.    * Have to make a design decision here. The specs don't make any sense this way or another.
  238.    * One sound font, 'Kingston Piano', which has been praised for its quality, tries to
  239.    * override this modulator with an amount of 0 and positive polarity (instead of what
  240.    * the specs say, D=1) for the secondary source.
  241.    * So if we change the polarity to 'positive', one of the best free sound fonts works...
  242.    */
  243.   fluid_mod_set_source1(&default_vel2filter_mod, FLUID_MOD_VELOCITY, /* Index=2 */
  244.        FLUID_MOD_GC                        /* CC=0 */
  245.        | FLUID_MOD_LINEAR                  /* type=0 */
  246.        | FLUID_MOD_UNIPOLAR                /* P=0 */
  247.                        | FLUID_MOD_NEGATIVE                /* D=1 */
  248.        );
  249.   fluid_mod_set_source2(&default_vel2filter_mod, FLUID_MOD_VELOCITY, /* Index=2 */
  250.        FLUID_MOD_GC                                 /* CC=0 */
  251.        | FLUID_MOD_SWITCH                           /* type=3 */
  252.        | FLUID_MOD_UNIPOLAR                         /* P=0 */
  253.        // do not remove       | FLUID_MOD_NEGATIVE                         /* D=1 */
  254.        | FLUID_MOD_POSITIVE                         /* D=0 */
  255.        );
  256.   fluid_mod_set_dest(&default_vel2filter_mod, GEN_FILTERFC);        /* Target: Initial filter cutoff */
  257.   fluid_mod_set_amount(&default_vel2filter_mod, -2400);
  258.   /* SF2.01 page 53 section 8.4.3: MIDI Channel pressure to Vibrato LFO pitch depth */
  259.   fluid_mod_set_source1(&default_at2viblfo_mod, FLUID_MOD_CHANNELPRESSURE, /* Index=13 */
  260.        FLUID_MOD_GC                        /* CC=0 */
  261.        | FLUID_MOD_LINEAR                  /* type=0 */
  262.        | FLUID_MOD_UNIPOLAR                /* P=0 */
  263.        | FLUID_MOD_POSITIVE                /* D=0 */
  264.        );
  265.   fluid_mod_set_source2(&default_at2viblfo_mod, 0,0); /* no second source */
  266.   fluid_mod_set_dest(&default_at2viblfo_mod, GEN_VIBLFOTOPITCH);        /* Target: Vib. LFO => pitch */
  267.   fluid_mod_set_amount(&default_at2viblfo_mod, 50);
  268.   /* SF2.01 page 53 section 8.4.4: Mod wheel (Controller 1) to Vibrato LFO pitch depth */
  269.   fluid_mod_set_source1(&default_mod2viblfo_mod, 1, /* Index=1 */
  270.        FLUID_MOD_CC                        /* CC=1 */
  271.        | FLUID_MOD_LINEAR                  /* type=0 */
  272.        | FLUID_MOD_UNIPOLAR                /* P=0 */
  273.        | FLUID_MOD_POSITIVE                /* D=0 */
  274.        );
  275.   fluid_mod_set_source2(&default_mod2viblfo_mod, 0,0); /* no second source */
  276.   fluid_mod_set_dest(&default_mod2viblfo_mod, GEN_VIBLFOTOPITCH);        /* Target: Vib. LFO => pitch */
  277.   fluid_mod_set_amount(&default_mod2viblfo_mod, 50);
  278.   /* SF2.01 page 55 section 8.4.5: MIDI continuous controller 7 to initial attenuation*/
  279.   fluid_mod_set_source1(&default_att_mod, 7,                     /* index=7 */
  280.        FLUID_MOD_CC                              /* CC=1 */
  281.        | FLUID_MOD_CONCAVE                       /* type=1 */
  282.        | FLUID_MOD_UNIPOLAR                      /* P=0 */
  283.        | FLUID_MOD_NEGATIVE                      /* D=1 */
  284.        );
  285.   fluid_mod_set_source2(&default_att_mod, 0, 0);                 /* No second source */
  286.   fluid_mod_set_dest(&default_att_mod, GEN_ATTENUATION);         /* Target: Initial attenuation */
  287.   fluid_mod_set_amount(&default_att_mod, 960.0);                 /* Amount: 960 */
  288.   /* SF2.01 page 55 section 8.4.6 MIDI continuous controller 10 to Pan Position */
  289.   fluid_mod_set_source1(&default_pan_mod, 10,                    /* index=10 */
  290.        FLUID_MOD_CC                              /* CC=1 */
  291.        | FLUID_MOD_LINEAR                        /* type=0 */
  292.        | FLUID_MOD_BIPOLAR                       /* P=1 */
  293.        | FLUID_MOD_POSITIVE                      /* D=0 */
  294.        );
  295.   fluid_mod_set_source2(&default_pan_mod, 0, 0);                 /* No second source */
  296.   fluid_mod_set_dest(&default_pan_mod, GEN_PAN);                 /* Target: pan */
  297.   /* Amount: 500. The SF specs $8.4.6, p. 55 syas: "Amount = 1000
  298.      tenths of a percent". The center value (64) corresponds to 50%,
  299.      so it follows that amount = 50% x 1000/% = 500. */
  300.   fluid_mod_set_amount(&default_pan_mod, 500.0);
  301.   /* SF2.01 page 55 section 8.4.7: MIDI continuous controller 11 to initial attenuation*/
  302.   fluid_mod_set_source1(&default_expr_mod, 11,                     /* index=11 */
  303.        FLUID_MOD_CC                              /* CC=1 */
  304.        | FLUID_MOD_CONCAVE                       /* type=1 */
  305.        | FLUID_MOD_UNIPOLAR                      /* P=0 */
  306.        | FLUID_MOD_NEGATIVE                      /* D=1 */
  307.        );
  308.   fluid_mod_set_source2(&default_expr_mod, 0, 0);                 /* No second source */
  309.   fluid_mod_set_dest(&default_expr_mod, GEN_ATTENUATION);         /* Target: Initial attenuation */
  310.   fluid_mod_set_amount(&default_expr_mod, 960.0);                 /* Amount: 960 */
  311.   /* SF2.01 page 55 section 8.4.8: MIDI continuous controller 91 to Reverb send */
  312.   fluid_mod_set_source1(&default_reverb_mod, 91,                 /* index=91 */
  313.        FLUID_MOD_CC                              /* CC=1 */
  314.        | FLUID_MOD_LINEAR                        /* type=0 */
  315.        | FLUID_MOD_UNIPOLAR                      /* P=0 */
  316.        | FLUID_MOD_POSITIVE                      /* D=0 */
  317.        );
  318.   fluid_mod_set_source2(&default_reverb_mod, 0, 0);              /* No second source */
  319.   fluid_mod_set_dest(&default_reverb_mod, GEN_REVERBSEND);       /* Target: Reverb send */
  320.   fluid_mod_set_amount(&default_reverb_mod, 200);                /* Amount: 200 ('tenths of a percent') */
  321.   /* SF2.01 page 55 section 8.4.9: MIDI continuous controller 93 to Chorus send */
  322.   fluid_mod_set_source1(&default_chorus_mod, 93,                 /* index=93 */
  323.        FLUID_MOD_CC                              /* CC=1 */
  324.        | FLUID_MOD_LINEAR                        /* type=0 */
  325.        | FLUID_MOD_UNIPOLAR                      /* P=0 */
  326.        | FLUID_MOD_POSITIVE                      /* D=0 */
  327.        );
  328.   fluid_mod_set_source2(&default_chorus_mod, 0, 0);              /* No second source */
  329.   fluid_mod_set_dest(&default_chorus_mod, GEN_CHORUSSEND);       /* Target: Chorus */
  330.   fluid_mod_set_amount(&default_chorus_mod, 200);                /* Amount: 200 ('tenths of a percent') */
  331.   /* SF2.01 page 57 section 8.4.10 MIDI Pitch Wheel to Initial Pitch ... */
  332.   fluid_mod_set_source1(&default_pitch_bend_mod, FLUID_MOD_PITCHWHEEL, /* Index=14 */
  333.        FLUID_MOD_GC                              /* CC =0 */
  334.        | FLUID_MOD_LINEAR                        /* type=0 */
  335.        | FLUID_MOD_BIPOLAR                       /* P=1 */
  336.        | FLUID_MOD_POSITIVE                      /* D=0 */
  337.        );
  338.   fluid_mod_set_source2(&default_pitch_bend_mod, FLUID_MOD_PITCHWHEELSENS,  /* Index = 16 */
  339.        FLUID_MOD_GC                                        /* CC=0 */
  340.        | FLUID_MOD_LINEAR                                  /* type=0 */
  341.        | FLUID_MOD_UNIPOLAR                                /* P=0 */
  342.        | FLUID_MOD_POSITIVE                                /* D=0 */
  343.        );
  344.   fluid_mod_set_dest(&default_pitch_bend_mod, GEN_PITCH);                 /* Destination: Initial pitch */
  345.   fluid_mod_set_amount(&default_pitch_bend_mod, 12700.0);                 /* Amount: 12700 cents */
  346. }
  347. /***************************************************************
  348.  *                    FLUID SAMPLE TIMERS 
  349.  *    Timers that use written audio data as timing reference       
  350.  */
  351. struct _fluid_sample_timer_t
  352. {
  353. fluid_sample_timer_t* next; /* Single linked list of timers */
  354. unsigned long starttick;
  355. fluid_timer_callback_t callback;
  356. void* data;
  357. int isfinished;
  358. };
  359. /*
  360.  * fluid_sample_timer_process - called when synth->ticks is updated
  361.  */
  362. void fluid_sample_timer_process(fluid_synth_t* synth)
  363. {
  364. fluid_sample_timer_t* st;
  365. long msec;
  366. int cont;
  367. for (st=synth->sample_timers; st; st=st->next) {
  368. if (st->isfinished) {
  369. continue;
  370. }
  371. msec = (long) (1000.0*((double) (synth->ticks - st->starttick))/synth->sample_rate);
  372. cont = (*st->callback)(st->data, msec);
  373. if (cont == 0) {
  374. st->isfinished = 1;
  375. }
  376. }
  377. }
  378. fluid_sample_timer_t* new_fluid_sample_timer(fluid_synth_t* synth, fluid_timer_callback_t callback, void* data)
  379. {
  380. fluid_sample_timer_t* result = FLUID_NEW(fluid_sample_timer_t);
  381. if (result == NULL) {
  382. FLUID_LOG(FLUID_ERR, "Out of memory");
  383. return NULL;
  384. }
  385. result->starttick = synth->ticks;
  386. result->isfinished = 0;
  387. result->data = data;
  388. result->callback = callback;
  389. result->next = synth->sample_timers;
  390. synth->sample_timers = result;
  391. return result;
  392. }
  393. int delete_fluid_sample_timer(fluid_synth_t* synth, fluid_sample_timer_t* timer)
  394. {
  395. fluid_sample_timer_t** ptr = &synth->sample_timers;
  396. while (*ptr) {
  397. if (*ptr == timer) {
  398. *ptr = timer->next; 
  399. FLUID_FREE(timer);
  400. return FLUID_OK;
  401. }
  402. ptr = &((*ptr)->next);
  403. }
  404. FLUID_LOG(FLUID_ERR,"delete_fluid_sample_timer failed, no timer found");
  405. return FLUID_FAILED;
  406. }
  407. /***************************************************************
  408.  *
  409.  *                      FLUID SYNTH
  410.  */
  411. /**
  412.  * Create new FluidSynth instance.
  413.  * @param settings Configuration parameters to use (used directly).
  414.  * @return New FluidSynth instance or NULL on error
  415.  *
  416.  * NOTE: The settings parameter is used directly and should not be modified
  417.  * or freed independently.
  418.  */
  419. fluid_synth_t*
  420. new_fluid_synth(fluid_settings_t *settings)
  421. {
  422.   fluid_synth_t* synth;
  423.   fluid_sfloader_t* loader;
  424.   double gain;
  425.   int i;
  426.   /* initialize all the conversion tables and other stuff */
  427.   if (fluid_synth_initialized == 0) {
  428.     fluid_synth_init();
  429.   }
  430.   /* allocate a new synthesizer object */
  431.   synth = FLUID_NEW(fluid_synth_t);
  432.   if (synth == NULL) {
  433.     FLUID_LOG(FLUID_ERR, "Out of memory");
  434.     return NULL;
  435.   }
  436.   FLUID_MEMSET(synth, 0, sizeof(fluid_synth_t));
  437.   fluid_rec_mutex_init(synth->mutex);
  438.   fluid_private_init(synth->thread_queues);
  439.   synth->return_queue = fluid_event_queue_new (FLUID_MAX_RETURN_EVENTS);
  440.   synth->return_queue_mutex = new_fluid_cond_mutex ();
  441.   synth->return_queue_cond = new_fluid_cond ();
  442.   if (synth->return_queue == NULL) {
  443.     FLUID_LOG(FLUID_ERR, "Out of memory");
  444.     goto error_recovery;
  445.   }
  446.   synth->settings = settings;
  447.   fluid_settings_getint(settings, "synth.reverb.active", &synth->with_reverb);
  448.   fluid_settings_getint(settings, "synth.chorus.active", &synth->with_chorus);
  449.   fluid_settings_getint(settings, "synth.verbose", &synth->verbose);
  450.   fluid_settings_getint(settings, "synth.dump", &synth->dump);
  451.   fluid_settings_getint(settings, "synth.polyphony", &synth->polyphony);
  452.   synth->shadow_polyphony = synth->polyphony;
  453.   fluid_settings_getnum(settings, "synth.sample-rate", &synth->sample_rate);
  454.   fluid_settings_getint(settings, "synth.midi-channels", &synth->midi_channels);
  455.   fluid_settings_getint(settings, "synth.audio-channels", &synth->audio_channels);
  456.   fluid_settings_getint(settings, "synth.audio-groups", &synth->audio_groups);
  457.   fluid_settings_getint(settings, "synth.effects-channels", &synth->effects_channels);
  458.   fluid_settings_getnum(settings, "synth.gain", &gain);
  459.   synth->gain = gain;
  460.   fluid_settings_getint(settings, "synth.device-id", &synth->device_id);
  461.   fluid_settings_getint(settings, "synth.cpu-cores", &synth->cores);
  462.   fluid_settings_getint(settings, "synth.min-note-length", &i);
  463.   synth->min_note_length_ticks = (unsigned int) (i*synth->sample_rate/1000.0f);
  464.   /* register the callbacks */
  465.   fluid_settings_register_num(settings, "synth.gain",
  466.       0.2f, 0.0f, 10.0f, 0,
  467.       (fluid_num_update_t) fluid_synth_update_gain, synth);
  468.   fluid_settings_register_int(settings, "synth.polyphony",
  469.       synth->polyphony, 16, 4096, 0,
  470.       (fluid_int_update_t) fluid_synth_update_polyphony,
  471.                               synth);
  472.   fluid_settings_register_int(settings, "synth.device-id",
  473.       synth->device_id, 126, 0, 0,
  474.                               (fluid_int_update_t) fluid_synth_update_device_id, synth);
  475.   /* do some basic sanity checking on the settings */
  476.   if (synth->midi_channels % 16 != 0) {
  477.     int n = synth->midi_channels / 16;
  478.     synth->midi_channels = (n + 1) * 16;
  479.     fluid_settings_setint(settings, "synth.midi-channels", synth->midi_channels);
  480.     FLUID_LOG(FLUID_WARN, "Requested number of MIDI channels is not a multiple of 16. "
  481.      "I'll increase the number of channels to the next multiple.");
  482.   }
  483.   if (synth->audio_channels < 1) {
  484.     FLUID_LOG(FLUID_WARN, "Requested number of audio channels is smaller than 1. "
  485.      "Changing this setting to 1.");
  486.     synth->audio_channels = 1;
  487.   } else if (synth->audio_channels > 128) {
  488.     FLUID_LOG(FLUID_WARN, "Requested number of audio channels is too big (%d). "
  489.      "Limiting this setting to 128.", synth->audio_channels);
  490.     synth->audio_channels = 128;
  491.   }
  492.   if (synth->audio_groups < 1) {
  493.     FLUID_LOG(FLUID_WARN, "Requested number of audio groups is smaller than 1. "
  494.      "Changing this setting to 1.");
  495.     synth->audio_groups = 1;
  496.   } else if (synth->audio_groups > 128) {
  497.     FLUID_LOG(FLUID_WARN, "Requested number of audio groups is too big (%d). "
  498.      "Limiting this setting to 128.", synth->audio_groups);
  499.     synth->audio_groups = 128;
  500.   }
  501.   if (synth->effects_channels < 2) {
  502.     FLUID_LOG(FLUID_WARN, "Invalid number of effects channels (%d)."
  503.      "Setting effects channels to 2.", synth->effects_channels);
  504.     synth->effects_channels = 2;
  505.   }
  506.   /* The number of buffers is determined by the higher number of nr
  507.    * groups / nr audio channels.  If LADSPA is unused, they should be
  508.    * the same. */
  509.   synth->nbuf = synth->audio_channels;
  510.   if (synth->audio_groups > synth->nbuf) {
  511.     synth->nbuf = synth->audio_groups;
  512.   }
  513. #ifdef LADSPA
  514.   /* Create and initialize the Fx unit.*/
  515.   synth->LADSPA_FxUnit = new_fluid_LADSPA_FxUnit(synth);
  516. #endif
  517.   /* as soon as the synth is created it starts playing. */
  518.   synth->state = FLUID_SYNTH_PLAYING;
  519.   synth->sfont_info = NULL;
  520.   synth->sfont_hash = new_fluid_hashtable (NULL, NULL);
  521.   synth->noteid = 0;
  522.   synth->ticks = 0;
  523.   synth->tuning = NULL;
  524.   fluid_private_init(synth->tuning_iter);
  525.   /* allocate and add the default sfont loader */
  526.   loader = new_fluid_defsfloader();
  527.   if (loader == NULL) {
  528.     FLUID_LOG(FLUID_WARN, "Failed to create the default SoundFont loader");
  529.   } else {
  530.     fluid_synth_add_sfloader(synth, loader);
  531.   }
  532.   /* allocate all channel objects */
  533.   synth->channel = FLUID_ARRAY(fluid_channel_t*, synth->midi_channels);
  534.   if (synth->channel == NULL) {
  535.     FLUID_LOG(FLUID_ERR, "Out of memory");
  536.     goto error_recovery;
  537.   }
  538.   for (i = 0; i < synth->midi_channels; i++) {
  539.     synth->channel[i] = new_fluid_channel(synth, i);
  540.     if (synth->channel[i] == NULL) {
  541.       goto error_recovery;
  542.     }
  543.   }
  544.   /* allocate all synthesis processes */
  545.   synth->nvoice = synth->polyphony;
  546.   synth->voice = FLUID_ARRAY(fluid_voice_t*, synth->nvoice);
  547.   if (synth->voice == NULL) {
  548.     goto error_recovery;
  549.   }
  550.   for (i = 0; i < synth->nvoice; i++) {
  551.     synth->voice[i] = new_fluid_voice(synth->sample_rate);
  552.     if (synth->voice[i] == NULL) {
  553.       goto error_recovery;
  554.     }
  555.   }
  556.   /* Allocate the sample buffers */
  557.   synth->left_buf = NULL;
  558.   synth->right_buf = NULL;
  559.   synth->fx_left_buf = NULL;
  560.   synth->fx_right_buf = NULL;
  561.   /* Left and right audio buffers */
  562.   synth->left_buf = FLUID_ARRAY(fluid_real_t*, synth->nbuf);
  563.   synth->right_buf = FLUID_ARRAY(fluid_real_t*, synth->nbuf);
  564.   if ((synth->left_buf == NULL) || (synth->right_buf == NULL)) {
  565.     FLUID_LOG(FLUID_ERR, "Out of memory");
  566.     goto error_recovery;
  567.   }
  568.   FLUID_MEMSET(synth->left_buf, 0, synth->nbuf * sizeof(fluid_real_t*));
  569.   FLUID_MEMSET(synth->right_buf, 0, synth->nbuf * sizeof(fluid_real_t*));
  570.   for (i = 0; i < synth->nbuf; i++) {
  571.     synth->left_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE);
  572.     synth->right_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE);
  573.     if ((synth->left_buf[i] == NULL) || (synth->right_buf[i] == NULL)) {
  574.       FLUID_LOG(FLUID_ERR, "Out of memory");
  575.       goto error_recovery;
  576.     }
  577.   }
  578.   /* Effects audio buffers */
  579.   synth->fx_left_buf = FLUID_ARRAY(fluid_real_t*, synth->effects_channels);
  580.   synth->fx_right_buf = FLUID_ARRAY(fluid_real_t*, synth->effects_channels);
  581.   if ((synth->fx_left_buf == NULL) || (synth->fx_right_buf == NULL)) {
  582.     FLUID_LOG(FLUID_ERR, "Out of memory");
  583.     goto error_recovery;
  584.   }
  585.   FLUID_MEMSET(synth->fx_left_buf, 0, synth->effects_channels * sizeof(fluid_real_t*));
  586.   FLUID_MEMSET(synth->fx_right_buf, 0, synth->effects_channels * sizeof(fluid_real_t*));
  587.   for (i = 0; i < synth->effects_channels; i++) {
  588.     synth->fx_left_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE);
  589.     synth->fx_right_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE);
  590.     if ((synth->fx_left_buf[i] == NULL) || (synth->fx_right_buf[i] == NULL)) {
  591.       FLUID_LOG(FLUID_ERR, "Out of memory");
  592.       goto error_recovery;
  593.     }
  594.   }
  595.   synth->cur = FLUID_BUFSIZE;
  596.   synth->dither_index = 0;
  597.   /* allocate the reverb module */
  598.   synth->reverb = new_fluid_revmodel();
  599.   if (synth->reverb == NULL) {
  600.     FLUID_LOG(FLUID_ERR, "Out of memory");
  601.     goto error_recovery;
  602.   }
  603.   synth->reverb_roomsize = FLUID_REVERB_DEFAULT_ROOMSIZE;
  604.   synth->reverb_damping = FLUID_REVERB_DEFAULT_DAMP;
  605.   synth->reverb_width = FLUID_REVERB_DEFAULT_WIDTH;
  606.   synth->reverb_level = FLUID_REVERB_DEFAULT_LEVEL;
  607.   fluid_revmodel_set (synth->reverb, FLUID_REVMODEL_SET_ALL,
  608.                       synth->reverb_roomsize, synth->reverb_damping,
  609.                       synth->reverb_width, synth->reverb_level);
  610.   /* allocate the chorus module */
  611.   synth->chorus = new_fluid_chorus(synth->sample_rate);
  612.   if (synth->chorus == NULL) {
  613.     FLUID_LOG(FLUID_ERR, "Out of memory");
  614.     goto error_recovery;
  615.   }
  616.   /* Initialize multi-core variables if multiple cores enabled */
  617.   if (synth->cores > 1)
  618.   {
  619.     int prio_level = 0;
  620.     synth->core_mutex = new_fluid_cond_mutex ();
  621.     synth->core_cond = new_fluid_cond ();
  622.     synth->core_wait_last_cond = new_fluid_cond ();
  623.     synth->core_threads = FLUID_ARRAY (fluid_thread_t *, synth->cores - 1);
  624.     synth->core_voice_processed = FLUID_ARRAY (fluid_voice_t *, synth->polyphony);
  625.     synth->core_bufs = FLUID_MALLOC (synth->polyphony * FLUID_BUFSIZE * sizeof (fluid_real_t));
  626.     if (!synth->core_mutex || !synth->core_cond || !synth->core_wait_last_cond
  627.         || !synth->core_threads || !synth->core_voice_processed
  628.         || !synth->core_bufs)
  629.     {
  630.       FLUID_LOG(FLUID_ERR, "Out of memory");
  631.       goto error_recovery;
  632.     }
  633.     synth->cores_active = TRUE;
  634.     synth->core_work = FALSE;
  635.     synth->core_inprogress = 0;
  636.     synth->core_waiting_for_last = FALSE;
  637.     for (i = 0; i < synth->polyphony; i++)
  638.       synth->core_voice_processed[i] = NULL;
  639.     fluid_settings_getint (synth->settings, "audio.realtime-prio", &prio_level);
  640.     for (i = 0; i < synth->cores - 1; i++)
  641.     {
  642.       synth->core_threads[i] = new_fluid_thread (fluid_synth_core_thread_func,
  643.                                                  synth, prio_level, FALSE);
  644.       if (!synth->core_threads[i])
  645.         FLUID_LOG(FLUID_ERR, "Failed to create a synthesis core thread");
  646.     }
  647.   }
  648.   /* FIXME */
  649.   synth->start = fluid_curtime();
  650.   /* Spawn a thread to process synth thread return events */
  651.   synth->return_queue_thread = new_fluid_thread (fluid_synth_return_event_process_thread,
  652.                                                  synth, 0, FALSE);
  653.   return synth;
  654.  error_recovery:
  655.   delete_fluid_synth(synth);
  656.   return NULL;
  657. }
  658. /* Callback to process synthesis thread return events */
  659. static void
  660. fluid_synth_return_event_process_thread (void* data)
  661. {
  662.   fluid_synth_t *synth = data;
  663.   fluid_event_queue_elem_t *event;
  664.   fluid_preset_t *preset;
  665.   fluid_sfont_t *sfont;
  666.   /* Loop while synth is PLAYING */
  667.   do
  668.   { /* Block until we have some work to do or synth stops playing */
  669.     fluid_cond_mutex_lock (synth->return_queue_mutex);
  670.     while (!(event = fluid_event_queue_get_outptr (synth->return_queue))
  671.            && fluid_atomic_int_get (&synth->state) == FLUID_SYNTH_PLAYING)
  672.       fluid_cond_wait (synth->return_queue_cond, synth->return_queue_mutex);
  673.     fluid_cond_mutex_unlock (synth->return_queue_mutex);
  674.     if (!event) break;          /* No event means synth stopped playing */
  675.     /* Loop while there are return events */
  676.     do
  677.     {
  678.       switch (event->type)
  679.       {
  680.         case FLUID_EVENT_QUEUE_ELEM_FREE_PRESET:  /* Preset free event */
  681.           preset = (fluid_preset_t *)(event->pval);
  682.           sfont = preset->sfont;
  683.           /* Delete presets under mutex lock, to protect chan->shadow_preset */
  684.           fluid_rec_mutex_lock (synth->mutex);
  685.           delete_fluid_preset (preset);
  686.           fluid_rec_mutex_unlock (synth->mutex);
  687.           fluid_synth_sfont_unref (synth, sfont); /* -- unref preset's SoundFont */
  688.           break;
  689.       }
  690.       fluid_event_queue_next_outptr (synth->return_queue);
  691.     }
  692.     while ((event = fluid_event_queue_get_outptr (synth->return_queue)));
  693.   }
  694.   while (fluid_atomic_int_get (&synth->state) == FLUID_SYNTH_PLAYING);
  695. }
  696. /**
  697.  * Delete a FluidSynth instance.
  698.  * @param synth FluidSynth instance to delete
  699.  * @return FLUID_OK
  700.  *
  701.  * NOTE: Other users of a synthesizer instance, such as audio and MIDI drivers,
  702.  * should be deleted prior to freeing the FluidSynth instance.
  703.  */
  704. int
  705. delete_fluid_synth(fluid_synth_t* synth)
  706. {
  707.   int i, k;
  708.   fluid_list_t *list;
  709.   fluid_sfont_info_t* sfont_info;
  710.   fluid_event_queue_t* queue;
  711.   fluid_sfloader_t* loader;
  712.   if (synth == NULL) {
  713.     return FLUID_OK;
  714.   }
  715.   fluid_profiling_print();
  716.   /* Stop return event queue thread, and process remaining events */
  717.   if (synth->return_queue_thread)
  718.   { /* Signal the return queue thread to cause it to exit */
  719.     fluid_cond_mutex_lock (synth->return_queue_mutex);
  720.     fluid_atomic_int_set (&synth->state, FLUID_SYNTH_STOPPED);
  721.     fluid_cond_signal (synth->return_queue_cond);
  722.     fluid_cond_mutex_unlock (synth->return_queue_mutex);
  723.     fluid_thread_join (synth->return_queue_thread);
  724.     delete_fluid_thread (synth->return_queue_thread);
  725.   }
  726.   else fluid_atomic_int_set (&synth->state, FLUID_SYNTH_STOPPED);
  727.   if (synth->return_queue)
  728.     fluid_event_queue_free(synth->return_queue);
  729.   if (synth->return_queue_mutex)
  730.     delete_fluid_cond_mutex (synth->return_queue_mutex);
  731.   if (synth->return_queue_cond)
  732.     delete_fluid_cond (synth->return_queue_cond);
  733.   /* Free multi-core resources (if multi-core enabled) */
  734.   if (synth->cores > 1)
  735.   {
  736.     /* Signal slave core threads to exit and wait for them to finish */
  737.     fluid_cond_mutex_lock (synth->core_mutex);  /* ++ Lock */
  738.     synth->cores_active = FALSE;
  739.     fluid_cond_broadcast (synth->core_cond);
  740.     fluid_cond_mutex_unlock (synth->core_mutex);  /* -- Unlock */
  741.     for (i = 0; i < synth->cores - 1; i++)
  742.       if (synth->core_threads[i])
  743.         fluid_thread_join (synth->core_threads[i]);
  744.     delete_fluid_cond_mutex (synth->core_mutex);
  745.     delete_fluid_cond (synth->core_cond);
  746.     delete_fluid_cond (synth->core_wait_last_cond);
  747.     FLUID_FREE (synth->core_voice_processed);
  748.     FLUID_FREE (synth->core_bufs);
  749.   }
  750.   /* turn off all voices, needed to unload SoundFont data */
  751.   if (synth->voice != NULL) {
  752.     for (i = 0; i < synth->nvoice; i++) {
  753.       if (synth->voice[i] && fluid_voice_is_playing (synth->voice[i]))
  754. fluid_voice_off (synth->voice[i]);
  755.     }
  756.   }
  757.   /* delete all the SoundFonts */
  758.   for (list = synth->sfont_info; list; list = fluid_list_next (list)) {
  759.     sfont_info = (fluid_sfont_info_t *)fluid_list_get (list);
  760.     delete_fluid_sfont (sfont_info->sfont);
  761.     FLUID_FREE (sfont_info);
  762.   }
  763.   delete_fluid_list(synth->sfont_info);
  764.   /* Delete the SoundFont info hash */
  765.   if (synth->sfont_hash) delete_fluid_hashtable (synth->sfont_hash);
  766.   /* delete all the SoundFont loaders */
  767.   for (list = synth->loaders; list; list = fluid_list_next(list)) {
  768.     loader = (fluid_sfloader_t*) fluid_list_get(list);
  769.     fluid_sfloader_delete(loader);
  770.   }
  771.   delete_fluid_list(synth->loaders);
  772.   if (synth->channel != NULL) {
  773.     for (i = 0; i < synth->midi_channels; i++) {
  774.       if (synth->channel[i] != NULL) {
  775. delete_fluid_channel(synth->channel[i]);
  776.       }
  777.     }
  778.     FLUID_FREE(synth->channel);
  779.   }
  780.   if (synth->voice != NULL) {
  781.     for (i = 0; i < synth->nvoice; i++) {
  782.       if (synth->voice[i] != NULL) {
  783. delete_fluid_voice(synth->voice[i]);
  784.       }
  785.     }
  786.     FLUID_FREE(synth->voice);
  787.   }
  788.   /* free all the sample buffers */
  789.   if (synth->left_buf != NULL) {
  790.     for (i = 0; i < synth->nbuf; i++) {
  791.       if (synth->left_buf[i] != NULL) {
  792. FLUID_FREE(synth->left_buf[i]);
  793.       }
  794.     }
  795.     FLUID_FREE(synth->left_buf);
  796.   }
  797.   if (synth->right_buf != NULL) {
  798.     for (i = 0; i < synth->nbuf; i++) {
  799.       if (synth->right_buf[i] != NULL) {
  800. FLUID_FREE(synth->right_buf[i]);
  801.       }
  802.     }
  803.     FLUID_FREE(synth->right_buf);
  804.   }
  805.   if (synth->fx_left_buf != NULL) {
  806.     for (i = 0; i < synth->effects_channels; i++) {
  807.       if (synth->fx_left_buf[i] != NULL) {
  808. FLUID_FREE(synth->fx_left_buf[i]);
  809.       }
  810.     }
  811.     FLUID_FREE(synth->fx_left_buf);
  812.   }
  813.   if (synth->fx_right_buf != NULL) {
  814.     for (i = 0; i < synth->effects_channels; i++) {
  815.       if (synth->fx_right_buf[i] != NULL) {
  816. FLUID_FREE(synth->fx_right_buf[i]);
  817.       }
  818.     }
  819.     FLUID_FREE(synth->fx_right_buf);
  820.   }
  821.   /* release the reverb module */
  822.   if (synth->reverb != NULL) {
  823.     delete_fluid_revmodel(synth->reverb);
  824.   }
  825.   /* release the chorus module */
  826.   if (synth->chorus != NULL) {
  827.     delete_fluid_chorus(synth->chorus);
  828.   }
  829.   /* free the tunings, if any */
  830.   if (synth->tuning != NULL) {
  831.     for (i = 0; i < 128; i++) {
  832.       if (synth->tuning[i] != NULL) {
  833. for (k = 0; k < 128; k++) {
  834.   if (synth->tuning[i][k] != NULL) {
  835.     delete_fluid_tuning(synth->tuning[i][k]);
  836.   }
  837. }
  838. FLUID_FREE(synth->tuning[i]);
  839.       }
  840.     }
  841.     FLUID_FREE(synth->tuning);
  842.   }
  843.   fluid_private_free (synth->tuning_iter);
  844. #ifdef LADSPA
  845.   /* Release the LADSPA Fx unit */
  846.   fluid_LADSPA_shutdown(synth->LADSPA_FxUnit);
  847.   FLUID_FREE(synth->LADSPA_FxUnit);
  848. #endif
  849.   fluid_private_free (synth->thread_queues);
  850.   /* free any queues in pool */
  851.   for (list = synth->queue_pool; list; list = list->next) {
  852.     queue = (fluid_event_queue_t *)(list->data);
  853.     /* Prevent double-free later */
  854.     for (i = 0; i < FLUID_MAX_EVENT_QUEUES; i++)
  855.       if (synth->queues[i] == queue) synth->queues[i] = NULL;
  856.     fluid_event_queue_free (queue);
  857.   }
  858.   /* free remaining event queues, if any */
  859.   for (i = 0; i < FLUID_MAX_EVENT_QUEUES; i++)
  860.     if (synth->queues[i]) fluid_event_queue_free (synth->queues[i]);
  861.   delete_fluid_list (synth->queue_pool);
  862.   fluid_rec_mutex_destroy(synth->mutex);
  863.   FLUID_FREE(synth);
  864.   return FLUID_OK;
  865. }
  866. /**
  867.  * Get a textual representation of the last error
  868.  * @param synth FluidSynth instance
  869.  * @return Pointer to string of last error message.  Valid until the same
  870.  *   calling thread calls another FluidSynth function which fails.  String is
  871.  *   internal and should not be modified or freed.
  872.  */
  873. /* FIXME - The error messages are not thread-safe, yet. They are still stored
  874.  * in a global message buffer (see fluid_sys.c). */
  875. char*
  876. fluid_synth_error(fluid_synth_t* synth)
  877. {
  878.   return fluid_error();
  879. }
  880. /* Get event queue for the current thread (create if necessary) */
  881. static fluid_event_queue_t *
  882. fluid_synth_get_event_queue (fluid_synth_t* synth)
  883. {
  884.   fluid_event_queue_t *queue;
  885.   int i;
  886.   queue = fluid_private_get (synth->thread_queues);    /* Get event queue for this thread */
  887.   if (!queue)   /* This thread has no queue yet? */
  888.   {
  889.     fluid_rec_mutex_lock (synth->mutex);    /* ++ lock queue_pool */
  890.     /* Use an unclaimed queue, if any (it will already be in synth->queues[] in that case) */
  891.     if (synth->queue_pool)
  892.     {
  893.       fluid_list_t *p;
  894.       queue = synth->queue_pool->data;
  895.       /* Remove from queue_pool list */
  896.       p = synth->queue_pool;
  897.       synth->queue_pool = fluid_list_remove_link (p, p);
  898.       delete1_fluid_list (p);
  899.     }
  900.     fluid_rec_mutex_unlock (synth->mutex);  /* -- unlock queue_pool */
  901.     if (!queue)         /* Create event queue, if one wasn't re-claimed */
  902.     {
  903.       queue = fluid_event_queue_new (FLUID_MAX_EVENTS_PER_BUFSIZE);
  904.       if (!queue) return NULL;   /* Error has already been logged */
  905.       queue->synth = synth;
  906.       /* Atomicly and in a lock free fashion, put queue pointer in queues[] array */
  907.       for (i = 0; i < FLUID_MAX_EVENT_QUEUES; i++)
  908.       {
  909.         if (!fluid_atomic_pointer_get (&synth->queues[i]))
  910.         {
  911.           if (fluid_atomic_pointer_compare_and_exchange ((void **)&synth->queues[i],
  912.                                                          NULL, (void *)queue))
  913.             break;
  914.         }
  915.       }
  916.       if (i == FLUID_MAX_EVENT_QUEUES)
  917.       {
  918.         FLUID_LOG (FLUID_ERR, "Maximum thread event queues exceeded");
  919.         return NULL;
  920.       }
  921.     }
  922.     fluid_private_set (synth->thread_queues, queue, fluid_synth_thread_queue_destroy_notify);
  923.   }
  924.   return queue;
  925. }
  926. /* Get available event for sending to synthesis thread.  Returns NULL on error.
  927.  * queue is an output parameter. */
  928. static fluid_event_queue_elem_t *
  929. fluid_synth_get_event_elem (fluid_synth_t* synth, fluid_event_queue_t **queue)
  930. {
  931.   fluid_event_queue_t *q;
  932.   fluid_event_queue_elem_t *event;
  933.   q = fluid_synth_get_event_queue (synth);
  934.   if (!q) return NULL;
  935.   event = fluid_event_queue_get_inptr (q);
  936.   if (!event)
  937.   {
  938.     FLUID_LOG (FLUID_ERR, "Synthesis event queue full");
  939.     return NULL;
  940.   }
  941.   *queue = q;
  942.   return event;
  943. }
  944. /**
  945.  * Queues a MIDI event to the FluidSynth synthesis thread.
  946.  * @param synth FluidSynth instance
  947.  * @param type MIDI event type (#fluid_midi_event_type)
  948.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  949.  * @param param1 MIDI event first parameter (depends on type)
  950.  * @param param2 MIDI event second parameter (depends on type)
  951.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  952.  */
  953. static int
  954. fluid_synth_queue_midi_event (fluid_synth_t* synth, int type, int chan,
  955.                               int param1, int param2)
  956. {
  957.   fluid_event_queue_t *queue;
  958.   fluid_event_queue_elem_t *event;
  959.   event = fluid_synth_get_event_elem (synth, &queue);
  960.   if (!event) return FLUID_FAILED;
  961.   event->type = FLUID_EVENT_QUEUE_ELEM_MIDI;
  962.   event->midi.type = type;
  963.   event->midi.channel = chan;
  964.   event->midi.param1 = param1;
  965.   event->midi.param2 = param2;
  966.   fluid_event_queue_next_inptr (queue);
  967.   return FLUID_OK;
  968. }
  969. /**
  970.  * Queues a generator assignment event to the FluidSynth synthesis thread.
  971.  * @param synth FluidSynth instance
  972.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  973.  * @param param Generator ID (#fluid_gen_type)
  974.  * @param value Value to assign to generator
  975.  * @param absolute TRUE if value is an absolute assignment, FALSE for relative
  976.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  977.  */
  978. static int
  979. fluid_synth_queue_gen_event (fluid_synth_t* synth, int chan,
  980.                              int param, float value, int absolute)
  981. {
  982.   fluid_event_queue_t *queue;
  983.   fluid_event_queue_elem_t *event;
  984.   event = fluid_synth_get_event_elem (synth, &queue);
  985.   if (!event) return FLUID_FAILED;
  986.   event->type = FLUID_EVENT_QUEUE_ELEM_GEN;
  987.   event->gen.channel = chan;
  988.   event->gen.param = param;
  989.   event->gen.value = value;
  990.   event->gen.absolute = absolute;
  991.   fluid_event_queue_next_inptr (queue);
  992.   return FLUID_OK;
  993. }
  994. /**
  995.  * Queues an event with an integer value payload.
  996.  * @param synth FluidSynth instance
  997.  * @param type Event type (#fluid_event_queue_elem)
  998.  * @param val Event value
  999.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1000.  */
  1001. static int
  1002. fluid_synth_queue_int_event (fluid_synth_t* synth, int type, int val)
  1003. {
  1004.   fluid_event_queue_t *queue;
  1005.   fluid_event_queue_elem_t *event;
  1006.   event = fluid_synth_get_event_elem (synth, &queue);
  1007.   if (!event) return FLUID_FAILED;
  1008.   event->type = type;
  1009.   event->ival = val;
  1010.   fluid_event_queue_next_inptr (queue);
  1011.   return FLUID_OK;
  1012. }
  1013. /* Gets called when a thread ends, which has been assigned a queue */
  1014. static void
  1015. fluid_synth_thread_queue_destroy_notify (void *data)
  1016. {
  1017.   fluid_event_queue_t *queue = data;
  1018.   fluid_synth_t *synth = queue->synth;
  1019.   /* Queues are not freed (can't be thread safe without locking in synth thread),
  1020.    * added to pool for potential future use */
  1021.   fluid_rec_mutex_lock (synth->mutex);    /* ++ lock queue_pool */
  1022.   synth->queue_pool = fluid_list_prepend (synth->queue_pool, queue);
  1023.   fluid_rec_mutex_unlock (synth->mutex);  /* -- unlock queue_pool */
  1024. }
  1025. /**
  1026.  * Send a note-on event to a FluidSynth object.
  1027.  * @param synth FluidSynth instance
  1028.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1029.  * @param key MIDI note number (0-127)
  1030.  * @param vel MIDI velocity (0-127, 0=noteoff)
  1031.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1032.  */
  1033. int
  1034. fluid_synth_noteon(fluid_synth_t* synth, int chan, int key, int vel)
  1035. {
  1036.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1037.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1038.   fluid_return_val_if_fail (key >= 0 && key <= 127, FLUID_FAILED);
  1039.   fluid_return_val_if_fail (vel >= 0 && vel <= 127, FLUID_FAILED);
  1040.   if (fluid_synth_should_queue (synth))
  1041.     return fluid_synth_queue_midi_event (synth, NOTE_ON, chan, key, vel);
  1042.   else return fluid_synth_noteon_LOCAL (synth, chan, key, vel);
  1043. }
  1044. /* Local synthesis thread variant of fluid_synth_noteon */
  1045. static int
  1046. fluid_synth_noteon_LOCAL(fluid_synth_t* synth, int chan, int key, int vel)
  1047. {
  1048.   fluid_channel_t* channel;
  1049.   /* notes with velocity zero go to noteoff  */
  1050.   if (vel == 0) return fluid_synth_noteoff_LOCAL(synth, chan, key);
  1051.   channel = synth->channel[chan];
  1052.   /* make sure this channel has a preset */
  1053.   if (channel->preset == NULL) {
  1054.     if (synth->verbose) {
  1055.       FLUID_LOG(FLUID_INFO, "noteont%dt%dt%dt%05dt%.3ft%.3ft%.3ft%dt%s",
  1056.        chan, key, vel, 0,
  1057.        (float) synth->ticks / 44100.0f,
  1058.        (fluid_curtime() - synth->start) / 1000.0f,
  1059.        0.0f, 0, "channel has no preset");
  1060.     }
  1061.     return FLUID_FAILED;
  1062.   }
  1063.   /* If there is another voice process on the same channel and key,
  1064.      advance it to the release phase. */
  1065.   fluid_synth_release_voice_on_same_note_LOCAL(synth, chan, key);
  1066.   synth->storeid = synth->noteid++;
  1067.   return fluid_preset_noteon(channel->preset, synth, chan, key, vel);
  1068. }
  1069. /**
  1070.  * Send a note-off event to a FluidSynth object.
  1071.  * @param synth FluidSynth instance
  1072.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1073.  * @param key MIDI note number (0-127)
  1074.  * @return FLUID_OK on success, FLUID_FAILED otherwise (may just mean that no
  1075.  *   voices matched the note off event)
  1076.  */
  1077. int
  1078. fluid_synth_noteoff(fluid_synth_t* synth, int chan, int key)
  1079. {
  1080.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1081.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1082.   fluid_return_val_if_fail (key >= 0 && key <= 127, FLUID_FAILED);
  1083.   if (fluid_synth_should_queue (synth))
  1084.     return fluid_synth_queue_midi_event (synth, NOTE_OFF, chan, key, 0);
  1085.   else return fluid_synth_noteoff_LOCAL (synth, chan, key);
  1086. }
  1087. /* Local synthesis thread variant of fluid_synth_noteoff */
  1088. static int
  1089. fluid_synth_noteoff_LOCAL(fluid_synth_t* synth, int chan, int key)
  1090. {
  1091.   fluid_voice_t* voice;
  1092.   int status = FLUID_FAILED;
  1093.   int i;
  1094.   for (i = 0; i < synth->polyphony; i++) {
  1095.     voice = synth->voice[i];
  1096.     if (_ON(voice) && (voice->chan == chan) && (voice->key == key)) {
  1097.       if (synth->verbose) {
  1098. int used_voices = 0;
  1099. int k;
  1100. for (k = 0; k < synth->polyphony; k++) {
  1101.   if (!_AVAILABLE(synth->voice[k])) {
  1102.     used_voices++;
  1103.   }
  1104. }
  1105. FLUID_LOG(FLUID_INFO, "noteofft%dt%dt%dt%05dt%.3ft%.3ft%.3ft%d",
  1106.  voice->chan, voice->key, 0, voice->id,
  1107.  (float) (voice->start_time + voice->ticks) / 44100.0f,
  1108.  (fluid_curtime() - synth->start) / 1000.0f,
  1109.  (float) voice->ticks / 44100.0f,
  1110.  used_voices);
  1111.       } /* if verbose */
  1112.       fluid_voice_noteoff(voice);
  1113.       status = FLUID_OK;
  1114.     } /* if voice on */
  1115.   } /* for all voices */
  1116.   return status;
  1117. }
  1118. /* Damp all voices on a channel (turn notes off) */
  1119. static int
  1120. fluid_synth_damp_voices_LOCAL(fluid_synth_t* synth, int chan)
  1121. {
  1122.   fluid_voice_t* voice;
  1123.   int i;
  1124.   for (i = 0; i < synth->polyphony; i++) {
  1125.     voice = synth->voice[i];
  1126.     if ((voice->chan == chan) && _SUSTAINED(voice))
  1127.       fluid_voice_noteoff(voice);
  1128.   }
  1129.   return FLUID_OK;
  1130. }
  1131. /**
  1132.  * Send a MIDI controller event on a MIDI channel.
  1133.  * @param synth FluidSynth instance
  1134.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1135.  * @param num MIDI controller number (0-127)
  1136.  * @param val MIDI controller value (0-127)
  1137.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1138.  */
  1139. int
  1140. fluid_synth_cc(fluid_synth_t* synth, int chan, int num, int val)
  1141. {
  1142.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1143.   fluid_return_val_if_fail (num >= 0 && num <= 127, FLUID_FAILED);
  1144.   fluid_return_val_if_fail (val >= 0 && val <= 127, FLUID_FAILED);
  1145.   if (synth->verbose)
  1146.     FLUID_LOG(FLUID_INFO, "cct%dt%dt%d", chan, num, val);
  1147.   fluid_channel_set_cc (synth->channel[chan], num, val);
  1148.   if (fluid_synth_should_queue (synth))
  1149.     return fluid_synth_queue_midi_event (synth, CONTROL_CHANGE, chan, num, 0);
  1150.   else fluid_synth_cc_LOCAL (synth, chan, num);
  1151.   return FLUID_OK;
  1152. }
  1153. /* Local synthesis thread variant of MIDI CC set function. */
  1154. static int
  1155. fluid_synth_cc_LOCAL (fluid_synth_t* synth, int channum, int num)
  1156. {
  1157.   fluid_channel_t* chan = synth->channel[channum];
  1158.   int nrpn_select;
  1159.   int value;
  1160.   value = fluid_channel_get_cc (chan, num);
  1161.   switch (num) {
  1162.   case SUSTAIN_SWITCH:
  1163.     if (value < 64) fluid_synth_damp_voices_LOCAL (synth, channum);
  1164.     break;
  1165.   case BANK_SELECT_MSB:
  1166.     fluid_channel_set_bank_msb (chan, value & 0x7F);
  1167.     break;
  1168.   case BANK_SELECT_LSB:
  1169.     fluid_channel_set_bank_lsb (chan, value & 0x7F);
  1170.     break;
  1171.   case ALL_NOTES_OFF:
  1172.     fluid_synth_all_notes_off_LOCAL (synth, channum);
  1173.     break;
  1174.   case ALL_SOUND_OFF:
  1175.     fluid_synth_all_sounds_off_LOCAL (synth, channum);
  1176.     break;
  1177.   case ALL_CTRL_OFF:
  1178.     fluid_channel_init_ctrl (chan, 1);
  1179.     fluid_synth_modulate_voices_all_LOCAL (synth, channum);
  1180.     break;
  1181.   case DATA_ENTRY_MSB:
  1182.     {
  1183.       int data = (value << 7) + fluid_channel_get_cc (chan, DATA_ENTRY_LSB);
  1184.       if (fluid_atomic_int_get (&chan->nrpn_active))  /* NRPN is active? */
  1185.       { /* SontFont 2.01 NRPN Message (Sect. 9.6, p. 74)  */
  1186.         if ((fluid_channel_get_cc (chan, NRPN_MSB) == 120)
  1187.             && (fluid_channel_get_cc (chan, NRPN_LSB) < 100))
  1188.         {
  1189.           nrpn_select = fluid_atomic_int_get (&chan->nrpn_select);
  1190.           if (nrpn_select < GEN_LAST)
  1191.           {
  1192.             float val = fluid_gen_scale_nrpn (nrpn_select, data);
  1193.             fluid_synth_set_gen_LOCAL (synth, channum, nrpn_select, val, FALSE);
  1194.           }
  1195.           fluid_atomic_int_set (&chan->nrpn_select, 0);  /* Reset to 0 */
  1196.         }
  1197.       }
  1198.       else if (fluid_channel_get_cc (chan, RPN_MSB) == 0)    /* RPN is active: MSB = 0? */
  1199.       {
  1200.         switch (fluid_channel_get_cc (chan, RPN_LSB))
  1201.         {
  1202.           case RPN_PITCH_BEND_RANGE:    /* Set bend range in semitones */
  1203.             fluid_channel_set_pitch_wheel_sensitivity (synth->channel[channum], value);
  1204.             fluid_synth_update_pitch_wheel_sens_LOCAL (synth, channum);   /* Update bend range */
  1205.             /* FIXME - Handle LSB? (Fine bend range in cents) */
  1206.             break;
  1207.           case RPN_CHANNEL_FINE_TUNE:   /* Fine tune is 14 bit over 1 semitone (+/- 50 cents, 8192 = center) */
  1208.             fluid_synth_set_gen_LOCAL (synth, channum, GEN_FINETUNE,
  1209.                                        (data - 8192) / 8192.0 * 50.0, FALSE);
  1210.             break;
  1211.           case RPN_CHANNEL_COARSE_TUNE: /* Coarse tune is 7 bit and in semitones (64 is center) */
  1212.             fluid_synth_set_gen_LOCAL (synth, channum, GEN_COARSETUNE,
  1213.                                        value - 64, FALSE);
  1214.             break;
  1215.           case RPN_TUNING_PROGRAM_CHANGE:
  1216.             fluid_channel_set_tuning_prog (chan, value);
  1217.             fluid_synth_activate_tuning (synth, channum,
  1218.                                          fluid_channel_get_tuning_bank (chan),
  1219.                                          value, TRUE);
  1220.             break;
  1221.           case RPN_TUNING_BANK_SELECT:
  1222.             fluid_channel_set_tuning_bank (chan, value);
  1223.             break;
  1224.           case RPN_MODULATION_DEPTH_RANGE:
  1225.             break;
  1226.         }
  1227.       }
  1228.       break;
  1229.     }
  1230.   case NRPN_MSB:
  1231.     fluid_channel_set_cc (chan, NRPN_LSB, 0);
  1232.     fluid_atomic_int_set (&chan->nrpn_select, 0);
  1233.     fluid_atomic_int_set (&chan->nrpn_active, 1);
  1234.     break;
  1235.   case NRPN_LSB:
  1236.     /* SontFont 2.01 NRPN Message (Sect. 9.6, p. 74)  */
  1237.     if (fluid_channel_get_cc (chan, NRPN_MSB) == 120) {
  1238.       if (value == 100) {
  1239.         fluid_atomic_int_add (&chan->nrpn_select, 100);
  1240.       } else if (value == 101) {
  1241.         fluid_atomic_int_add (&chan->nrpn_select, 1000);
  1242.       } else if (value == 102) {
  1243.         fluid_atomic_int_add (&chan->nrpn_select, 10000);
  1244.       } else if (value < 100) {
  1245.         fluid_atomic_int_add (&chan->nrpn_select, value);
  1246.       }
  1247.     }
  1248.     fluid_atomic_int_set (&chan->nrpn_active, 1);
  1249.     break;
  1250.   case RPN_MSB:
  1251.   case RPN_LSB:
  1252.     fluid_atomic_int_set (&chan->nrpn_active, 0);
  1253.     break;
  1254.   default:
  1255.     return fluid_synth_modulate_voices_LOCAL (synth, channum, 1, num);
  1256.   }
  1257.   return FLUID_OK;
  1258. }
  1259. /**
  1260.  * Get current MIDI controller value on a MIDI channel.
  1261.  * @param synth FluidSynth instance
  1262.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1263.  * @param num MIDI controller number (0-127)
  1264.  * @param pval Location to store MIDI controller value (0-127)
  1265.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1266.  */
  1267. int
  1268. fluid_synth_get_cc(fluid_synth_t* synth, int chan, int num, int* pval)
  1269. {
  1270.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1271.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1272.   fluid_return_val_if_fail (num >= 0 && num < 128, FLUID_FAILED);
  1273.   fluid_return_val_if_fail (pval != NULL, FLUID_FAILED);
  1274.   *pval = fluid_channel_get_cc (synth->channel[chan], num);
  1275.   return FLUID_OK;
  1276. }
  1277. /*
  1278.  * Handler for synth.device-id setting.
  1279.  */
  1280. static int
  1281. fluid_synth_update_device_id (fluid_synth_t *synth, char *name, int value)
  1282. {
  1283.   fluid_atomic_int_set (&synth->device_id, value);
  1284.   return 0;
  1285. }
  1286. /**
  1287.  * Process a MIDI SYSEX (system exclusive) message.
  1288.  * @param synth FluidSynth instance
  1289.  * @param data Buffer containing SYSEX data (not including 0xF0 and 0xF7)
  1290.  * @param len Length of data in buffer
  1291.  * @param response Buffer to store response to or NULL to ignore
  1292.  * @param response_len IN/OUT parameter, in: size of response buffer, out:
  1293.  *   amount of data written to response buffer (if FLUID_FAILED is returned and
  1294.  *   this value is non-zero, it indicates the response buffer is too small)
  1295.  * @param handled Optional location to store boolean value if message was
  1296.  *   recognized and handled or not (set to TRUE if it was handled)
  1297.  * @param dryrun TRUE to just do a dry run but not actually execute the SYSEX
  1298.  *   command (useful for checking if a SYSEX message would be handled)
  1299.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1300.  * @since 1.1.0
  1301.  */
  1302. /* SYSEX format (0xF0 and 0xF7 not passed to this function):
  1303.  * Non-realtime:    0xF0 0x7E <DeviceId> [BODY] 0xF7
  1304.  * Realtime:        0xF0 0x7F <DeviceId> [BODY] 0xF7
  1305.  * Tuning messages: 0xF0 0x7E/0x7F <DeviceId> 0x08 <sub ID2> [BODY] <ChkSum> 0xF7
  1306.  */
  1307. int
  1308. fluid_synth_sysex(fluid_synth_t *synth, const char *data, int len,
  1309.                   char *response, int *response_len, int *handled, int dryrun)
  1310. {
  1311.   int avail_response = 0;
  1312.   if (handled) *handled = FALSE;
  1313.   if (response_len)
  1314.   {
  1315.     avail_response = *response_len;
  1316.     *response_len = 0;
  1317.   }
  1318.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1319.   fluid_return_val_if_fail (data != NULL, FLUID_FAILED);
  1320.   fluid_return_val_if_fail (len > 0, FLUID_FAILED);
  1321.   fluid_return_val_if_fail (!response || response_len, FLUID_FAILED);
  1322.   if (len < 4) return FLUID_OK;
  1323.   /* MIDI tuning SYSEX message? */
  1324.   if ((data[0] == MIDI_SYSEX_UNIV_NON_REALTIME || data[0] == MIDI_SYSEX_UNIV_REALTIME)
  1325.       && (data[1] == synth->device_id || data[1] == MIDI_SYSEX_DEVICE_ID_ALL)
  1326.       && data[2] == MIDI_SYSEX_MIDI_TUNING_ID)
  1327.     return fluid_synth_sysex_midi_tuning (synth, data, len, response, response_len,
  1328.                                           avail_response, handled, dryrun);
  1329.   return FLUID_OK;
  1330. }
  1331. /* Handler for MIDI tuning SYSEX messages */
  1332. static int
  1333. fluid_synth_sysex_midi_tuning (fluid_synth_t *synth, const char *data, int len,
  1334.                                char *response, int *response_len, int avail_response,
  1335.                                int *handled, int dryrun)
  1336. {
  1337.   int realtime, msgid;
  1338.   int bank = 0, prog, channels;
  1339.   double tunedata[128];
  1340.   int keys[128];
  1341.   char name[17];
  1342.   int note, frac, frac2;
  1343.   uint8 chksum;
  1344.   int i, count, index;
  1345.   const char *dataptr;
  1346.   char *resptr;;
  1347.   realtime = data[0] == MIDI_SYSEX_UNIV_REALTIME;
  1348.   msgid = data[3];
  1349.   switch (msgid)
  1350.   {
  1351.     case MIDI_SYSEX_TUNING_BULK_DUMP_REQ:
  1352.     case MIDI_SYSEX_TUNING_BULK_DUMP_REQ_BANK:
  1353.       if (data[3] == MIDI_SYSEX_TUNING_BULK_DUMP_REQ)
  1354.       {
  1355.         if (len != 5 || data[4] & 0x80 || !response)
  1356.           return FLUID_OK;
  1357.         *response_len = 406;
  1358.         prog = data[4];
  1359.       }
  1360.       else
  1361.       {
  1362.         if (len != 6 || data[4] & 0x80 || data[5] & 0x80 || !response)
  1363.           return FLUID_OK;
  1364.         *response_len = 407;
  1365.         bank = data[4];
  1366.         prog = data[5];
  1367.       }
  1368.       if (dryrun)
  1369.       {
  1370.         if (handled) *handled = TRUE;
  1371.         return FLUID_OK;
  1372.       }
  1373.       if (avail_response < *response_len) return FLUID_FAILED;
  1374.       /* Get tuning data, return if tuning not found */
  1375.       if (fluid_synth_tuning_dump (synth, bank, prog, name, 17, tunedata) == FLUID_FAILED)
  1376.       {
  1377.         *response_len = 0;
  1378.         return FLUID_OK;
  1379.       }
  1380.       resptr = response;
  1381.       *resptr++ = MIDI_SYSEX_UNIV_NON_REALTIME;
  1382.       *resptr++ = synth->device_id;
  1383.       *resptr++ = MIDI_SYSEX_MIDI_TUNING_ID;
  1384.       *resptr++ = MIDI_SYSEX_TUNING_BULK_DUMP;
  1385.       if (msgid == MIDI_SYSEX_TUNING_BULK_DUMP_REQ_BANK)
  1386.         *resptr++ = bank;
  1387.       *resptr++ = prog;
  1388.       FLUID_STRNCPY (resptr, name, 16);
  1389.       resptr += 16;
  1390.       for (i = 0; i < 128; i++)
  1391.       {
  1392.         note = tunedata[i] / 100.0;
  1393.         fluid_clip (note, 0, 127);
  1394.         frac = ((tunedata[i] - note * 100.0) * 16384.0 + 50.0) / 100.0;
  1395.         fluid_clip (frac, 0, 16383);
  1396.         *resptr++ = note;
  1397.         *resptr++ = frac >> 7;
  1398.         *resptr++ = frac & 0x7F;
  1399.       }
  1400.       if (msgid == MIDI_SYSEX_TUNING_BULK_DUMP_REQ)
  1401.       {  /* NOTE: Checksum is not as straight forward as the bank based messages */
  1402.         chksum = MIDI_SYSEX_UNIV_NON_REALTIME ^ MIDI_SYSEX_MIDI_TUNING_ID
  1403.           ^ MIDI_SYSEX_TUNING_BULK_DUMP ^ prog;
  1404.         for (i = 21; i < 128 * 3 + 21; i++)
  1405.           chksum ^= response[i];
  1406.       }
  1407.       else
  1408.       {
  1409.         for (i = 1, chksum = 0; i < 406; i++)
  1410.           chksum ^= response[i];
  1411.       }
  1412.       *resptr++ = chksum & 0x7F;
  1413.       if (handled) *handled = TRUE;
  1414.       break;
  1415.     case MIDI_SYSEX_TUNING_NOTE_TUNE:
  1416.     case MIDI_SYSEX_TUNING_NOTE_TUNE_BANK:
  1417.       dataptr = data + 4;
  1418.       if (msgid == MIDI_SYSEX_TUNING_NOTE_TUNE)
  1419.       {
  1420.         if (len < 10 || data[4] & 0x80 || data[5] & 0x80 || len != data[5] * 4 + 6)
  1421.           return FLUID_OK;
  1422.       }
  1423.       else
  1424.       {
  1425.         if (len < 11 || data[4] & 0x80 || data[5] & 0x80 || data[6] & 0x80
  1426.             || len != data[5] * 4 + 7)
  1427.           return FLUID_OK;
  1428.         bank = *dataptr++;
  1429.       }
  1430.       if (dryrun)
  1431.       {
  1432.         if (handled) *handled = TRUE;
  1433.         return FLUID_OK;
  1434.       }
  1435.       prog = *dataptr++;
  1436.       count = *dataptr++;
  1437.       for (i = 0, index = 0; i < count; i++)
  1438.       {
  1439.         note = *dataptr++;
  1440.         if (note & 0x80) return FLUID_OK;
  1441.         keys[index] = note;
  1442.         note = *dataptr++;
  1443.         frac = *dataptr++;
  1444.         frac2 = *dataptr++;
  1445.         if (note & 0x80 || frac & 0x80 || frac2 & 0x80)
  1446.           return FLUID_OK;
  1447.         frac = frac << 7 | frac2;
  1448.         /* No change pitch value?  Doesn't really make sense to send that, but.. */
  1449.         if (note == 0x7F && frac == 16383) continue;
  1450.         tunedata[index] = note * 100.0 + (frac * 100.0 / 16384.0);
  1451.         index++;
  1452.       }
  1453.       if (index > 0)
  1454.       {
  1455.         if (fluid_synth_tune_notes (synth, bank, prog, index, keys, tunedata,
  1456.                                     realtime) == FLUID_FAILED)
  1457.           return FLUID_FAILED;
  1458.       }
  1459.       if (handled) *handled = TRUE;
  1460.       break;
  1461.     case MIDI_SYSEX_TUNING_OCTAVE_TUNE_1BYTE:
  1462.     case MIDI_SYSEX_TUNING_OCTAVE_TUNE_2BYTE:
  1463.       if ((msgid == MIDI_SYSEX_TUNING_OCTAVE_TUNE_1BYTE && len != 19)
  1464.           || (msgid == MIDI_SYSEX_TUNING_OCTAVE_TUNE_2BYTE && len != 31))
  1465.         return FLUID_OK;
  1466.       if (data[4] & 0x80 || data[5] & 0x80 || data[6] & 0x80)
  1467.         return FLUID_OK;
  1468.       if (dryrun)
  1469.       {
  1470.         if (handled) *handled = TRUE;
  1471.         return FLUID_OK;
  1472.       }
  1473.       channels = (data[4] & 0x03) << 14 | data[5] << 7 | data[6];
  1474.       if (msgid == MIDI_SYSEX_TUNING_OCTAVE_TUNE_1BYTE)
  1475.       {
  1476.         for (i = 0; i < 12; i++)
  1477.         {
  1478.           frac = data[i + 7];
  1479.           if (frac & 0x80) return FLUID_OK;
  1480.           tunedata[i] = (int)frac - 64;
  1481.         }
  1482.       }
  1483.       else
  1484.       {
  1485.         for (i = 0; i < 12; i++)
  1486.         {
  1487.           frac = data[i * 2 + 7];
  1488.           frac2 = data[i * 2 + 8];
  1489.           if (frac & 0x80 || frac2 & 0x80) return FLUID_OK;
  1490.           tunedata[i] = (((int)frac << 7 | (int)frac2) - 8192) * (200.0 / 16384.0);
  1491.         }
  1492.       }
  1493.       if (fluid_synth_activate_octave_tuning (synth, 0, 0, "SYSEX",
  1494.                                               tunedata, realtime) == FLUID_FAILED)
  1495.         return FLUID_FAILED;
  1496.       if (channels)
  1497.       {
  1498.         for (i = 0; i < 16; i++)
  1499.         {
  1500.           if (channels & (1 << i))
  1501.             fluid_synth_activate_tuning (synth, i, 0, 0, realtime);
  1502.         }
  1503.       }
  1504.       if (handled) *handled = TRUE;
  1505.       break;
  1506.   }
  1507.   return FLUID_OK;
  1508. }
  1509. /**
  1510.  * Turn off all notes on a MIDI channel (put them into release phase).
  1511.  * @param synth FluidSynth instance
  1512.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1513.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1514.  */
  1515. int
  1516. fluid_synth_all_notes_off(fluid_synth_t* synth, int chan)
  1517. {
  1518.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1519.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1520.   if (fluid_synth_should_queue (synth))
  1521.     return fluid_synth_queue_midi_event (synth, CONTROL_CHANGE, chan,
  1522.                                          ALL_NOTES_OFF, 0);
  1523.   else return fluid_synth_all_notes_off_LOCAL (synth, chan);
  1524. }
  1525. /* Local synthesis thread variant of all notes off */
  1526. static int
  1527. fluid_synth_all_notes_off_LOCAL(fluid_synth_t* synth, int chan)
  1528. {
  1529.   fluid_voice_t* voice;
  1530.   int i;
  1531.   for (i = 0; i < synth->polyphony; i++) {
  1532.     voice = synth->voice[i];
  1533.     if (_PLAYING(voice) && (voice->chan == chan))
  1534.       fluid_voice_noteoff(voice);
  1535.   }
  1536.   return FLUID_OK;
  1537. }
  1538. /**
  1539.  * Immediately stop all notes on a MIDI channel (skips release phase).
  1540.  * @param synth FluidSynth instance
  1541.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1542.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1543.  */
  1544. int
  1545. fluid_synth_all_sounds_off(fluid_synth_t* synth, int chan)
  1546. {
  1547.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1548.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1549.   if (fluid_synth_should_queue (synth))
  1550.     return fluid_synth_queue_midi_event (synth, CONTROL_CHANGE, chan,
  1551.                                          ALL_SOUND_OFF, 0);
  1552.   else return fluid_synth_all_sounds_off_LOCAL (synth, chan);
  1553. }
  1554. /* Local synthesis thread variant of all sounds off */
  1555. static int
  1556. fluid_synth_all_sounds_off_LOCAL(fluid_synth_t* synth, int chan)
  1557. {
  1558.   fluid_voice_t* voice;
  1559.   int i;
  1560.   for (i = 0; i < synth->polyphony; i++) {
  1561.     voice = synth->voice[i];
  1562.     if (_PLAYING(voice) && (voice->chan == chan))
  1563.       fluid_voice_off(voice);
  1564.   }
  1565.   return FLUID_OK;
  1566. }
  1567. /**
  1568.  * Send MIDI system reset command (big red 'panic' button), turns off notes and
  1569.  *   resets controllers.
  1570.  * @param synth FluidSynth instance
  1571.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1572.  */
  1573. int
  1574. fluid_synth_system_reset(fluid_synth_t* synth)
  1575. {
  1576.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1577.   if (fluid_synth_should_queue (synth))
  1578.     return fluid_synth_queue_midi_event (synth, MIDI_SYSTEM_RESET, 0, 0, 0);
  1579.   else return fluid_synth_system_reset_LOCAL (synth);
  1580. }
  1581. /* Local variant of the system reset command */
  1582. static int
  1583. fluid_synth_system_reset_LOCAL(fluid_synth_t* synth)
  1584. {
  1585.   fluid_voice_t* voice;
  1586.   int i;
  1587.   for (i = 0; i < synth->polyphony; i++) {
  1588.     voice = synth->voice[i];
  1589.     if (_PLAYING(voice))
  1590.       fluid_voice_off(voice);
  1591.   }
  1592.   for (i = 0; i < synth->midi_channels; i++)
  1593.     fluid_channel_reset(synth->channel[i]);
  1594.   fluid_chorus_reset(synth->chorus);
  1595.   fluid_revmodel_reset(synth->reverb);
  1596.   return FLUID_OK;
  1597. }
  1598. /**
  1599.  * Update voices on a MIDI channel after a MIDI control change.
  1600.  * @param synth FluidSynth instance
  1601.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1602.  * @param is_cc Boolean value indicating if ctrl is a CC controller or not
  1603.  * @param ctrl MIDI controller value
  1604.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1605.  */
  1606. static int
  1607. fluid_synth_modulate_voices_LOCAL(fluid_synth_t* synth, int chan, int is_cc, int ctrl)
  1608. {
  1609.   fluid_voice_t* voice;
  1610.   int i;
  1611.   for (i = 0; i < synth->polyphony; i++) {
  1612.     voice = synth->voice[i];
  1613.     if (voice->chan == chan)
  1614.       fluid_voice_modulate(voice, is_cc, ctrl);
  1615.   }
  1616.   return FLUID_OK;
  1617. }
  1618. /**
  1619.  * Update voices on a MIDI channel after all MIDI controllers have been changed.
  1620.  * @param synth FluidSynth instance
  1621.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1622.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1623.  */
  1624. static int
  1625. fluid_synth_modulate_voices_all_LOCAL(fluid_synth_t* synth, int chan)
  1626. {
  1627.   fluid_voice_t* voice;
  1628.   int i;
  1629.   for (i = 0; i < synth->polyphony; i++) {
  1630.     voice = synth->voice[i];
  1631.     if (voice->chan == chan)
  1632.       fluid_voice_modulate_all(voice);
  1633.   }
  1634.   return FLUID_OK;
  1635. }
  1636. /**
  1637.  * Set the MIDI channel pressure controller value.
  1638.  * @param synth FluidSynth instance
  1639.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1640.  * @param val MIDI channel pressure value (0-127)
  1641.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1642.  */
  1643. int
  1644. fluid_synth_channel_pressure(fluid_synth_t* synth, int chan, int val)
  1645. {
  1646.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1647.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1648.   fluid_return_val_if_fail (val >= 0 && val <= 127, FLUID_FAILED);
  1649.   if (synth->verbose)
  1650.     FLUID_LOG(FLUID_INFO, "channelpressuret%dt%d", chan, val);
  1651.   fluid_channel_set_channel_pressure (synth->channel[chan], val);
  1652.   if (fluid_synth_should_queue (synth))
  1653.     return fluid_synth_queue_midi_event (synth, CHANNEL_PRESSURE, chan, 0, 0);
  1654.   else return fluid_synth_update_channel_pressure_LOCAL (synth, chan);
  1655. }
  1656. /* Updates channel pressure from within synthesis thread */
  1657. static int
  1658. fluid_synth_update_channel_pressure_LOCAL(fluid_synth_t* synth, int chan)
  1659. {
  1660.   return fluid_synth_modulate_voices_LOCAL (synth, chan, 0, FLUID_MOD_CHANNELPRESSURE);
  1661. }
  1662. /**
  1663.  * Set the MIDI pitch bend controller value on a MIDI channel.
  1664.  * @param synth FluidSynth instance
  1665.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1666.  * @param val MIDI pitch bend value (0-16383 with 8192 being center)
  1667.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1668.  */
  1669. int
  1670. fluid_synth_pitch_bend(fluid_synth_t* synth, int chan, int val)
  1671. {
  1672.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1673.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1674.   fluid_return_val_if_fail (val >= 0 && val <= 16383, FLUID_FAILED);
  1675.   if (synth->verbose)
  1676.     FLUID_LOG(FLUID_INFO, "pitchbt%dt%d", chan, val);
  1677.   fluid_channel_set_pitch_bend (synth->channel[chan], val);
  1678.   if (fluid_synth_should_queue (synth))
  1679.     return fluid_synth_queue_midi_event (synth, PITCH_BEND, chan, 0, 0);
  1680.   else return fluid_synth_update_pitch_bend_LOCAL (synth, chan);
  1681. }
  1682. /* Local synthesis thread variant of pitch bend */
  1683. static int
  1684. fluid_synth_update_pitch_bend_LOCAL(fluid_synth_t* synth, int chan)
  1685. {
  1686.   return fluid_synth_modulate_voices_LOCAL (synth, chan, 0, FLUID_MOD_PITCHWHEEL);
  1687. }
  1688. /**
  1689.  * Get the MIDI pitch bend controller value on a MIDI channel.
  1690.  * @param synth FluidSynth instance
  1691.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1692.  * @param ppitch_bend Location to store MIDI pitch bend value (0-16383 with
  1693.  *   8192 being center)
  1694.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1695.  */
  1696. int
  1697. fluid_synth_get_pitch_bend(fluid_synth_t* synth, int chan, int* ppitch_bend)
  1698. {
  1699.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1700.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1701.   fluid_return_val_if_fail (ppitch_bend != NULL, FLUID_FAILED);
  1702.   *ppitch_bend = fluid_channel_get_pitch_bend (synth->channel[chan]);
  1703.   return FLUID_OK;
  1704. }
  1705. /**
  1706.  * Set MIDI pitch wheel sensitivity on a MIDI channel.
  1707.  * @param synth FluidSynth instance
  1708.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1709.  * @param val Pitch wheel sensitivity value in semitones
  1710.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1711.  */
  1712. int
  1713. fluid_synth_pitch_wheel_sens(fluid_synth_t* synth, int chan, int val)
  1714. {
  1715.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1716.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1717.   fluid_return_val_if_fail (val >= 0 && val <= 72, FLUID_FAILED);       /* 6 octaves!?  Better than no limit.. */
  1718.   if (synth->verbose)
  1719.     FLUID_LOG(FLUID_INFO, "pitchsenst%dt%d", chan, val);
  1720.   fluid_channel_set_pitch_wheel_sensitivity (synth->channel[chan], val);
  1721.   if (fluid_synth_should_queue (synth))
  1722.     return fluid_synth_queue_midi_event (synth, RPN_LSB, chan,
  1723.                                          RPN_PITCH_BEND_RANGE, val);
  1724.   else return fluid_synth_update_pitch_wheel_sens_LOCAL (synth, chan);
  1725. }
  1726. /* Local synthesis thread variant of set pitch wheel sensitivity */
  1727. static int
  1728. fluid_synth_update_pitch_wheel_sens_LOCAL(fluid_synth_t* synth, int chan)
  1729. {
  1730.   return fluid_synth_modulate_voices_LOCAL (synth, chan, 0, FLUID_MOD_PITCHWHEELSENS);
  1731. }
  1732. /**
  1733.  * Get MIDI pitch wheel sensitivity on a MIDI channel.
  1734.  * @param synth FluidSynth instance
  1735.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1736.  * @param pval Location to store pitch wheel sensitivity value in semitones
  1737.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1738.  * @since Sometime AFTER v1.0 API freeze.
  1739.  */
  1740. int
  1741. fluid_synth_get_pitch_wheel_sens(fluid_synth_t* synth, int chan, int* pval)
  1742. {
  1743.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1744.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1745.   fluid_return_val_if_fail (pval != NULL, FLUID_FAILED);
  1746.   *pval = fluid_channel_get_pitch_wheel_sensitivity (synth->channel[chan]);
  1747.   return FLUID_OK;
  1748. }
  1749. /**
  1750.  * Assign a preset to a MIDI channel.
  1751.  * @param synth FluidSynth instance
  1752.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1753.  * @param preset Preset to assign to channel or NULL to clear (ownership is taken over)
  1754.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1755.  */
  1756. static int
  1757. fluid_synth_set_preset (fluid_synth_t *synth, int chan, fluid_preset_t *preset)
  1758. {
  1759.   fluid_event_queue_t *queue;
  1760.   fluid_event_queue_elem_t *event;
  1761.   fluid_channel_t *channel;
  1762.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1763.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1764.   channel = synth->channel[chan];
  1765.   if (fluid_synth_should_queue (synth))
  1766.   {
  1767.     event = fluid_synth_get_event_elem (synth, &queue);
  1768.     if (!event) return FLUID_FAILED;
  1769.     fluid_atomic_pointer_set (&channel->shadow_preset, preset);
  1770.     event->type = FLUID_EVENT_QUEUE_ELEM_PRESET;
  1771.     event->preset.channel = chan;
  1772.     event->preset.preset = preset;
  1773.     fluid_event_queue_next_inptr (queue);
  1774.     return FLUID_OK;
  1775.   }
  1776.   else return fluid_channel_set_preset (channel, preset);
  1777. }
  1778. /* Get a preset by SoundFont, bank and program numbers.
  1779.  * Returns preset pointer or NULL.
  1780.  *
  1781.  * NOTE: The returned preset has been allocated, caller owns it and should
  1782.  *       free it when finished using it.
  1783.  */
  1784. static fluid_preset_t*
  1785. fluid_synth_get_preset(fluid_synth_t* synth, unsigned int sfontnum,
  1786.                        unsigned int banknum, unsigned int prognum)
  1787. {
  1788.   fluid_preset_t *preset = NULL;
  1789.   fluid_sfont_info_t *sfont_info;
  1790.   fluid_list_t *list;
  1791.   /* 128 indicates an "unset" operation" */
  1792.   if (prognum == FLUID_UNSET_PROGRAM) return NULL;
  1793.   fluid_rec_mutex_lock (synth->mutex);      /* ++ lock sfont list, bank offset list and sfont */
  1794.   for (list = synth->sfont_info; list; list = fluid_list_next (list)) {
  1795.     sfont_info = (fluid_sfont_info_t *)fluid_list_get (list);
  1796.     if (fluid_sfont_get_id (sfont_info->sfont) == sfontnum)
  1797.     {
  1798.       preset = fluid_sfont_get_preset (sfont_info->sfont,
  1799.                                        banknum - sfont_info->bankofs, prognum);
  1800.       if (preset) sfont_info->refcount++;       /* Add reference to SoundFont */
  1801.       break;
  1802.     }
  1803.   }
  1804.   fluid_rec_mutex_unlock (synth->mutex);      /* -- unlock */
  1805.   return preset;
  1806. }
  1807. /* Get a preset by SoundFont name, bank and program.
  1808.  * Returns preset pointer or NULL.
  1809.  *
  1810.  * NOTE: The returned preset has been allocated, caller owns it and should
  1811.  *       free it when finished using it.
  1812.  */
  1813. static fluid_preset_t*
  1814. fluid_synth_get_preset_by_sfont_name(fluid_synth_t* synth, const char *sfontname,
  1815.                                      unsigned int banknum, unsigned int prognum)
  1816. {
  1817.   fluid_preset_t *preset = NULL;
  1818.   fluid_sfont_info_t *sfont_info;
  1819.   fluid_list_t *list;
  1820.   fluid_rec_mutex_lock (synth->mutex);      /* ++ lock sfont list, bank offset list and sfont */
  1821.   for (list = synth->sfont_info; list; list = fluid_list_next (list)) {
  1822.     sfont_info = (fluid_sfont_info_t *)fluid_list_get (list);
  1823.     if (FLUID_STRCMP (fluid_sfont_get_name (sfont_info->sfont), sfontname) == 0)
  1824.     {
  1825.       preset = fluid_sfont_get_preset (sfont_info->sfont,
  1826.                                        banknum - sfont_info->bankofs, prognum);
  1827.       if (preset) sfont_info->refcount++;       /* Add reference to SoundFont */
  1828.       break;
  1829.     }
  1830.   }
  1831.   fluid_rec_mutex_unlock (synth->mutex);      /* -- unlock */
  1832.   return preset;
  1833. }
  1834. /* Find a preset by bank and program numbers.
  1835.  * Returns preset pointer or NULL.
  1836.  *
  1837.  * NOTE: The returned preset has been allocated, caller owns it and should
  1838.  *       free it when finished using it. */
  1839. fluid_preset_t*
  1840. fluid_synth_find_preset(fluid_synth_t* synth, unsigned int banknum,
  1841.                         unsigned int prognum)
  1842. {
  1843.   fluid_preset_t *preset = NULL;
  1844.   fluid_sfont_info_t *sfont_info;
  1845.   fluid_list_t *list;
  1846.   fluid_rec_mutex_lock (synth->mutex);      /* ++ lock sfont list, bank offset list and sfont */
  1847.   for (list = synth->sfont_info; list; list = fluid_list_next (list)) {
  1848.     sfont_info = (fluid_sfont_info_t *)fluid_list_get (list);
  1849.     preset = fluid_sfont_get_preset (sfont_info->sfont,
  1850.                                      banknum - sfont_info->bankofs, prognum);
  1851.     if (preset)
  1852.     {
  1853.       sfont_info->refcount++;       /* Add reference to SoundFont */
  1854.       break;
  1855.     }
  1856.   }
  1857.   fluid_rec_mutex_unlock (synth->mutex);      /* -- unlock */
  1858.   return preset;
  1859. }
  1860. /**
  1861.  * Send a program change event on a MIDI channel.
  1862.  * @param synth FluidSynth instance
  1863.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1864.  * @param prognum MIDI program number (0-127)
  1865.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1866.  */
  1867. /* FIXME - Currently not real-time safe, due to preset allocation and mutex lock,
  1868.  * and may be called from within synthesis context. */
  1869. /* As of 1.1.1 prognum can be set to 128 to unset the preset.  Not documented
  1870.  * since fluid_synth_unset_program() should be used instead. */
  1871. int
  1872. fluid_synth_program_change(fluid_synth_t* synth, int chan, int prognum)
  1873. {
  1874.   fluid_preset_t* preset = NULL;
  1875.   fluid_channel_t* channel;
  1876.   int subst_bank, subst_prog, banknum;
  1877.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1878.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1879.   fluid_return_val_if_fail (prognum >= 0 && prognum <= 128, FLUID_FAILED);
  1880.   channel = synth->channel[chan];
  1881.   fluid_channel_get_sfont_bank_prog(channel, NULL, &banknum, NULL);
  1882.   if (synth->verbose)
  1883.     FLUID_LOG(FLUID_INFO, "progt%dt%dt%d", chan, banknum, prognum);
  1884.   /* Special handling of channel 10 (or 9 counting from 0). channel
  1885.    * 10 is the percussion channel.
  1886.    *
  1887.    * FIXME - Shouldn't hard code bank selection for channel 10.  I think this
  1888.    * is a hack for MIDI files that do bank changes in GM mode.  Proper way to
  1889.    * handle this would probably be to ignore bank changes when in GM mode. - JG
  1890.    */
  1891.   if (prognum != FLUID_UNSET_PROGRAM)
  1892.   {
  1893.     if (channel->channum == 9)
  1894.       preset = fluid_synth_find_preset(synth, DRUM_INST_BANK, prognum);
  1895.     else preset = fluid_synth_find_preset(synth, banknum, prognum);
  1896.     /* Fallback to another preset if not found */
  1897.     if (!preset)
  1898.     {
  1899.       subst_bank = banknum;
  1900.       subst_prog = prognum;
  1901.       /* Melodic instrument? */
  1902.       if (channel->channum != 9 && banknum != DRUM_INST_BANK)
  1903.       {
  1904.         subst_bank = 0;
  1905.         /* Fallback first to bank 0:prognum */
  1906.         preset = fluid_synth_find_preset(synth, 0, prognum);
  1907.         /* Fallback to first preset in bank 0 */
  1908.         if (!preset && prognum != 0)
  1909.         {
  1910.           preset = fluid_synth_find_preset(synth, 0, 0);
  1911.   subst_prog = 0;
  1912.         }
  1913.       }
  1914.       else /* Percussion: Fallback to preset 0 in percussion bank */
  1915.       {
  1916.         preset = fluid_synth_find_preset(synth, DRUM_INST_BANK, 0);
  1917.         subst_prog = 0;
  1918.       }
  1919.       if (preset)
  1920.         FLUID_LOG(FLUID_WARN, "Instrument not found on channel %d [bank=%d prog=%d], substituted [bank=%d prog=%d]",
  1921.                   chan, banknum, prognum, subst_bank, subst_prog); 
  1922.     }
  1923.   }
  1924.   /* Assign the SoundFont ID and program number to the channel */
  1925.   fluid_channel_set_sfont_bank_prog (channel, preset ? fluid_sfont_get_id (preset->sfont) : 0,
  1926.                                      -1, prognum);
  1927.   return fluid_synth_set_preset (synth, chan, preset);
  1928. }
  1929. /**
  1930.  * Set instrument bank number on a MIDI channel.
  1931.  * @param synth FluidSynth instance
  1932.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1933.  * @param bank MIDI bank number
  1934.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1935.  */
  1936. int
  1937. fluid_synth_bank_select(fluid_synth_t* synth, int chan, unsigned int bank)
  1938. {
  1939.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1940.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1941.   fluid_return_val_if_fail (bank <= 16383, FLUID_FAILED);
  1942.   fluid_channel_set_sfont_bank_prog (synth->channel[chan], -1, bank, -1);
  1943.   return FLUID_OK;
  1944. }
  1945. /**
  1946.  * Set SoundFont ID on a MIDI channel.
  1947.  * @param synth FluidSynth instance
  1948.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1949.  * @param sfont_id ID of a loaded SoundFont
  1950.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1951.  */
  1952. int
  1953. fluid_synth_sfont_select(fluid_synth_t* synth, int chan, unsigned int sfont_id)
  1954. {
  1955.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1956.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1957.   fluid_channel_set_sfont_bank_prog(synth->channel[chan], sfont_id, -1, -1);
  1958.   return FLUID_OK;
  1959. }
  1960. /**
  1961.  * Set the preset of a MIDI channel to an unassigned state.
  1962.  * @param synth FluidSynth instance
  1963.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1964.  * @return #FLUID_OK on success, #FLUID_FAILED otherwise
  1965.  * @since 1.1.1
  1966.  *
  1967.  * Note: Channel retains its SoundFont ID and bank numbers, while the program
  1968.  * number is set to an "unset" state.  MIDI program changes may re-assign a
  1969.  * preset if one matches.
  1970.  */
  1971. int
  1972. fluid_synth_unset_program (fluid_synth_t *synth, int chan)
  1973. {
  1974.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1975.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1976.   return fluid_synth_program_change (synth, chan, FLUID_UNSET_PROGRAM);
  1977. }
  1978. /**
  1979.  * Get current SoundFont ID, bank number and program number for a MIDI channel.
  1980.  * @param synth FluidSynth instance
  1981.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  1982.  * @param sfont_id Location to store SoundFont ID
  1983.  * @param bank_num Location to store MIDI bank number
  1984.  * @param preset_num Location to store MIDI program number
  1985.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  1986.  */
  1987. int
  1988. fluid_synth_get_program(fluid_synth_t* synth, int chan, unsigned int* sfont_id,
  1989.                         unsigned int* bank_num, unsigned int* preset_num)
  1990. {
  1991.   fluid_channel_t* channel;
  1992.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  1993.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  1994.   fluid_return_val_if_fail (sfont_id != NULL, FLUID_FAILED);
  1995.   fluid_return_val_if_fail (bank_num != NULL, FLUID_FAILED);
  1996.   fluid_return_val_if_fail (preset_num != NULL, FLUID_FAILED);
  1997.   channel = synth->channel[chan];
  1998.   fluid_channel_get_sfont_bank_prog(channel, (int *)sfont_id, (int *)bank_num,
  1999.                                     (int *)preset_num);
  2000.   /* 128 indicates that the preset is unset.  Set to 0 to be backwards compatible. */
  2001.   if (*preset_num == FLUID_UNSET_PROGRAM) *preset_num = 0;
  2002.   return FLUID_OK;
  2003. }
  2004. /**
  2005.  * Select an instrument on a MIDI channel by SoundFont ID, bank and program numbers.
  2006.  * @param synth FluidSynth instance
  2007.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  2008.  * @param sfont_id ID of a loaded SoundFont
  2009.  * @param bank_num MIDI bank number
  2010.  * @param preset_num MIDI program number
  2011.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  2012.  */
  2013. int
  2014. fluid_synth_program_select(fluid_synth_t* synth, int chan, unsigned int sfont_id,
  2015.    unsigned int bank_num, unsigned int preset_num)
  2016. {
  2017.   fluid_preset_t* preset = NULL;
  2018.   fluid_channel_t* channel;
  2019.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  2020.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  2021.   channel = synth->channel[chan];
  2022.   /* ++ Allocate preset */
  2023.   preset = fluid_synth_get_preset (synth, sfont_id, bank_num, preset_num);
  2024.   if (preset == NULL) {
  2025.     FLUID_LOG(FLUID_ERR,
  2026.       "There is no preset with bank number %d and preset number %d in SoundFont %d",
  2027.       bank_num, preset_num, sfont_id);
  2028.     return FLUID_FAILED;
  2029.   }
  2030.   /* Assign the new SoundFont ID, bank and program number to the channel */
  2031.   fluid_channel_set_sfont_bank_prog (channel, sfont_id, bank_num, preset_num);
  2032.   return fluid_synth_set_preset (synth, chan, preset);
  2033. }
  2034. /**
  2035.  * Select an instrument on a MIDI channel by SoundFont name, bank and program numbers.
  2036.  * @param synth FluidSynth instance
  2037.  * @param chan MIDI channel number (0 to MIDI channel count - 1)
  2038.  * @param sfont_name Name of a loaded SoundFont
  2039.  * @param bank_num MIDI bank number
  2040.  * @param preset_num MIDI program number
  2041.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  2042.  * @since 1.1.0
  2043.  */
  2044. int
  2045. fluid_synth_program_select_by_sfont_name (fluid_synth_t* synth, int chan,
  2046.                                           const char *sfont_name, unsigned int bank_num,
  2047.                                           unsigned int preset_num)
  2048. {
  2049.   fluid_preset_t* preset = NULL;
  2050.   fluid_channel_t* channel;
  2051.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  2052.   fluid_return_val_if_fail (chan >= 0 && chan < synth->midi_channels, FLUID_FAILED);
  2053.   fluid_return_val_if_fail (sfont_name != NULL, FLUID_FAILED);
  2054.   channel = synth->channel[chan];
  2055.   /* ++ Allocate preset */
  2056.   preset = fluid_synth_get_preset_by_sfont_name (synth, sfont_name, bank_num,
  2057.                                                  preset_num);
  2058.   if (preset == NULL) {
  2059.     FLUID_LOG(FLUID_ERR,
  2060.       "There is no preset with bank number %d and preset number %d in SoundFont %s",
  2061.       bank_num, preset_num, sfont_name);
  2062.     return FLUID_FAILED;
  2063.   }
  2064.   /* Assign the new SoundFont ID, bank and program number to the channel */
  2065.   fluid_channel_set_sfont_bank_prog (channel, fluid_sfont_get_id (preset->sfont),
  2066.                                      bank_num, preset_num);
  2067.   return fluid_synth_set_preset (synth, chan, preset);
  2068. }
  2069. /*
  2070.  * This function assures that every MIDI channel has a valid preset
  2071.  * (NULL is okay). This function is called after a SoundFont is
  2072.  * unloaded or reloaded.
  2073.  */
  2074. static void
  2075. fluid_synth_update_presets(fluid_synth_t* synth)
  2076. {
  2077.   fluid_channel_t *channel;
  2078.   fluid_preset_t *preset;
  2079.   int sfont, bank, prog;
  2080.   int chan;
  2081.   for (chan = 0; chan < synth->midi_channels; chan++) {
  2082.     channel = synth->channel[chan];
  2083.     fluid_channel_get_sfont_bank_prog (channel, &sfont, &bank, &prog);
  2084.     preset = fluid_synth_get_preset (synth, sfont, bank, prog);
  2085.     fluid_synth_set_preset (synth, chan, preset);
  2086.   }
  2087. }
  2088. /* Handler for synth.gain setting. */
  2089. static int
  2090. fluid_synth_update_gain(fluid_synth_t* synth, char* name, double value)
  2091. {
  2092.   fluid_synth_set_gain(synth, (float) value);
  2093.   return 0;
  2094. }
  2095. /**
  2096.  * Set synth output gain value.
  2097.  * @param synth FluidSynth instance
  2098.  * @param gain Gain value (function clamps value to the range 0.0 to 10.0)
  2099.  */
  2100. void
  2101. fluid_synth_set_gain(fluid_synth_t* synth, float gain)
  2102. {
  2103.   fluid_return_if_fail (synth != NULL);
  2104.   fluid_clip (gain, 0.0f, 10.0f);
  2105.   fluid_atomic_float_set (&synth->gain, gain);
  2106.   if (fluid_synth_should_queue (synth))
  2107.     fluid_synth_queue_int_event (synth, FLUID_EVENT_QUEUE_ELEM_UPDATE_GAIN, 0); /* Integer value not actually used */
  2108.   else fluid_synth_update_gain_LOCAL (synth);
  2109. }
  2110. /* Called by synthesis thread to update the gain in all voices */
  2111. static void
  2112. fluid_synth_update_gain_LOCAL(fluid_synth_t* synth)
  2113. {
  2114.   fluid_voice_t *voice;
  2115.   float gain;
  2116.   int i;
  2117.   gain = fluid_atomic_float_get (&synth->gain);
  2118.   for (i = 0; i < synth->polyphony; i++)
  2119.   {
  2120.     voice = synth->voice[i];
  2121.     if (_PLAYING (voice)) fluid_voice_set_gain (voice, gain);
  2122.   }
  2123. }
  2124. /**
  2125.  * Get synth output gain value.
  2126.  * @param synth FluidSynth instance
  2127.  * @return Synth gain value (0.0 to 10.0)
  2128.  */
  2129. float
  2130. fluid_synth_get_gain(fluid_synth_t* synth)
  2131. {
  2132.   fluid_return_val_if_fail (synth != NULL, 0.0);
  2133.   return fluid_atomic_float_get (&synth->gain);
  2134. }
  2135. /*
  2136.  * Handler for synth.polyphony setting.
  2137.  */
  2138. static int
  2139. fluid_synth_update_polyphony(fluid_synth_t* synth, char* name, int value)
  2140. {
  2141.   fluid_synth_set_polyphony(synth, value);
  2142.   return 0;
  2143. }
  2144. /**
  2145.  * Set synthesizer polyphony (max number of voices).
  2146.  * @param synth FluidSynth instance
  2147.  * @param polyphony Polyphony to assign
  2148.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  2149.  * @since 1.0.6
  2150.  */
  2151. int
  2152. fluid_synth_set_polyphony(fluid_synth_t* synth, int polyphony)
  2153. {
  2154.   fluid_return_val_if_fail (synth != NULL, FLUID_FAILED);
  2155.   fluid_return_val_if_fail (polyphony >= 16 && polyphony <= synth->nvoice, FLUID_FAILED);
  2156.   fluid_atomic_int_set (&synth->shadow_polyphony, polyphony);
  2157.   if (fluid_synth_should_queue (synth))
  2158.     return fluid_synth_queue_int_event (synth, FLUID_EVENT_QUEUE_ELEM_POLYPHONY, 0);
  2159.   else return fluid_synth_update_polyphony_LOCAL (synth);
  2160. }
  2161. /* Called by synthesis thread to update the polyphony value */
  2162. static int
  2163. fluid_synth_update_polyphony_LOCAL(fluid_synth_t* synth)
  2164. {
  2165.   fluid_voice_t *voice;
  2166.   int i;
  2167.   synth->polyphony = fluid_atomic_int_get (&synth->shadow_polyphony);
  2168.   /* turn off any voices above the new limit */
  2169.   for (i = synth->polyphony; i < synth->nvoice; i++)
  2170.   {
  2171.     voice = synth->voice[i];
  2172.     if (_PLAYING (voice)) fluid_voice_off (voice);
  2173.   }
  2174.   return FLUID_OK;
  2175. }
  2176. /**
  2177.  * Get current synthesizer polyphony (max number of voices).
  2178.  * @param synth FluidSynth instance
  2179.  * @return Synth polyphony value.
  2180.  * @since 1.0.6
  2181.  */
  2182. int
  2183. fluid_synth_get_polyphony(fluid_synth_t* synth)
  2184. {
  2185.   return fluid_atomic_int_get (&synth->shadow_polyphony);
  2186. }
  2187. /**
  2188.  * Get current number of active voices.
  2189.  * @param synth FluidSynth instance
  2190.  * @return Number of currently active voices.
  2191.  * @since 1.1.0
  2192.  *
  2193.  * Note: To generate accurate continuous statistics of the voice count, caller
  2194.  * should ensure this function is called synchronously with the audio synthesis
  2195.  * process.  This can be done in the new_fluid_audio_driver2() audio callback
  2196.  * function for example.
  2197.  */
  2198. int
  2199. fluid_synth_get_active_voice_count(fluid_synth_t* synth)
  2200. {
  2201.   return fluid_atomic_int_get (&synth->active_voice_count);
  2202. }
  2203. /**
  2204.  * Get the internal synthesis buffer size value.
  2205.  * @param synth FluidSynth instance
  2206.  * @return Internal buffer size in audio frames.
  2207.  *
  2208.  * Audio is synthesized this number of frames at a time.  Defaults to 64 frames.
  2209.  */
  2210. int
  2211. fluid_synth_get_internal_bufsize(fluid_synth_t* synth)
  2212. {
  2213.   return FLUID_BUFSIZE;
  2214. }
  2215. /**
  2216.  * Resend a bank select and a program change for every channel.
  2217.  * @param synth FluidSynth instance
  2218.  * @return FLUID_OK on success, FLUID_FAILED otherwise
  2219.  *
  2220.  * This function is called mainly after a SoundFont has been loaded,
  2221.  * unloaded or reloaded.
  2222.  */
  2223. int
  2224. fluid_synth_program_reset(fluid_synth_t* synth)
  2225. {
  2226.   int i, prog;
  2227.   /* try to set the correct presets */
  2228.   for (i = 0; i < synth->midi_channels; i++){
  2229.     fluid_channel_get_sfont_bank_prog (synth->channel[i], NULL, NULL, &prog);
  2230.     fluid_synth_program_change(synth, i, prog);
  2231.   }
  2232.   return FLUID_OK;
  2233. }
  2234. /**
  2235.  * Synthesize a block of floating point audio to audio buffers.
  2236.  * @param synth FluidSynth instance
  2237.  * @param len Count of audio frames to synthesize
  2238.  * @param left Array of floats to store left channel of audio (len in size)
  2239.  * @param right Array of floats to store right channel of audio (len in size)
  2240.  * @param fx_left Not currently used
  2241.  * @param fx_right Not currently used
  2242.  * @return FLUID_OK on success, FLUID_FAIL otherwise
  2243.  *
  2244.  * NOTE: Should only be called from synthesis thread.
  2245.  */
  2246. int
  2247. fluid_synth_nwrite_float(fluid_synth_t* synth, int len,
  2248.                          float** left, float** right,
  2249.                          float** fx_left, float** fx_right)
  2250. {
  2251.   fluid_real_t** left_in = synth->left_buf;
  2252.   fluid_real_t** right_in = synth->right_buf;
  2253.   double time = fluid_utime();
  2254.   int i, num, available, count, bytes;
  2255.   float cpu_load;
  2256.   /* First, take what's still available in the buffer */
  2257.   count = 0;
  2258.   num = synth->cur;
  2259.   if (synth->cur < FLUID_BUFSIZE) {
  2260.     available = FLUID_BUFSIZE - synth->cur;
  2261.     num = (available > len)? len : available;
  2262.     bytes = num * sizeof(float);
  2263.     for (i = 0; i < synth->audio_channels; i++) {
  2264.       FLUID_MEMCPY(left[i], left_in[i] + synth->cur, bytes);
  2265.       FLUID_MEMCPY(right[i], right_in[i] + synth->cur, bytes);
  2266.     }
  2267.     count += num;
  2268.     num += synth->cur; /* if we're now done, num becomes the new synth->cur below */
  2269.   }
  2270.   /* Then, run one_block() and copy till we have 'len' samples  */
  2271.   while (count < len) {
  2272.     fluid_synth_one_block(synth, 1);
  2273.     num = (FLUID_BUFSIZE > len - count)? len - count : FLUID_BUFSIZE;
  2274.     bytes = num * sizeof(float);
  2275.     for (i = 0; i < synth->audio_channels; i++) {
  2276.       FLUID_MEMCPY(left[i] + count, left_in[i], bytes);
  2277.       FLUID_MEMCPY(right[i] + count, right_in[i], bytes);
  2278.     }
  2279.     count += num;
  2280.   }
  2281.   synth->cur = num;
  2282.   time = fluid_utime() - time;
  2283.   cpu_load = 0.5 * (synth->cpu_load + time * synth->sample_rate / len / 10000.0);
  2284.   fluid_atomic_float_set (&synth->cpu_load, cpu_load);
  2285.   return FLUID_OK;
  2286. }
  2287. /**
  2288.  * Synthesize floating point audio to audio buffers.
  2289.  * @param synth FluidSynth instance
  2290.  * @param len Count of audio frames to synthesize
  2291.  * @param nin Ignored
  2292.  * @param in Ignored
  2293.  * @param nout Count of arrays in 'out'
  2294.  * @param out Array of arrays to store audio to
  2295.  * @return FLUID_OK on success, FLUID_FAIL otherwise
  2296.  *
  2297.  * This function implements the default interface defined in fluidsynth/audio.h.
  2298.  * NOTE: Should only be called from synthesis thread.
  2299.  */
  2300. /*
  2301.  * FIXME: Currently if nout != 2 memory allocation will occur!
  2302.  */
  2303. int
  2304. fluid_synth_process(fluid_synth_t* synth, int len, int nin, float** in,
  2305.                     int nout, float** out)
  2306. {
  2307.   if (nout==2) {
  2308.     return fluid_synth_write_float(synth, len, out[0], 0, 1, out[1], 0, 1);
  2309.   }
  2310.   else {
  2311.     float **left, **right;
  2312.     int i;
  2313.     left = FLUID_ARRAY(float*, nout/2);
  2314.     right = FLUID_ARRAY(float*, nout/2);
  2315.     for(i=0; i<nout/2; i++) {
  2316.       left[i] = out[2*i];
  2317.       right[i] = out[2*i+1];
  2318.     }
  2319.     fluid_synth_nwrite_float(synth, len, left, right, NULL, NULL);
  2320.     FLUID_FREE(left);
  2321.     FLUID_FREE(right);
  2322.     return FLUID_OK;
  2323.   }
  2324. }
  2325. /**
  2326.  * Synthesize a block of floating point audio samples to audio buffers.
  2327.  * @param synth FluidSynth instance
  2328.  * @param len Count of audio frames to synthesize
  2329.  * @param lout Array of floats to store left channel of audio
  2330.  * @param loff Offset index in 'lout' for first sample
  2331.  * @param lincr Increment between samples stored to 'lout'
  2332.  * @param rout Array of floats to store right channel of audio
  2333.  * @param roff Offset index in 'rout' for first sample
  2334.  * @param rincr Increment between samples stored to 'rout'
  2335.  * @return FLUID_OK on success, FLUID_FAIL otherwise
  2336.  *
  2337.  * Useful for storing interleaved stereo (lout = rout, loff = 0, roff = 1,
  2338.  * lincr = 2, rincr = 2).
  2339.  *
  2340.  * NOTE: Should only be called from synthesis thread.
  2341.  */
  2342. int
  2343. fluid_synth_write_float(fluid_synth_t* synth, int len,
  2344.                         void* lout, int loff, int lincr,
  2345.                         void* rout, int roff, int rincr)
  2346. {
  2347.   int i, j, k, l;
  2348.   float* left_out = (float*) lout;
  2349.   float* right_out = (float*) rout;
  2350.   fluid_real_t* left_in = synth->left_buf[0];
  2351.   fluid_real_t* right_in = synth->right_buf[0];
  2352.   double time = fluid_utime();
  2353.   float cpu_load;
  2354.   l = synth->cur;
  2355.   for (i = 0, j = loff, k = roff; i < len; i++, l++, j += lincr, k += rincr) {
  2356.     /* fill up the buffers as needed */
  2357.       if (l == FLUID_BUFSIZE) {
  2358. fluid_synth_one_block(synth, 0);
  2359. l = 0;
  2360.       }
  2361.       left_out[j] = (float) left_in[l];
  2362.       right_out[k] = (float) right_in[l];
  2363.   }
  2364.   synth->cur = l;
  2365.   time = fluid_utime() - time;
  2366.   cpu_load = 0.5 * (synth->cpu_load + time * synth->sample_rate / len / 10000.0);
  2367.   fluid_atomic_float_set (&synth->cpu_load, cpu_load);
  2368.   return FLUID_OK;
  2369. }
  2370. #define DITHER_SIZE 48000
  2371. #define DITHER_CHANNELS 2
  2372. static float rand_table[DITHER_CHANNELS][DITHER_SIZE];