class Alexandria::UI::SoundEffectsPlayer

Uses Ruby/GStreamer to play Ogg/Vorbis sound effects

Public Class Methods

new() click to toggle source
# File lib/alexandria/ui/sound.rb, line 31
def initialize
  @sounds_dir = Alexandria::Config::SOUNDS_DIR
  @ogg_vorbis_pipeline = Gst::Pipeline.new
  set_up_pipeline
  @playing = false
  set_up_bus_watch
end

Public Instance Methods

play(effect) click to toggle source
# File lib/alexandria/ui/sound.rb, line 39
def play(effect)
  file = File.join(@sounds_dir, "#{effect}.ogg")
  if @playing
    log.debug { "Already playing #{effect}." }
  else
    log.debug { "Not playing. Starting #{effect}." }
    @filesrc.location = file
    start_playback
  end
end
set_up_bus_watch() click to toggle source
# File lib/alexandria/ui/sound.rb, line 72
def set_up_bus_watch
  @bus = @ogg_vorbis_pipeline.bus
  @bus.add_watch do |_bus, message|
    case message.type
    when Gst::MessageType::EOS
      stop_playback
    when Gst::MessageType::ERROR
      log.debug { "ERROR loop.quit" }
      log.debug { message.parse.inspect }
      stop_playback
    end
    true
  end
end
set_up_pipeline() click to toggle source
# File lib/alexandria/ui/sound.rb, line 50
def set_up_pipeline
  @filesrc = Gst::ElementFactory.make("filesrc")
  demuxer = Gst::ElementFactory.make("oggdemux")
  decoder = Gst::ElementFactory.make("vorbisdec")
  converter = Gst::ElementFactory.make("audioconvert") # #??
  audiosink = Gst::ElementFactory.make("autoaudiosink")

  @ogg_vorbis_pipeline.add(@filesrc, demuxer, decoder,
                           converter, audiosink)
  @filesrc >> demuxer

  # this next must be a dynamic link, as demuxers potentially
  # have multiple src pads (for audio/video muxed streams)

  demuxer.signal_connect("pad-added") do |_parser, ogg_src_pad|
    vorbis_sink_pad = decoder.sinkpads.first
    ogg_src_pad.link(vorbis_sink_pad)
  end

  decoder >> converter >> audiosink
end
start_playback() click to toggle source
# File lib/alexandria/ui/sound.rb, line 87
def start_playback
  @playing = true
  @ogg_vorbis_pipeline.play
end
stop_playback() click to toggle source
# File lib/alexandria/ui/sound.rb, line 92
def stop_playback
  @ogg_vorbis_pipeline.stop
  @playing = false
end