Class: Libsamplerate::StaticResampler
- Inherits:
-
Object
- Object
- Libsamplerate::StaticResampler
- Defined in:
- lib/libsamplerate/static_resampler.rb
Instance Attribute Summary collapse
-
#in ⇒ Object
readonly
Returns the value of attribute in.
-
#out ⇒ Object
readonly
Returns the value of attribute out.
-
#src_data ⇒ Object
readonly
Returns the value of attribute src_data.
Instance Method Summary collapse
- #allocate_audio_pointer_buffer_float(num_samples) ⇒ Object
- #create_audio_pointer_buffer_float(samples) ⇒ Object
- #get_info(file) ⇒ Object
- #in_info ⇒ Object
-
#initialize(in_file, out) ⇒ StaticResampler
constructor
A new instance of StaticResampler.
- #out_info ⇒ Object
- #prepare_buffer ⇒ Object
- #resample ⇒ Object
- #setup_src_data(in_ptr, num_samples_in, out_ptr, num_samples_out, src_ratio) ⇒ Object
- #write_out_file ⇒ Object
Constructor Details
#initialize(in_file, out) ⇒ StaticResampler
Returns a new instance of StaticResampler.
5 6 7 8 9 10 11 |
# File 'lib/libsamplerate/static_resampler.rb', line 5 def initialize in_file, out @in = { path: in_file, info: get_info(in_file) } @out = out end |
Instance Attribute Details
#in ⇒ Object (readonly)
Returns the value of attribute in.
4 5 6 |
# File 'lib/libsamplerate/static_resampler.rb', line 4 def in @in end |
#out ⇒ Object (readonly)
Returns the value of attribute out.
4 5 6 |
# File 'lib/libsamplerate/static_resampler.rb', line 4 def out @out end |
#src_data ⇒ Object (readonly)
Returns the value of attribute src_data.
4 5 6 |
# File 'lib/libsamplerate/static_resampler.rb', line 4 def src_data @src_data end |
Instance Method Details
#allocate_audio_pointer_buffer_float(num_samples) ⇒ Object
75 76 77 |
# File 'lib/libsamplerate/static_resampler.rb', line 75 def allocate_audio_pointer_buffer_float num_samples ::FFI::MemoryPointer.new :float, num_samples end |
#create_audio_pointer_buffer_float(samples) ⇒ Object
79 80 81 82 83 |
# File 'lib/libsamplerate/static_resampler.rb', line 79 def create_audio_pointer_buffer_float samples ptr = ::FFI::MemoryPointer.new :float, samples.size ptr.write_array_of_float samples ptr end |
#get_info(file) ⇒ Object
21 22 23 |
# File 'lib/libsamplerate/static_resampler.rb', line 21 def get_info file Libsamplerate.get_sound_file_info file end |
#in_info ⇒ Object
13 14 15 |
# File 'lib/libsamplerate/static_resampler.rb', line 13 def in_info @in[:info] end |
#out_info ⇒ Object
17 18 19 |
# File 'lib/libsamplerate/static_resampler.rb', line 17 def out_info @out[:info] end |
#prepare_buffer ⇒ Object
49 50 51 52 53 54 55 |
# File 'lib/libsamplerate/static_resampler.rb', line 49 def prepare_buffer if in_info.channels != 1 Libsamplerate.stereo_to_mono @in[:path] else Libsamplerate.get_float_buffer_from_mono_file @in[:path] end end |
#resample ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/libsamplerate/static_resampler.rb', line 57 def resample input = prepare_buffer num_samples = input.size in_ptr = create_audio_pointer_buffer_float input tRate = out_info.samplerate.to_f iRate = in_info.samplerate.to_f outbuffer = allocate_audio_pointer_buffer_float num_samples outsamples = num_samples / 2 src_ratio = tRate / iRate converter = Libsamplerate::CONVERTERS[:src_sinc_best_quality] setup_src_data(in_ptr, num_samples, outbuffer, outsamples, src_ratio) resampled = Libsamplerate::FFI.src_simple(src_data, converter, out_info.channels) error = Libsamplerate::FFI.src_strerror resampled error.eql? "No Error." || raise(error) write_out_file self end |
#setup_src_data(in_ptr, num_samples_in, out_ptr, num_samples_out, src_ratio) ⇒ Object
25 26 27 28 29 30 31 |
# File 'lib/libsamplerate/static_resampler.rb', line 25 def setup_src_data in_ptr, num_samples_in, out_ptr, num_samples_out, src_ratio src_data[:data_in] = in_ptr src_data[:input_frames] = num_samples_in src_data[:data_out] = out_ptr src_data[:output_frames] = num_samples_out src_data[:src_ratio] = src_ratio end |
#write_out_file ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/libsamplerate/static_resampler.rb', line 37 def write_out_file num_samples_out = src_data[:output_frames_gen] samples = src_data[:data_out].read_array_of_float(num_samples_out * out_info.channels) sound = RubyAudio::Sound.open(@out[:path], 'w', out_info) buffer = RubyAudio::Buffer.float(samples.length, out_info.channels) samples.each_with_index { |sample, index| buffer[index] = sample } sound.write(buffer) sound.close end |