Class: WSK::Model::WaveReader

Inherits:
CachedBufferReader show all
Defined in:
lib/WSK/Model/WaveReader.rb

Overview

Implement a Wave file reader using a raw buffer reader. Buffers returned are of type list<Integer>.

Constant Summary collapse

NBR_CHANNEL_SAMPLES_PER_BUFFER =

Number of channel samples per buffer.

Integer
2097152

Instance Method Summary collapse

Methods inherited from CachedBufferReader

#each_buffer, #each_reverse_buffer, #get_current_buffer, #prepare_buffer

Constructor Details

#initialize(iRawReader, iHeader) ⇒ WaveReader

Constructor

Parameters
  • iRawReader (CachedBufferReader): The reader that provides raw data

  • iHeader (WSK::Model::Header): Corresponding file header



25
26
27
28
# File 'lib/WSK/Model/WaveReader.rb', line 25

def initialize(iRawReader, iHeader)
  @RawReader, @Header = iRawReader, iHeader
  super()
end

Instance Method Details

#extract_sub_buffer(iBuffer, iIdxStartSample, iIdxEndSample) ⇒ Object

Extract a sub-buffer for the given index range

Parameters
  • iBuffer (Object): The buffer to extract from

  • iIdxStartSample (Integer): Index of the first sample to begin with

  • iIdxEndSample (Integer): Index of the last sample to end with

Return
  • Object: The sub buffer



83
84
85
# File 'lib/WSK/Model/WaveReader.rb', line 83

def extract_sub_buffer(iBuffer, iIdxStartSample, iIdxEndSample)
  return iBuffer[iIdxStartSample*@Header.NbrChannels..(iIdxEndSample+1)*@Header.NbrChannels-1]
end

#get_nbr_samplesObject

Get the total number of samples

Return
  • Integer: Total number of samples



42
43
44
# File 'lib/WSK/Model/WaveReader.rb', line 42

def get_nbr_samples
  return @RawReader.get_nbr_samples
end

#get_nbr_samples_per_bufferObject

Get the number of samples read per buffer

Return
  • Integer: Nnumber of samples in 1 buffer



34
35
36
# File 'lib/WSK/Model/WaveReader.rb', line 34

def get_nbr_samples_per_buffer
  return NBR_CHANNEL_SAMPLES_PER_BUFFER/@Header.NbrChannels
end

#read_buffer(iIdxStartSample, iIdxEndSample) ⇒ Object

Read a buffer

Parameters
  • iIdxStartSample (Integer): Index of the first sample to begin with

  • iIdxEndSample (Integer): Index of the last sample to end with

Return
  • Object: The corresponding buffer



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/WSK/Model/WaveReader.rb', line 53

def read_buffer(iIdxStartSample, iIdxEndSample)
  lRawBuffer = nil
  lNbrSamplesToRead = iIdxEndSample - iIdxStartSample + 1
  @RawReader.each_buffer(iIdxStartSample, iIdxEndSample) do |iBuffer, iNbrSamples|
    if (lRawBuffer == nil)
      if (lNbrSamplesToRead == iNbrSamples)
        # We have the buffer directly. No copy.
        lRawBuffer = iBuffer
      else
        # We will need to concatenate other buffers. Clone it.
        lRawBuffer = iBuffer.clone
      end
    else
      # Concatenate
      lRawBuffer.concat(iBuffer)
    end
  end
  log_debug "Decode samples [#{iIdxStartSample} - #{iIdxEndSample}]"
  
  return @Header.getDecodedSamples(lRawBuffer, lNbrSamplesToRead)
end