module Sound::DeviceLibrary::ALSA

Constants

ASYNC
DEFAULT_DEVICE_ID
SND_PCM_ACCESS_LAST
SND_PCM_ACCESS_MMAP_COMPLEX

mmap access with complex placement

SND_PCM_ACCESS_MMAP_INTERLEAVED

snd_pcm access

mmap access with simple interleaved channels
SND_PCM_ACCESS_MMAP_NONINTERLEAVED

mmap access with simple non interleaved channels

SND_PCM_ACCESS_RW_INTERLEAVED

snd_pcm_readi/snd_pcm_writei access

SND_PCM_ACCESS_RW_NONINTERLEAVED

snd_pcm_readn/snd_pcm_writen access

SND_PCM_ASYNC
SND_PCM_FORMAT_A_LAW

A-Law

SND_PCM_FORMAT_FLOAT64_BE

Float 64 bit Big Endian, Range -1.0 to 1.0

SND_PCM_FORMAT_FLOAT64_LE

Float 64 bit Little Endian, Range -1.0 to 1.0

SND_PCM_FORMAT_FLOAT_BE

Float 32 bit Big Endian, Range -1.0 to 1.0

SND_PCM_FORMAT_FLOAT_LE

Float 32 bit Little Endian, Range -1.0 to 1.0

SND_PCM_FORMAT_GSM

GSM

SND_PCM_FORMAT_IEC958_SUBFRAME_BE

IEC-958 Big Endian

SND_PCM_FORMAT_IEC958_SUBFRAME_LE

IEC-958 Little Endian

SND_PCM_FORMAT_IMA_ADPCM

Ima-ADPCM

SND_PCM_FORMAT_LAST
SND_PCM_FORMAT_MPEG

MPEG

SND_PCM_FORMAT_MU_LAW

Mu-Law

SND_PCM_FORMAT_S16_BE

Signed 16 bit Big Endian

SND_PCM_FORMAT_S16_LE

Signed 16 bit Little Endian

SND_PCM_FORMAT_S18_3BE

Signed 18bit Big Endian in 3bytes format

SND_PCM_FORMAT_S18_3LE

Signed 18bit Little Endian in 3bytes format

SND_PCM_FORMAT_S20_3BE

Signed 20bit Big Endian in 3bytes format

SND_PCM_FORMAT_S20_3LE

Signed 20bit Little Endian in 3bytes format

SND_PCM_FORMAT_S24_3BE

Signed 24bit Big Endian in 3bytes format

SND_PCM_FORMAT_S24_3LE

Signed 24bit Little Endian in 3bytes format

SND_PCM_FORMAT_S24_BE

Signed 24 bit Big Endian using low three bytes in 32-bit word

SND_PCM_FORMAT_S24_LE

Signed 24 bit Little Endian using low three bytes in 32-bit word

SND_PCM_FORMAT_S32_BE

Signed 32 bit Big Endian

SND_PCM_FORMAT_S32_LE

Signed 32 bit Little Endian

SND_PCM_FORMAT_S8

Signed 8 bit

SND_PCM_FORMAT_SPECIAL

Special

SND_PCM_FORMAT_U16_BE

Unsigned 16 bit Big Endian

SND_PCM_FORMAT_U16_LE

Unsigned 16 bit Little Endian

SND_PCM_FORMAT_U18_3BE

Unsigned 18bit Big Endian in 3bytes format

SND_PCM_FORMAT_U18_3LE

Unsigned 18bit Little Endian in 3bytes format

SND_PCM_FORMAT_U20_3BE

Unsigned 20bit Big Endian in 3bytes format

SND_PCM_FORMAT_U20_3LE

Unsigned 20bit Little Endian in 3bytes format

SND_PCM_FORMAT_U24_3BE

Unsigned 24bit Big Endian in 3bytes format

SND_PCM_FORMAT_U24_3LE

Unsigned 24bit Little Endian in 3bytes format

SND_PCM_FORMAT_U24_BE

Unsigned 24 bit Big Endian using low three bytes in 32-bit word

SND_PCM_FORMAT_U24_LE

Unsigned 24 bit Little Endian using low three bytes in 32-bit word

SND_PCM_FORMAT_U32_BE

Unsigned 32 bit Big Endian

SND_PCM_FORMAT_U32_LE

Unsigned 32 bit Little Endian

SND_PCM_FORMAT_U8

Unsigned 8 bit

SND_PCM_FORMAT_UNKNOWN

snd_pcm formats

