class Libsamplerate::StaticResampler

Attributes

in[R]
out[R]
src_data[R]

Public Class Methods

new(in_file, out) click to toggle source
# 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

Public Instance Methods

allocate_audio_pointer_buffer_float(num_samples) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# File lib/libsamplerate/static_resampler.rb, line 21
def get_info file
  Libsamplerate.get_sound_file_info file
end
in_info() click to toggle source
# File lib/libsamplerate/static_resampler.rb, line 13
def in_info
  @in[:info]
end
out_info() click to toggle source
# File lib/libsamplerate/static_resampler.rb, line 17
def out_info
  @out[:info]
end
prepare_buffer() click to toggle source
# 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() click to toggle source
# 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) click to toggle source
# 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() click to toggle source
# 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