Class: Libsamplerate::StaticResampler

Inherits:
Object
  • Object
show all
Defined in:
lib/libsamplerate/static_resampler.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#inObject (readonly)

Returns the value of attribute in.



4
5
6
# File 'lib/libsamplerate/static_resampler.rb', line 4

def in
  @in
end

#outObject (readonly)

Returns the value of attribute out.



4
5
6
# File 'lib/libsamplerate/static_resampler.rb', line 4

def out
  @out
end

#src_dataObject (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_infoObject



13
14
15
# File 'lib/libsamplerate/static_resampler.rb', line 13

def in_info
  @in[:info]
end

#out_infoObject



17
18
19
# File 'lib/libsamplerate/static_resampler.rb', line 17

def out_info
  @out[:info]
end

#prepare_bufferObject



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

#resampleObject



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_fileObject



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