--- linuxsampler/trunk/src/engines/sfz/sfz.h 2010/04/11 10:20:24 2082 +++ linuxsampler/trunk/src/engines/sfz/sfz.h 2010/05/15 09:02:31 2091 @@ -237,6 +237,47 @@ EG(); }; + // Fixed size array with copy-on-write semantics + template + class Array + { + private: + struct Rep { + int refcount; + T a[128]; + + Rep() : refcount(1) { } + static void release(Rep* rep) { + if (!--rep->refcount) delete rep; + } + } *ptr; + public: + Array() : ptr(0) { } + ~Array() { Rep::release(ptr); } + + Array& operator=(const Array& array) { + if (this != &array) { + ptr = array.ptr; + if (ptr) ptr->refcount++; + } + return *this; + } + + const T& operator[](int i) const { return ptr->a[i]; } + + void set(int i, const T& v) { + if (!ptr) { + ptr = new Rep; + } else if (ptr->refcount > 1 && ptr->a[i] != v) { + Rep* newptr = new Rep(*ptr); + newptr->refcount = 1; + Rep::release(ptr); + ptr = newptr; + } + ptr->a[i] = v; + } + }; + ///////////////////////////////////////////////////////////// // class Definition @@ -254,7 +295,7 @@ int lochan; int hichan; int lokey; int hikey; int lovel; int hivel; - std::vector locc; std::vector hicc; + Array locc; Array hicc; int lobend; int hibend; int lobpm; int hibpm; int lochanaft; int hichanaft; @@ -266,8 +307,8 @@ int seq_length; int seq_position; - std::vector start_locc; std::vector start_hicc; - std::vector stop_locc; std::vector stop_hicc; + Array start_locc; Array start_hicc; + Array stop_locc; Array stop_hicc; int sw_lokey; int sw_hikey; int sw_last; @@ -282,16 +323,16 @@ optional off_by; off_mode_t off_mode; - std::vector on_locc; std::vector on_hicc; + Array on_locc; Array on_hicc; // sample player optional count; - optional delay; optional delay_random; std::vector > delay_oncc; + optional delay; optional delay_random; Array > delay_oncc; optional delay_beats; optional stop_beats; - optional delay_samples; std::vector > delay_samples_oncc; + optional delay_samples; Array > delay_samples_oncc; optional end; optional loop_crossfade; - optional offset; optional offset_random; std::vector > offset_oncc; + optional offset; optional offset_random; Array > offset_oncc; loop_mode_t loop_mode; optional loop_start; optional loop_end; optional sync_beats; @@ -302,17 +343,17 @@ float pan; float width; float position; - float amp_keytrack; int amp_keycenter; float amp_veltrack; std::vector amp_velcurve; float amp_random; + float amp_keytrack; int amp_keycenter; float amp_veltrack; Array amp_velcurve; float amp_random; float rt_decay; - std::vector gain_oncc; + Array gain_oncc; int xfin_lokey; int xfin_hikey; int xfout_lokey; int xfout_hikey; curve_t xf_keycurve; int xfin_lovel; int xfin_hivel; int xfout_lovel; int xfout_hivel; curve_t xf_velcurve; - std::vector xfin_locc; std::vector xfin_hicc; - std::vector xfout_locc; std::vector xfout_hicc; + Array xfin_locc; Array xfin_hicc; + Array xfout_locc; Array xfout_hicc; curve_t xf_cccurve; // pitch @@ -324,17 +365,17 @@ // filter filter_t fil_type; filter_t fil2_type; optional cutoff; optional cutoff2; - std::vector cutoff_oncc; std::vector cutoff2_oncc; - std::vector cutoff_smoothcc; std::vector cutoff2_smoothcc; - std::vector cutoff_stepcc; std::vector cutoff2_stepcc; - std::vector cutoff_curvecc; std::vector cutoff2_curvecc; + Array cutoff_oncc; Array cutoff2_oncc; + Array cutoff_smoothcc; Array cutoff2_smoothcc; + Array cutoff_stepcc; Array cutoff2_stepcc; + Array cutoff_curvecc; Array cutoff2_curvecc; int cutoff_chanaft; int cutoff2_chanaft; int cutoff_polyaft; int cutoff2_polyaft; float resonance; float resonance2; - std::vector resonance_oncc; std::vector resonance2_oncc; - std::vector resonance_smoothcc; std::vector resonance2_smoothcc; - std::vector resonance_stepcc; std::vector resonance2_stepcc; - std::vector resonance_curvecc; std::vector resonance2_curvecc; + Array resonance_oncc; Array resonance2_oncc; + Array resonance_smoothcc; Array resonance2_smoothcc; + Array resonance_stepcc; Array resonance2_stepcc; + Array resonance_curvecc; Array resonance2_curvecc; int fil_keytrack; int fil2_keytrack; int fil_keycenter; int fil2_keycenter; int fil_veltrack; int fil2_veltrack; @@ -342,12 +383,12 @@ // per voice equalizer float eq1_freq; float eq2_freq; float eq3_freq; - std::vector eq1_freq_oncc; std::vector eq2_freq_oncc; std::vector eq3_freq_oncc; + Array eq1_freq_oncc; Array eq2_freq_oncc; Array eq3_freq_oncc; float eq1_vel2freq; float eq2_vel2freq; float eq3_vel2freq; float eq1_bw; float eq2_bw; float eq3_bw; - std::vector eq1_bw_oncc; std::vector eq2_bw_oncc; std::vector eq3_bw_oncc; + Array eq1_bw_oncc; Array eq2_bw_oncc; Array eq3_bw_oncc; float eq1_gain; float eq2_gain; float eq3_gain; - std::vector eq1_gain_oncc; std::vector eq2_gain_oncc; std::vector eq3_gain_oncc; + Array eq1_gain_oncc; Array eq2_gain_oncc; Array eq3_gain_oncc; float eq1_vel2gain; float eq2_vel2gain; float eq3_vel2gain; //Deprecated (from version 1)