##### PLAYER.RB #########
require 'gst'
require 'Timer.rb'
class BlockPlayer
:low
:medium
:high
@log_level = :high
@log_play_interval = 1
# standard constructor
def initialize( volume_block, frequency_block )
@log_level = :high
@log_play_interval = 1
@volume = volume_block
@frequency = frequency_block
@play_state = false
build_pipeline
end
# plays the function for a given time
def play_time( max_time )
# init values
@audio_source.volume = @volume.call( 0 )
@audio_source.freq = @frequency.call( 0 )
# set up pipeline
@pipeline.play
timer = Timer.new
print_info :sound_start
# iterate trough data
elapsed = timer.elapsed
while elapsed < max_time
@pipeline.iterate do end
@audio_source.volume = @volume.call( elapsed )
@audio_source.freq = @frequency.call( elapsed )
print_info :sound_iter, timer
elapsed = timer.elapsed
end
# finish up pipeline
print_info :sound_stop
@pipeline.stop
end
private
# builds the elements and the pipeline
def build_pipeline
Gst.init
@pipeline = Gst::Pipeline.new
@audio_source = Gst::ElementFactory.make("sinesrc")
audio_sink = Gst::ElementFactory.make("osssink")
@pipeline.add(@audio_source, audio_sink)
@audio_source >> audio_sink
print_info :create_pipeline # print info
end
# provides the logging facilities
def print_info( event, timer=nil, last_timer=nil )
case event
# standard play event
when :sound_iter
case @log_level
# low log level
when :low
# medium log level
when :medium
timer = @timer unless timer
if timer.elapsed > @log_play_interval
puts "played #{timer.elapsed} seconds."
end
# highest log level
when :high
@ticks += 1
timer = @timer unless timer
if @last_output.elapsed >= @log_play_interval
puts "played #{timer.elapsed} seconds, with #{@ticks} ticks. V: #{@audio_source.volume} :: F: #{@audio_source.freq}"
@last_output = Timer.new
end
end
# sound stream has started
when :sound_start
@timer = Timer.new
@last_output = Timer.new
case @log_level
when :low
when :medium
puts "started soundstream"
when :high
@ticks = 0
puts "started soundstream"
end
# sound stream has been stopped
when :sound_stop
case @log_level
when :low
when :medium
@timer = nil
when :high
@timer = nil
@ticks = nil
end
when :create_pipeline
puts "pipeline creation done" unless @log_level == :low
end
end
end
######## Timer.rb #############
class Timer
def initialize
self.start
end
def start
@start_time = Time.now
end
def elapsed
return (Time.now - @start_time)
end
def begin
@start_time
end
end
##### testHearing.rb ######
# This class represents a test case for the Player class
require 'Player.rb'
player = BlockPlayer.new lambda {|time| return_val = (time+30)/120<=1 ? (time+30)/120 : 1}, lambda {|time| 3000+(30+time)*time}
puts "starting player"
player.play_time(600)
puts "player has stopped"