lib/punchblock/translator/freeswitch/component/record.rb
# encoding: utf-8
module Punchblock
module Translator
class Freeswitch
module Component
class Record < Component
RECORDING_BASE_PATH = '/var/punchblock/record'
def setup
@complete_reason = nil
end
def execute
max_duration = @component_node.max_duration || -1
initial_timeout = @component_node.initial_timeout || -1
final_timeout = @component_node.final_timeout || -1
raise OptionError, 'A start-beep value of true is unsupported.' if @component_node.start_beep
raise OptionError, 'A start-paused value of true is unsupported.' if @component_node.start_paused
raise OptionError, 'A max-duration value that is negative (and not -1) is invalid.' unless max_duration >= -1
@format = @component_node.format || 'wav'
component = current_actor
call.register_handler :es, :event_name => 'RECORD_STOP', [:[], :record_file_path] => filename do |event|
component.finished
end
record_args = ['start', filename]
record_args << max_duration/1000 unless max_duration == -1
direction = case @component_node.direction
when :send then :RECORD_WRITE_ONLY
when :recv then :RECORD_READ_ONLY
else :RECORD_STEREO
end
setvar direction, true
setvar :RECORD_INITIAL_TIMEOUT_MS, initial_timeout > -1 ? initial_timeout : 0
setvar :RECORD_FINAL_TIMEOUT_MS, final_timeout > -1 ? final_timeout : 0
call.uuid_foo :record, record_args.join(' ')
send_ref
rescue OptionError => e
with_error 'option error', e.message
end
def execute_command(command)
case command
when Punchblock::Component::Stop
call.uuid_foo :record, "stop #{filename}"
@complete_reason = stop_reason
command.response = true
else
super
end
end
def finished
send_complete_event(@complete_reason || max_duration_reason)
end
private
def setvar(key, value)
call.uuid_foo :setvar, "#{key} #{value}"
end
def filename
File.join RECORDING_BASE_PATH, [id, @format].join('.')
end
def recording
Punchblock::Component::Record::Recording.new :uri => "file://#{filename}"
end
def stop_reason
Punchblock::Event::Complete::Stop.new
end
def max_duration_reason
Punchblock::Component::Record::Complete::MaxDuration.new
end
def send_complete_event(reason)
super reason, recording
end
end
end
end
end
end