adhearsion/punchblock

View on GitHub
lib/punchblock/translator/freeswitch/component/record.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# 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