Changeset 38741 for platform/foobar2000
- Timestamp:
- 12/26/10 20:40:31 (2 years ago)
- Files:
-
- 1 modified
-
platform/foobar2000/trunk/foo_loop/sli_loop.cpp (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
platform/foobar2000/trunk/foo_loop/sli_loop.cpp
r38737 r38741 18 18 19 19 #define SLI_FLAGS 16 20 typedef unsigned int t_sli_value; 20 21 #define SLI_MIN_FLAG_VALUE 0 21 22 #define SLI_MAX_FLAG_VALUE 9999 … … 35 36 loop_condition(const char * confname, const char * symbol, bool is_valid) : 36 37 confname(confname), symbol(symbol), is_valid(is_valid) {} 37 virtual bool check( unsigned int a, unsigned intb) = 0;38 virtual bool check(t_sli_value a, t_sli_value b) = 0; 38 39 }; 39 40 … … 41 42 public: 42 43 loop_condition_no() : loop_condition("no", NULL, false) {}; 43 virtual bool check( unsigned int a, unsigned intb) { return true; }44 virtual bool check(t_sli_value a, t_sli_value b) { return true; } 44 45 }; 45 46 … … 48 49 public: \ 49 50 loop_condition_ ##name () : loop_condition( #name, #op, true ) {}; \ 50 virtual bool check( unsigned int a, unsigned intb) { return a op b; } \51 virtual bool check(t_sli_value a, t_sli_value b) { return a op b; } \ 51 52 }; 52 53 … … 65 66 formula_operator(const char * symbol, bool require_operand) : 66 67 symbol(symbol), require_operand(require_operand) {} 67 virtual unsigned int calculate(unsigned int original, unsigned int operand) = 0; 68 }; 69 70 class formula_operator_set : public formula_operator { 71 public: 72 formula_operator_set() : formula_operator("=", true) {} 73 virtual unsigned int calculate(unsigned int original, unsigned int operand) { 74 return operand; 75 } 76 }; 77 78 class formula_operator_add : public formula_operator { 79 public: 80 formula_operator_add() : formula_operator("+=", true) {} 81 virtual unsigned int calculate(unsigned int original, unsigned int operand) { 82 return pfc::min_t<unsigned int>(original + operand, SLI_MAX_FLAG_VALUE); 83 } 84 }; 85 86 class formula_operator_sub : public formula_operator { 87 public: 88 formula_operator_sub() : formula_operator("-=", true) {} 89 virtual unsigned int calculate(unsigned int original, unsigned int operand) { 90 if (original >= operand) return original - operand; 91 else return 0; 92 } 93 }; 94 95 class formula_operator_inc : public formula_operator { 96 public: 97 formula_operator_inc() : formula_operator("++", false) {} 98 virtual unsigned int calculate(unsigned int original, unsigned int operand) { 99 if (original == SLI_MAX_FLAG_VALUE) return original; 100 else return original + 1; 101 } 102 }; 103 104 class formula_operator_dec : public formula_operator { 105 public: 106 formula_operator_dec() : formula_operator("--", false) {} 107 virtual unsigned int calculate(unsigned int original, unsigned int operand) { 108 if (original >= 1) return original - 1; 109 else return 0; 110 } 111 }; 68 virtual t_sli_value calculate(t_sli_value original, t_sli_value operand) = 0; 69 }; 70 71 class sli_flag_value_clipper { 72 public: 73 static inline t_sli_value check_clip(t_sli_value value) { 74 return pfc::clip_t<t_sli_value>(value, SLI_MIN_FLAG_VALUE, SLI_MAX_FLAG_VALUE); 75 } 76 static inline t_sli_value check_min(t_sli_value value) { 77 return pfc::max_t<t_sli_value>(value, SLI_MIN_FLAG_VALUE); 78 } 79 static inline t_sli_value check_max(t_sli_value value) { 80 return pfc::min_t<t_sli_value>(value, SLI_MAX_FLAG_VALUE); 81 } 82 }; 83 84 #define DEFINE_FORMULA_OP(name, symbol, value, clipper) \ 85 class formula_operator_ ##name : public formula_operator { \ 86 public: \ 87 formula_operator_ ##name() : formula_operator(#symbol, true) {}; \ 88 virtual t_sli_value calculate(t_sli_value original, t_sli_value operand) { \ 89 return sli_flag_value_clipper::check_ ##clipper(value); \ 90 } \ 91 }; 92 93 DEFINE_FORMULA_OP(set, =, operand, clip); 94 DEFINE_FORMULA_OP(add, +=, original+operand, max); 95 DEFINE_FORMULA_OP(sub, -=, original-operand, min); 96 DEFINE_FORMULA_OP(inc, ++, original+1, max); 97 DEFINE_FORMULA_OP(dec, --, original-1, min); 112 98 113 99 class sli_link : public loop_event_point_baseimpl { 114 100 public: 101 //! set smooth sample count. return true if this link use smoothing, otherwise false. 115 102 virtual bool set_smooth_samples(t_size samples) = 0; 116 103 FB2K_MAKE_SERVICE_INTERFACE(sli_link, loop_event_point); … … 121 108 t_size smooth_samples; 122 109 protected: 123 sli_link_impl() : from(0), to(0), smooth(false), condition(NULL), refvalue(0), condvar(0), smooth_samples(0) {} 110 sli_link_impl() : from(0), to(0), smooth(false), condition(NULL), refvalue(0), condvar(0), smooth_samples(0), 111 seens(0) {} 124 112 ~sli_link_impl() { 125 113 if (condition != NULL) delete condition; … … 137 125 bool smooth; 138 126 loop_condition * condition; 139 unsigned int refvalue; 140 unsigned int condvar; 127 t_sli_value refvalue; 128 t_sli_value condvar; 129 t_size seens; 141 130 142 131 virtual void get_info(file_info & p_info, const char * p_prefix, t_uint32 sample_rate) { … … 168 157 p_info.info_set(name, buf); 169 158 } 159 160 virtual bool has_dynamic_info() const {return true;} 161 virtual bool set_dynamic_info(file_info & p_info, const char * p_prefix, t_uint32 sample_rate) { 162 pfc::string8 name; 163 name << p_prefix << "seens"; 164 p_info.info_set_int(name, seens); 165 return true; 166 } 167 virtual bool reset_dynamic_info(file_info & p_info, const char * p_prefix) { 168 pfc::string8 name; 169 name << p_prefix << "seens"; 170 return p_info.info_remove(name); 171 } 172 170 173 virtual void check() const { 171 174 if (from == to) throw exception_loop_bad_point(); … … 177 180 if (p_input->get_no_looping() || !check_condition(p_input)) return false; 178 181 p_input->raw_seek(to, p_abort); 182 ++seens; 179 183 return true; 180 184 } … … 183 187 class sli_label : public loop_event_point_baseimpl { 184 188 public: 189 sli_label() : loop_event_point_baseimpl(on_looping | on_no_looping), position(0), seens(0) {} 185 190 virtual t_uint64 get_position() const {return position;} 186 191 virtual t_uint64 get_prepare_position() const {return position;} 187 192 t_uint64 position; 193 t_size seens; 188 194 pfc::string8 name; 189 195 virtual void check() const {} … … 214 220 } 215 221 } 222 223 virtual bool has_dynamic_info() const {return true;} 224 virtual bool set_dynamic_info(file_info & p_info, const char * p_prefix, t_uint32 sample_rate) { 225 pfc::string8 name; 226 name << p_prefix << "seens"; 227 p_info.info_set_int(name, seens); 228 return true; 229 } 230 virtual bool reset_dynamic_info(file_info & p_info, const char * p_prefix) { 231 pfc::string8 name; 232 name << p_prefix << "seens"; 233 return p_info.info_remove(name); 234 } 235 216 236 virtual bool process(loop_type_base::ptr p_input, t_uint64 p_start, audio_chunk & p_chunk, mem_block_container * p_raw, abort_callback & p_abort) { 217 return process(p_input, p_ start, p_chunk, p_abort);237 return process(p_input, p_abort); 218 238 } 219 239 virtual bool process(loop_type_base::ptr p_input, abort_callback & p_abort); 220 virtual bool process(loop_type_base::ptr p_input, t_uint64 p_start, audio_chunk & p_chunk, abort_callback & p_abort);221 240 }; 222 241 … … 227 246 if (oper != NULL) delete oper; 228 247 } 229 unsigned intflag;248 t_sli_value flag; 230 249 formula_operator * oper; 231 250 bool indirect; 232 unsigned intvalue;251 t_sli_value value; 233 252 }; 234 253 … … 318 337 } else if (!pfc::stricmp_ascii(name, "RefValue")) { 319 338 if (!pfc::string_is_numeric(value)) return false; 320 link.refvalue = pfc::clip_t (atoi(value), SLI_MIN_FLAG_VALUE, SLI_MAX_FLAG_VALUE);339 link.refvalue = pfc::clip_t<t_sli_value>(pfc::atoui_ex(value, ~0), SLI_MIN_FLAG_VALUE, SLI_MAX_FLAG_VALUE); 321 340 } else if (!pfc::stricmp_ascii(name, "CondVar")) { 322 341 if (!pfc::string_is_numeric(value)) return false; 323 link.condvar = pfc::clip_t (atoi(value), 0, SLI_FLAGS-1);342 link.condvar = pfc::clip_t<t_sli_value>(pfc::atoui_ex(value, ~0), 0, SLI_FLAGS-1); 324 343 } else { 325 344 return false; … … 371 390 while (pfc::char_is_numeric(p[ptr])) ptr++; 372 391 if (ptr == 0) return false; 373 p_out.flag = pfc::clip_t< unsigned int>(pfc::atoui_ex(p, ptr), 0, SLI_FLAGS-1);392 p_out.flag = pfc::clip_t<t_sli_value>(pfc::atoui_ex(p, ptr), 0, SLI_FLAGS-1); 374 393 p += ptr; 375 394 // after flag, should be ']' … … 413 432 while (pfc::char_is_numeric(p[ptr])) ptr++; 414 433 if (ptr == 0) return false; 415 p_out.value = pfc::clip_t<unsigned int>(pfc::atoui_ex(p, ptr), SLI_MIN_FLAG_VALUE, 416 (p_out.indirect ? SLI_FLAGS-1 : SLI_MAX_FLAG_VALUE)); 434 if (p_out.indirect) 435 p_out.value = pfc::clip_t<t_sli_value>(pfc::atoui_ex(p, ptr), 0, SLI_FLAGS-1); 436 else 437 p_out.value = pfc::clip_t<t_sli_value>(pfc::atoui_ex(p, ptr), SLI_MIN_FLAG_VALUE, SLI_MAX_FLAG_VALUE); 417 438 p += ptr; 418 439 if (p_out.indirect) { … … 610 631 t_size flagnum = m_flags.get_size(); 611 632 t_size flag = formula.flag; 612 unsigned intvalue = formula.value;633 t_sli_value value = formula.value; 613 634 if (formula.indirect) { 614 635 value = m_flags[value]; … … 641 662 // this event do not process on no_looping 642 663 if ((p_input->get_no_looping() && from >= to) || !check_condition(p_input)) return false; 664 ++seens; 643 665 t_size point = pfc::downcast_guarded<t_size>(from - p_start); 644 666 loop_type_sli::ptr p_input_special; … … 649 671 } 650 672 // smooth 651 PFC_ASSERT(p_raw == NULL); 673 PFC_ASSERT(p_raw == NULL); // we do not support raw streaming with smoothing 652 674 t_size smooth_first_samples = smooth_samples; 653 675 t_size require_samples = point + p_input_special->get_crossfade_samples_half(); 654 676 t_size samples = p_chunk.get_sample_count(); 655 if (require_samples > samples) {677 if (require_samples > samples) 656 678 samples += p_input->get_more_chunk(p_chunk, p_raw, p_abort, require_samples - samples); 657 } 658 if (require_samples < samples) { 679 if (require_samples < samples) 659 680 truncate_chunk(p_chunk, p_raw, require_samples);// only debug mode ? 660 }661 681 t_size smooth_latter_samples = pfc::min_t(require_samples, samples) - point; 662 682 // seek … … 683 703 } 684 704 685 bool sli_label::process(loop_type_base::ptr p_input, t_uint64 p_start, audio_chunk & p_chunk, abort_callback & p_abort) {686 if (cfg_sli_label_logging.get()) {687 if ((p_start + p_chunk.get_sample_count()) > get_position())688 console::formatter() << "SLI: Label: " << name << " at " <<689 format_samples_ex(get_position(), p_chunk.get_sample_rate());690 }691 return process(p_input, p_abort);692 }693 694 705 bool sli_label::process(loop_type_base::ptr p_input, abort_callback & p_abort) { 695 706 // this event do not process on no_looping 696 if (p_input->get_no_looping()) return false; 707 if (cfg_sli_label_logging.get()) { 708 console::formatter() << "SLI: Label: " << name << " at " << 709 format_samples_ex(get_position(), p_input->get_sample_rate()); 710 } 711 ++seens; 697 712 if (name[0] != ':') return false; 698 713 loop_type_sli::ptr p_input_special; … … 724 739 throw exception_io_data(); 725 740 } 726 PFC_ASSERT(m_looptype.is_valid());727 741 } 728 742
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)