Unknown
SND_PCM_STREAM_CAPTURE
SND_PCM_STREAM_PLAYBACK

Public Class Methods

snd_pcm_open(*args) click to toggle source
# File lib/sound/device_library/alsa.rb, line 43
def self.snd_pcm_open(*args)
  output = `aplay -l 2>&1`
  if output.match(/no soundcard/m)
    raise NoDeviceError, "No sound devices present"
  elsif output.match(/not found/m)
    raise NoDependencyError,
      "aplay is not present in your environment. Install alsa-utils package for audio playback."
  else
    snd_pcm_open(*args)
  end
end

Public Instance Methods

allocate_param_memory() click to toggle source
# File lib/sound/device_library/alsa.rb, line 111
def allocate_param_memory
  snd_pcm_hw_params_malloc(params_handle.pointer)
end
alter_allocated_param_memory() click to toggle source
# File lib/sound/device_library/alsa.rb, line 119
def alter_allocated_param_memory
  set_up_to_change_any_params
  modify_desired_params
  set_params_on_hw_buffer
end
buffer_length() click to toggle source
# File lib/sound/device_library/alsa.rb, line 89
def buffer_length
  Thread.current[:buffer_length] ||= data_buffer.size/2
end
close_device() click to toggle source
# File lib/sound/device_library/alsa.rb, line 81
def close_device
  snd_pcm_close(handle.id) unless Sound.no_device
end
data() click to toggle source
# File lib/sound/device_library/alsa.rb, line 97
def data
  Thread.current[:data] ||= Sound::Data.new
end
data_buffer() click to toggle source
# File lib/sound/device_library/alsa.rb, line 101
def data_buffer
  Thread.current[:data_buffer] ||= FFI::MemoryPointer.new(:int, data.pcm_data.size).write_array_of_int data.pcm_data
end
free_param_memory() click to toggle source
# File lib/sound/device_library/alsa.rb, line 115
def free_param_memory
  snd_pcm_hw_params_free(params_handle.id)
end
handle() click to toggle source
# File lib/sound/device_library/alsa.rb, line 93
def handle
  Thread.current[:handle] ||= Handle.new
end
modify_desired_params() click to toggle source
# File lib/sound/device_library/alsa.rb, line 129
def modify_desired_params
  # I think these can happen in any order
  snd_pcm_hw_params_set_access(handle.id, params_handle.id, SND_PCM_ACCESS_RW_INTERLEAVED)
  snd_pcm_hw_params_set_format(handle.id, params_handle.id, SND_PCM_FORMAT_S16_LE)
   # need to change this to set_rate_near at some point
  snd_pcm_hw_params_set_rate(handle.id, params_handle.id, data.format.sample_rate, 0)
  snd_pcm_hw_params_set_channels(handle.id, params_handle.id, data.format.channels)
end
open_device(device) click to toggle source
# File lib/sound/device_library/alsa.rb, line 55
def open_device(device)
  begin
    self.snd_pcm_open(handle.pointer, device.id, 0, ASYNC)
  rescue NoDeviceError
    Sound.no_device = true
  end
end
params_handle() click to toggle source
# File lib/sound/device_library/alsa.rb, line 85
def params_handle
  Thread.current[:params_handle] ||= Handle.new
end
prepare_buffer() click to toggle source
# File lib/sound/device_library/alsa.rb, line 63
def prepare_buffer
  
  unless Sound.no_device
    buffer_length
    set_params
    snd_pcm_prepare(handle.id)
  end
  
end
set_params() click to toggle source
# File lib/sound/device_library/alsa.rb, line 105
def set_params
  allocate_param_memory
  alter_allocated_param_memory
  free_param_memory
end
set_params_on_hw_buffer() click to toggle source
# File lib/sound/device_library/alsa.rb, line 138
def set_params_on_hw_buffer
  snd_pcm_hw_params(handle.id, params_handle.id)
end
set_up_to_change_any_params() click to toggle source
# File lib/sound/device_library/alsa.rb, line 125
def set_up_to_change_any_params
  snd_pcm_hw_params_any(handle.id, params_handle.id)
end
unprepare_buffer() click to toggle source
# File lib/sound/device_library/alsa.rb, line 77
def unprepare_buffer
  snd_pcm_drain(handle.id) unless Sound.no_device
end
write_to_device() click to toggle source
# File lib/sound/device_library/alsa.rb, line 73
def write_to_device
  snd_pcm_writei(handle.id, data_buffer, buffer_length) unless Sound.no_device
end