Class: WSK::OutputInterfaces::DirectStream

Inherits:
Object
  • Object
show all
Defined in:
lib/WSK/OutputInterfaces/DirectStream.rb

Constant Summary collapse

BUFFER_SIZE =

Here we define the buffer size. The buffer will be used to store contiguous audio data in RAM. Each OutputData object will never use more than this size. It is expressed in bytes.

Integer
2097152

Instance Method Summary collapse

Instance Method Details

#each_buffer(iIdxBeginSample, iIdxEndSample) ⇒ Object

Loop on a range of samples split into buffers

Parameters
  • iIdxBeginSample (Integer): The beginning sample

  • iIdxEndSample (Integer): The ending sample

  • CodeBlock: The code called for each buffer:

    • iIdxBeginBufferSample (Integer): The beginning of this buffer’s sample

    • iIdxEndBufferSample (Integer): The ending of this buffer’s sample



109
110
111
112
113
114
115
116
117
118
119
# File 'lib/WSK/OutputInterfaces/DirectStream.rb', line 109

def each_buffer(iIdxBeginSample, iIdxEndSample)
  lIdxBeginBufferSample = iIdxBeginSample
  while (lIdxBeginBufferSample <= iIdxEndSample)
    lIdxEndBufferSample = lIdxBeginBufferSample + @NbrSamplesPerBuffer - 1
    if (lIdxEndBufferSample > iIdxEndSample)
      lIdxEndBufferSample = iIdxEndSample
    end
    yield(lIdxBeginBufferSample, lIdxEndBufferSample)
    lIdxBeginBufferSample = lIdxEndBufferSample + 1
  end
end

#finalizeObject

Finalize writing

Return
  • Integer: The number of samples written



51
52
53
54
55
56
57
# File 'lib/WSK/OutputInterfaces/DirectStream.rb', line 51

def finalize
  if (!@Buffer.empty?)
    flushBuffer
  end

  return @NbrSamplesWritten
end

#initInterface(oFile, iHeader, iNbrOutputDataSamples) ⇒ Object

Initialize the plugin

Parameters
  • oFile (IO): The file descriptor. Don’t use it externally as long as it is used by this class.

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

  • iNbrOutputDataSamples (Integer): The number of output data samples

Return
  • Exception: An error, or nil in case of success



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/WSK/OutputInterfaces/DirectStream.rb', line 27

def initInterface(oFile, iHeader, iNbrOutputDataSamples)
  rError = nil

  @File, @Header, @NbrSamples = oFile, iHeader, iNbrOutputDataSamples
  @NbrSamplesWritten = 0
  # Size of a sample
  # Integer
  @SampleSize = (@Header.NbrChannels*@Header.NbrBitsPerSample)/8
  # Compute the number of samples to store in the buffer
  @NbrSamplesPerBuffer = BUFFER_SIZE/@SampleSize
  # The position of the last written sample in the buffer
  # Integer
  @IdxCurrentBufferSample = 0
  # The buffer itself, list of channels values
  # list< Integer >
  @Buffer = []

  return rError
end

#pushBuffer(iBuffer) ⇒ Object

Add a buffer

Parameters
  • iBuffer (list<Integer>): The list of channel values for this buffer



77
78
79
80
81
82
83
84
85
# File 'lib/WSK/OutputInterfaces/DirectStream.rb', line 77

def pushBuffer(iBuffer)
  # Write data in the current buffer
  @Buffer += iBuffer
  @IdxCurrentBufferSample += iBuffer.size/@Header.NbrChannels
  if (@IdxCurrentBufferSample >= @NbrSamplesPerBuffer)
    # We have to flush the buffer
    flushBuffer
  end
end

#pushRawBuffer(iRawBuffer) ⇒ Object

Add a raw buffer

Parameters
  • iRawBuffer (String): The raw buffer



91
92
93
94
95
96
97
98
99
# File 'lib/WSK/OutputInterfaces/DirectStream.rb', line 91

def pushRawBuffer(iRawBuffer)
  # First, flush eventually remaining buffer to encode
  if (!@Buffer.empty?)
    flushBuffer
  end
  # Then write our raw buffer
  @File.write(iRawBuffer)
  updateProgress(iRawBuffer.size/@SampleSize)
end

#pushSample(iSampleData) ⇒ Object

Add a sample data

Parameters
  • iSampleData (list<Integer>): The list of channel values for this sample



63
64
65
66
67
68
69
70
71
# File 'lib/WSK/OutputInterfaces/DirectStream.rb', line 63

def pushSample(iSampleData)
  # Write data in the buffer
  @Buffer += iSampleData
  @IdxCurrentBufferSample += 1
  if (@IdxCurrentBufferSample == @NbrSamplesPerBuffer)
    # We have to flush the buffer
    flushBuffer
  end
end