Sha256: f684c3d54afa770249e92dd325c07c0f4d62cc9b8c8be7c97fba595e434d3fd3

Contents?: true

Size: 1.76 KB

Versions: 2

Compression:

Stored size: 1.76 KB

Contents

require 'alsa'

module AlsaBackup
  class Recorder

    def initialize(file = "record.wav")
      @file = File.basename(file)
      @directory = File.dirname(file)

      @error_handler = Proc.new { |e| true }
    end

    attr_accessor :file, :directory, :error_handler

    def start(seconds_to_record = nil)
      length_controller = self.length_controller(seconds_to_record)

      Writer.open(directory, file, format(:format => "wav pcm_16")) do |writer|
        ALSA::PCM::Capture.open("hw:0", self.format(:sample_format => :s16_le)) do |capture|
          capture.read do |buffer, frame_count|
            writer.write buffer, frame_count
            length_controller.continue_after? frame_count
          end
        end
      end
    rescue Interrupt
      AlsaBackup.logger.debug('recorder interrupted')      
    rescue Exception => e
      AlsaBackup.logger.error(e)
      AlsaBackup.logger.debug { e.backtrace.join("\n") }

      if seconds_to_record.nil? and continue_on_error?(e)
        retry
      else
        raise e
      end
    end

    def continue_on_error?(e)
      error_handler_response = @error_handler.call(e) if @error_handler

      if error_handler_response
        sleep_time = Numeric === error_handler_response ? error_handler_response : 5
        AlsaBackup.logger.warn("sleep #{sleep_time}s before retrying")
        sleep sleep_time
      end

      error_handler_response
    end

    def format(additional_parameters = {})
      {:sample_rate => 44100, :channels => 2}.merge(additional_parameters)
    end

    def length_controller(seconds_to_record)
      if seconds_to_record
        AlsaBackup::LengthController::FrameCount.new format[:sample_rate] * seconds_to_record 
      else
        AlsaBackup::LengthController::Loop.new
      end
    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
albanpeignier-alsa-backup-0.0.3 lib/alsa_backup/recorder.rb
albanpeignier-alsa-backup-0.0.4 lib/alsa_backup/recorder.rb