Thread: [Jahshaka-cvs] openlibraries/src/openmedialib/ml utilities.cpp, 1.17, 1.18 utilities.hpp, 1.7, 1.8
Status: Beta
Brought to you by:
jahshaka
From: jpn <non...@us...> - 2006-10-31 15:09:52
|
Update of /cvsroot/openlibraries/openlibraries/src/openmedialib/ml In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv2749/src/openmedialib/ml Modified Files: utilities.cpp utilities.hpp Log Message: audio_samples_to_frame(...) no longer uses the audio_calculator_class. Class removed. Index: utilities.cpp =================================================================== RCS file: /cvsroot/openlibraries/openlibraries/src/openmedialib/ml/utilities.cpp,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- utilities.cpp 30 Oct 2006 17:49:41 -0000 1.17 +++ utilities.cpp 31 Oct 2006 15:09:48 -0000 1.18 @@ -14,105 +14,6 @@ namespace pl = olib::openpluginlib; namespace ml = olib::openmedialib::ml; -namespace -{ - class audio_sample_calculator - { - public: - audio_sample_calculator(int samplefreq, int framerate_numerator, int framerate_denominator) - : samplefreq_(samplefreq), - framerate_numerator_(framerate_numerator), - framerate_denominator_(framerate_denominator) - { - float totalsamples_per_cycle = 0.0; - double samples_per_frame = (double(samplefreq) * framerate_denominator) / framerate_numerator; - - frames_per_cycle_ = 0; - - do - { - ++frames_per_cycle_; - totalsamples_per_cycle = samples_per_frame * frames_per_cycle_; - - } while(totalsamples_per_cycle - int(totalsamples_per_cycle) != 0.0); - - // like this cos of some weird rounding issue - samples_per_cycle_ = static_cast<int>(static_cast<float>(samples_per_frame * double(frames_per_cycle_))); - - int samples_per_frame_base = (samplefreq * framerate_denominator) / framerate_numerator; - // like this cos of some weird rounding issue - int extra_samples = static_cast<int>(static_cast<float>(double(frames_per_cycle_) * (samples_per_frame - double(samples_per_frame_base)))); - - samples_per_frame_ = new int[frames_per_cycle_]; - cyclic_sample_offset_ = new long long[frames_per_cycle_]; - - for(int idx = 0; idx < frames_per_cycle_; idx++) - { - samples_per_frame_[idx] = samples_per_frame_base; - - if((double(2 * extra_samples)/(frames_per_cycle_ - idx)) > 1.0) - { - samples_per_frame_[idx] += 1; - extra_samples--; - } - - cyclic_sample_offset_[idx] = (idx == 0) ? 0 : cyclic_sample_offset_[idx - 1] + samples_per_frame_[idx - 1]; - } - }; - - ~audio_sample_calculator() - { - delete [] samples_per_frame_; - delete [] cyclic_sample_offset_; - }; - - int get_samplefreq() - { - return samplefreq_; - } - - int get_framerate_numerator() - { - return framerate_numerator_; - } - - int get_framerate_denominator() - { - return framerate_denominator_; - } - - int get_frames_per_cycle() - { - return frames_per_cycle_; - } - - int get_samples_per_cycle() - { - return samples_per_cycle_; - } - - long long calc_samples_to_frame(int frameoffset) - { - return ((long long)(frameoffset / frames_per_cycle_) * samples_per_cycle_) + cyclic_sample_offset_[frameoffset % frames_per_cycle_]; - } - - int calc_samples_for_frame(int frameoffset) - { - //fprintf(stdout, "frameoffset=%d, frames_per_cycle_=%d, mod(frameoffset/frames_per_cycle_)=%d\n", frameoffset, frames_per_cycle_, frameoffset % frames_per_cycle_); - return samples_per_frame_[frameoffset % frames_per_cycle_]; - } - - private: - int samplefreq_; - int framerate_numerator_; - int framerate_denominator_; - int frames_per_cycle_; - int samples_per_cycle_; - int* samples_per_frame_; - long long* cyclic_sample_offset_; - }; -} - // Query structure used struct ml_query_traits : public pl::default_query_traits { @@ -231,14 +132,31 @@ return aud; } -ML_DECLSPEC long long ml::audio_samples_to_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator) +ML_DECLSPEC int ml::audio_samples_for_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator) { - return audio_sample_calculator(samplefreq, framerate_numerator, framerate_denominator).calc_samples_to_frame(frameoffset); + double totalsamples_per_cycle = 0.0; + double samples_per_frame = (double(samplefreq) * framerate_denominator) / framerate_numerator; + + int frames_per_cycle = 0; + do + { + totalsamples_per_cycle = ++frames_per_cycle * samples_per_frame; + + } while(totalsamples_per_cycle - int(totalsamples_per_cycle) != 0.0); + + int samples_per_frame_base = (samplefreq * framerate_denominator) / framerate_numerator; + double extra_sample_spread = samples_per_frame - double(samples_per_frame_base); + int cycle_idx = frameoffset % frames_per_cycle; + + if(cycle_idx == 0) + return samples_per_frame_base + (extra_sample_spread > 0.5 ? 1 : 0); + else + return samples_per_frame_base + (int(floor((extra_sample_spread * cycle_idx) + 0.5)) > int(floor(extra_sample_spread * (cycle_idx - 1) + 0.5)) ? 1 : 0); } -ML_DECLSPEC int ml::audio_samples_for_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator) +ML_DECLSPEC long long ml::audio_samples_to_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator) { - float totalsamples_per_cycle = 0.0; + double totalsamples_per_cycle = 0.0; double samples_per_frame = (double(samplefreq) * framerate_denominator) / framerate_numerator; int frames_per_cycle = 0; @@ -247,16 +165,23 @@ totalsamples_per_cycle = ++frames_per_cycle * samples_per_frame; } while(totalsamples_per_cycle - int(totalsamples_per_cycle) != 0.0); - + int samples_per_frame_base = (samplefreq * framerate_denominator) / framerate_numerator; - float offset = static_cast<float>(double(frames_per_cycle) * (samples_per_frame - double(samples_per_frame_base))) / float(frames_per_cycle); + int samples_per_cycle = int(float(samples_per_frame * double(frames_per_cycle))); + double extra_sample_spread = samples_per_frame - double(samples_per_frame_base); int cycle_idx = frameoffset % frames_per_cycle; - int samples = 0; + + long long offset = ((long long)(frameoffset / frames_per_cycle) * samples_per_cycle); if(cycle_idx > 0) - samples = samples_per_frame_base + (int(floor((offset * cycle_idx) + 0.5)) > int(floor(offset * (cycle_idx - 1) + 0.5)) ? 1 : 0); - else - samples = samples_per_frame_base + (offset > 0.5 ? 1 : 0); + { + offset += cycle_idx * samples_per_frame_base; + + if(extra_sample_spread > 0.5) + offset += 1; + + offset += int(floor((extra_sample_spread * cycle_idx) - extra_sample_spread + 0.5)); + } - return samples; + return offset; } Index: utilities.hpp =================================================================== RCS file: /cvsroot/openlibraries/openlibraries/src/openmedialib/ml/utilities.hpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- utilities.hpp 26 Oct 2006 09:00:48 -0000 1.7 +++ utilities.hpp 31 Oct 2006 15:09:48 -0000 1.8 @@ -19,8 +19,8 @@ ML_DECLSPEC audio_type_ptr audio_stretch( audio_type_ptr, int samples, int frequency, int channels, int bps ); ML_DECLSPEC audio_type_ptr audio_resample( audio_type_ptr, int frequency, int channels, int bps ); +ML_DECLSPEC int audio_samples_for_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator); ML_DECLSPEC long long audio_samples_to_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator); -ML_DECLSPEC int audio_samples_for_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator); } } } |