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

midi

开发平台:

C/C++

  1. #include <sndfile.h>
  2. #include "fluidsynth_jni.h"
  3. const int fluid_jni_maxsamples = 1024;
  4. static int _initialized = 0;
  5. static fluid_settings_t* _settings = 0;
  6. static fluid_synth_t* _synth = 0;
  7. static fluid_audio_driver_t* _adriver = 0;
  8. static fluid_midi_driver_t* _mdriver = 0;
  9. static fluid_sfont_t* _sfloader = 0;
  10. static fluid_sample_t* _sample[fluid_jni_maxsamples];
  11. void fluid_jni_init()
  12. {
  13.   if (_initialized == 0) {
  14.     _initialized++;
  15.     for (int i = 0; i < fluid_jni_maxsamples; i++) {
  16.       _sample[i] = 0;
  17.     }
  18.   }
  19. }
  20. int fluid_jni_new_synth()
  21. {
  22.   if (_synth != 0) {
  23.     return -1;
  24.   }
  25.   fluid_jni_init();
  26.   _settings = new_fluid_settings();
  27.   if (_settings == 0) {
  28.     goto error_recovery;
  29.   }
  30.   
  31.   fluid_settings_setstr(_settings, "midi.driver", "midishare");
  32.   _synth = new_fluid_synth(_settings);
  33.   if (_synth == 0) {
  34.     goto error_recovery;
  35.   }
  36.   
  37.   _adriver = new_fluid_audio_driver(_settings, _synth);
  38.   if (_adriver == 0) {
  39.     goto error_recovery;
  40.   }
  41.   
  42.   _mdriver = new_fluid_midi_driver(_settings, fluid_synth_handle_midi_event, _synth);
  43.   if (_mdriver == 0) {
  44.     goto error_recovery;
  45.   }
  46.   
  47.   _sfloader = fluid_ramsfont_create_sfont();
  48.   if (_sfloader == 0) {
  49.     goto error_recovery;
  50.   }
  51.   fluid_ramsfont_set_name((fluid_ramsfont_t*) _sfloader->data, "Tada");
  52.   
  53.   fluid_synth_add_sfont(_synth, _sfloader);
  54.   return 0;
  55.  error_recovery:
  56.   fluid_jni_delete_synth(0);
  57.   return -1;
  58. }
  59. int fluid_jni_delete_synth(int num)
  60. {
  61.   if (_mdriver) {
  62.     delete_fluid_midi_driver(_mdriver);
  63.     _mdriver = 0;
  64.   }
  65.   if (_adriver) {
  66.     delete_fluid_audio_driver(_adriver);
  67.     _adriver = 0;
  68.   }
  69.   if (_synth) {
  70.     delete_fluid_synth(_synth);
  71.     _synth = 0;
  72.   }
  73.   if (_settings) {
  74.     delete_fluid_settings(_settings);
  75.     _settings = 0;
  76.   }
  77.   return 0;
  78. }
  79. int fluid_jni_sfload(const char*  filename)
  80. {
  81.   if (_synth == 0) {
  82.     return -1;
  83.   }
  84.   fluid_synth_sfload(_synth, filename, 1);
  85.   return 0;
  86. }
  87. int fluid_jni_add(int samplenum, int bank, int preset, int lokey, int hikey)
  88. {
  89.   if (_synth == 0) {
  90.     return -1;
  91.   }
  92.   if (_sfloader == 0) {
  93.     return -1;
  94.   }
  95.   fluid_sample_t* sample = fluid_jni_get_sample(samplenum);
  96.   if (sample == 0) {
  97.     return -2;
  98.   }
  99.   
  100.   
  101.   
  102.   if (fluid_ramsfont_add_izone((fluid_ramsfont_t*) _sfloader->data, bank, 
  103.        preset, sample, lokey, hikey) != 0) {
  104.     
  105.   
  106.     return -3;
  107.   }
  108.   
  109.   
  110.   
  111.   fluid_synth_program_select(_synth, 0, _sfloader->id, bank, preset);
  112.   return 0;
  113. }
  114. int fluid_jni_remove(int samplenum, int bank, int preset)
  115. {
  116.   if (_synth == 0) {
  117.     return -1;
  118.   }
  119.   fluid_sample_t* sample = fluid_jni_get_sample(samplenum);
  120.   if (sample == 0) {
  121.     return -2;
  122.   }
  123.   if (fluid_ramsfont_remove_izone((fluid_ramsfont_t*) _sfloader->data, 
  124.   bank, preset, sample) != 0) {
  125.     return -3;
  126.   }
  127.  
  128.   return 0;
  129. }
  130. int fluid_jni_get_sample_num()
  131. {
  132.   for (int i = 0; i < fluid_jni_maxsamples; i++) {
  133.     if (_sample[i] == 0) {
  134.       return i;
  135.     }
  136.   }
  137.   return -1;
  138. }
  139. int fluid_jni_new_sample(const char* filename, int rootkey)
  140. {
  141.   SF_INFO sfinfo;
  142.   SNDFILE* sndfile = 0;
  143.   fluid_sample_t* sample = 0;
  144.   short *data = 0;
  145.   sf_count_t count;
  146.   int err;
  147.   
  148.   int num = fluid_jni_get_sample_num();
  149.   if (num < 0) {
  150.     return -1;
  151.   }
  152.   
  153.   
  154.   sndfile = sf_open(filename, SFM_READ, &sfinfo) ;
  155.   if (sndfile == 0) {
  156.     return -2;
  157.   }
  158.   
  159.   //printf("fluid_jni_new_sample: channels=%i, srate=%i, frames=%in", 
  160. //  sfinfo.channels, sfinfo.samplerate, sfinfo.frames);
  161.   
  162.   
  163.   if (sfinfo.channels != 1) {
  164.     err = -3;
  165.     goto error_recovery;
  166.   }
  167.   if (sfinfo.samplerate != 44100) {
  168.     err = -4;
  169.     goto error_recovery;
  170.   }
  171.   sample = new_fluid_ramsample();
  172.   if (sample == 0) {
  173.     err = -5;
  174.     goto error_recovery;
  175.   }
  176.   data = new short[sfinfo.frames];
  177.   if (data == 0) {
  178.     err = -6;
  179.     goto error_recovery;
  180.   }
  181.  // printf("fluid_jni_new_sample 2n");
  182.   
  183.   count = sf_readf_short(sndfile, data, sfinfo.frames);
  184.   if (count != sfinfo.frames) {
  185.     err = -7;
  186.     goto error_recovery;
  187.   }
  188.   //printf("fluid_jni_new_sample 3n");
  189.   
  190.   if (fluid_sample_set_sound_data(sample, data,  sfinfo.frames, 1, rootkey) != 0) {
  191.     err = -8;
  192.     goto error_recovery;
  193.   }
  194.   //printf("fluid_jni_new_sample 4: sample=%pn", sample);
  195.   
  196.   _sample[num] = sample;
  197.   sf_close(sndfile);
  198.   delete data;
  199.   return num;
  200.   
  201.  error_recovery:
  202.   
  203.   if (sndfile) {
  204.     sf_close(sndfile);
  205.   }
  206.   if (sample) {
  207.     delete_fluid_ramsample(sample);
  208.   }
  209.   if (data) {
  210.     delete data;
  211.   }
  212.   return err;
  213. }
  214. fluid_sample_t* fluid_jni_get_sample(int num)
  215. {
  216.   if ((num >= 0) 
  217.       && (num < fluid_jni_maxsamples) 
  218.       && (_sample[num] != 0)) {
  219.     return _sample[num];
  220.   }
  221.   return 0;
  222. }
  223. int fluid_jni_delete_sample(int num)
  224. {
  225.   if ((num >= 0) 
  226.       && (num < fluid_jni_maxsamples) 
  227.       && (_sample[num] != 0)) {
  228.     delete_fluid_ramsample(_sample[num]);
  229.     _sample[num] = 0;
  230.   }
  231.   return 0;
  232. }