[beast: 49/73] BSE: SF2: use std::vector for oscs|channel_map instead of manual allocation
- From: Tim Janik <timj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [beast: 49/73] BSE: SF2: use std::vector for oscs|channel_map instead of manual allocation
- Date: Thu, 23 Mar 2017 21:45:47 +0000 (UTC)
commit fc0b11c9cc75f4ce201ec81dc12d56eee6263adb
Author: Stefan Westerfeld <stefan space twc de>
Date: Mon Dec 5 15:25:37 2016 +0100
BSE: SF2: use std::vector for oscs|channel_map instead of manual allocation
bse/bsesoundfontosc.cc | 24 ++++++++++++++----------
bse/bsesoundfontrepo.cc | 36 ++++++++++++++----------------------
bse/bsesoundfontrepo.hh | 10 ++++++----
3 files changed, 34 insertions(+), 36 deletions(-)
---
diff --git a/bse/bsesoundfontosc.cc b/bse/bsesoundfontosc.cc
index 8bdbeb1..4d565b8 100644
--- a/bse/bsesoundfontosc.cc
+++ b/bse/bsesoundfontosc.cc
@@ -440,10 +440,9 @@ sound_font_osc_process (BseModule *module,
Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
fluid_synth_t *fluid_synth = bse_sound_font_repo_lock_fluid_synth (sfrepo);
- guint i;
if (flmod->config.update_preset != flmod->last_update_preset)
{
- fluid_synth_program_select (fluid_synth, flmod->config.sfrepo->channel_map[flmod->config.osc_id],
+ fluid_synth_program_select (fluid_synth, sfrepo_impl->oscs[flmod->config.osc_id].channel,
flmod->config.sfont_id, flmod->config.bank,
flmod->config.program);
flmod->last_update_preset = flmod->config.update_preset;
}
@@ -451,8 +450,9 @@ sound_font_osc_process (BseModule *module,
if (sfrepo->channel_values_tick_stamp != now_tick_stamp)
process_fluid_L (sfrepo, fluid_synth, now_tick_stamp);
- float *left_output = &sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].values_left[0];
- float *right_output =
&sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].values_right[0];
+ auto& cstate = sfrepo_impl->channel_state[sfrepo_impl->oscs[flmod->config.osc_id].channel];
+ float *left_output = &cstate.values_left[0];
+ float *right_output = &cstate.values_right[0];
int delta = bse_module_tick_stamp (module) - now_tick_stamp;
if (delta + n_values <= bse_engine_block_size()) /* paranoid check, should always pass */
@@ -468,13 +468,14 @@ sound_font_osc_process (BseModule *module,
}
if (BSE_MODULE_OSTREAM (module, BSE_SOUND_FONT_OSC_OCHANNEL_DONE_OUT).connected)
{
+ guint i;
for (i = 0; i < n_values && left_output[i] == 0.0 && right_output[i] == 0.0; i++)
;
if (i == n_values)
- sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].n_silence_samples += n_values;
+ cstate.n_silence_samples += n_values;
else
- sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].n_silence_samples = 0;
- float done = (sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].n_silence_samples
flmod->config.silence_bound && sfrepo->fluid_events == NULL) ? 1.0 : 0.0;
+ cstate.n_silence_samples = 0;
+ float done = (cstate.n_silence_samples > flmod->config.silence_bound && sfrepo->fluid_events == NULL)
? 1.0 : 0.0;
BSE_MODULE_OSTREAM (module, BSE_SOUND_FONT_OSC_OCHANNEL_DONE_OUT).values = bse_engine_const_values
(done);
}
@@ -502,6 +503,7 @@ sound_font_osc_process_midi (gpointer null,
{
SoundFontOscModule *flmod = (SoundFontOscModule *) module->user_data;
bse_sound_font_repo_lock_fluid_synth (flmod->config.sfrepo);
+ Bse::SoundFontRepoImpl *sfrepo_impl = flmod->config.sfrepo->as<Bse::SoundFontRepoImpl *>();
int note = bse_note_from_freq (Bse::MusicalTuning::OD_12_TET, event->data.note.frequency);
BseFluidEvent *fluid_event = NULL;
switch (event->status)
@@ -553,7 +555,7 @@ sound_font_osc_process_midi (gpointer null,
if (fluid_event)
{
fluid_event->tick_stamp = event->delta_time;
- fluid_event->channel = flmod->config.sfrepo->channel_map[flmod->config.osc_id];
+ fluid_event->channel = sfrepo_impl->oscs[flmod->config.osc_id].channel;
flmod->config.sfrepo->fluid_events = sfi_ring_insert_sorted (flmod->config.sfrepo->fluid_events,
fluid_event, event_cmp, NULL);
}
bse_sound_font_repo_unlock_fluid_synth (flmod->config.sfrepo);
@@ -579,10 +581,11 @@ event_handler_setup_func (BseModule *module,
/* setup program before first midi event */
SoundFontOscModule *flmod = (SoundFontOscModule *) module->user_data;
+ Bse::SoundFontRepoImpl *sfrepo_impl = flmod->config.sfrepo->as<Bse::SoundFontRepoImpl *>();
BseFluidEvent *fluid_event = g_new0 (BseFluidEvent, 1);
fluid_event->command = BSE_FLUID_SYNTH_PROGRAM_SELECT;
- fluid_event->channel = flmod->config.sfrepo->channel_map[flmod->config.osc_id];
+ fluid_event->channel = sfrepo_impl->oscs[flmod->config.osc_id].channel;
fluid_event->arg1 = flmod->config.bank;
fluid_event->arg2 = flmod->config.program;
fluid_event->sfont_id = flmod->config.sfont_id;
@@ -645,6 +648,7 @@ bse_sound_font_osc_context_dismiss (BseSource *source,
BseTrans *trans)
{
BseSoundFontOsc *self = BSE_SOUND_FONT_OSC (source);
+ Bse::SoundFontRepoImpl *sfrepo_impl = self->config.sfrepo->as<Bse::SoundFontRepoImpl *>();
BseModule *module = bse_source_get_context_omodule (source, context_handle);
BseMidiContext mc = bse_snet_get_midi_context (bse_item_get_snet (BSE_ITEM (source)), context_handle);
bse_midi_receiver_remove_event_handler (mc.midi_receiver,
@@ -660,7 +664,7 @@ bse_sound_font_osc_context_dismiss (BseSource *source,
{
SfiRing *next_node = sfi_ring_walk (node, fluid_events);
BseFluidEvent *event = (BseFluidEvent *) node->data;
- if (event->channel == self->config.sfrepo->channel_map[self->config.osc_id])
+ if (event->channel == sfrepo_impl->oscs[self->config.osc_id].channel)
{
g_free (event);
fluid_events = sfi_ring_remove_node (fluid_events, node);
diff --git a/bse/bsesoundfontrepo.cc b/bse/bsesoundfontrepo.cc
index 1686b44..ba7d99b 100644
--- a/bse/bsesoundfontrepo.cc
+++ b/bse/bsesoundfontrepo.cc
@@ -102,10 +102,6 @@ bse_sound_font_repo_init (BseSoundFontRepo *sfrepo)
{
new (&sfrepo->fluid_synth_mutex) Bse::Mutex();
- sfrepo->n_oscs = 0;
- sfrepo->oscs = NULL;
- sfrepo->channel_map = NULL;
-
sfrepo->fluid_settings = new_fluid_settings();
sfrepo->fluid_synth = new_fluid_synth (sfrepo->fluid_settings);
sfrepo->fluid_events = NULL;
@@ -142,11 +138,11 @@ bse_sound_font_repo_prepare (BseSource *source)
BseSoundFontRepo *sfrepo = BSE_SOUND_FONT_REPO (source);
Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
- guint i, channels_required = 0;
- for (i = 0; i < sfrepo->n_oscs; i++)
+ guint channels_required = 0;
+ for (auto& o : sfrepo_impl->oscs)
{
- if (sfrepo->oscs[i])
- sfrepo->channel_map[i] = channels_required++;
+ if (o.osc)
+ o.channel = channels_required++;
}
guint mix_freq = bse_engine_sample_freq();
if (sfrepo->n_fluid_channels != channels_required || sfrepo->fluid_mix_freq != mix_freq)
@@ -213,10 +209,6 @@ bse_sound_font_repo_dispose (GObject *object)
delete_fluid_settings (sfrepo->fluid_settings);
sfrepo->fluid_settings = NULL;
}
- g_free (sfrepo->channel_map);
- sfrepo->channel_map = NULL;
- g_free (sfrepo->oscs);
- sfrepo->oscs = NULL;
sfrepo->n_fluid_channels = 0;
if (sfrepo->fluid_events != NULL)
@@ -346,28 +338,28 @@ int
bse_sound_font_repo_add_osc (BseSoundFontRepo *sfrepo,
BseSoundFontOsc *osc)
{
- guint i;
- for (i = 0; i < sfrepo->n_oscs; i++)
+ Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
+ for (guint i = 0; i < sfrepo_impl->oscs.size(); i++)
{
- if (sfrepo->oscs[i] == 0)
+ if (!sfrepo_impl->oscs[i].osc)
{
- sfrepo->oscs[i] = osc;
+ sfrepo_impl->oscs[i].osc = osc;
return i;
}
}
- sfrepo->oscs = (BseSoundFontOsc **)g_realloc (sfrepo->oscs, sizeof (BseSoundFontOsc *) * (i + 1));
- sfrepo->oscs[i] = osc;
- sfrepo->channel_map = (guint *) g_realloc (sfrepo->channel_map, sizeof (guint) * (i + 1));
- return sfrepo->n_oscs++;
+ sfrepo_impl->oscs.push_back ({ osc, 0 });
+ return sfrepo_impl->oscs.size() - 1;
}
void
bse_sound_font_repo_remove_osc (BseSoundFontRepo *sfrepo,
guint osc_id)
{
- g_return_if_fail (osc_id < sfrepo->n_oscs);
+ Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
+
+ g_return_if_fail (osc_id < sfrepo_impl->oscs.size());
- sfrepo->oscs[osc_id] = 0;
+ sfrepo_impl->oscs[osc_id].osc = nullptr;
}
namespace Bse {
diff --git a/bse/bsesoundfontrepo.hh b/bse/bsesoundfontrepo.hh
index 5bb5aaf..58ed04b 100644
--- a/bse/bsesoundfontrepo.hh
+++ b/bse/bsesoundfontrepo.hh
@@ -35,10 +35,6 @@ struct BseSoundFontRepo : BseSuper {
guint n_fluid_channels;
guint64 channel_values_tick_stamp;
- guint n_oscs;
- BseSoundFontOsc **oscs; /* [0..n_oscs-1] */
- guint *channel_map; /* [0..n_oscs-1] */
-
int n_channel_oscs_active; /* SoundFontOscs with an active module in the engine thread
*/
GList *sound_fonts;
@@ -69,6 +65,12 @@ public:
};
std::vector<ChannelState> channel_state; /* [0..n_fluid_channels-1] */
+ struct Osc {
+ BseSoundFontOsc *osc;
+ guint channel;
+ };
+ std::vector<Osc> oscs;
+
protected:
virtual ~SoundFontRepoImpl ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]