Class: AlsaBackup::Writer

Inherits:
Object
  • Object
show all
Defined in:
lib/alsa_backup/writer.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Writer

Returns a new instance of Writer.



13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/alsa_backup/writer.rb', line 13

def initialize(options = {})
  options = { 
    :format => Writer.default_format 
  }.update(options)

  @directory = options[:directory]
  @file = options[:file]
  @format = options[:format]

  @on_close_callbacks = []
  @on_close_callbacks << options[:on_close] if options[:on_close]
end

Instance Attribute Details

#directoryObject

Returns the value of attribute directory.



7
8
9
# File 'lib/alsa_backup/writer.rb', line 7

def directory
  @directory
end

#fileObject

Returns the value of attribute file.



7
8
9
# File 'lib/alsa_backup/writer.rb', line 7

def file
  @file
end

#formatObject

Returns the value of attribute format.



7
8
9
# File 'lib/alsa_backup/writer.rb', line 7

def format
  @format
end

#on_close_callbacksObject

Returns the value of attribute on_close_callbacks.



7
8
9
# File 'lib/alsa_backup/writer.rb', line 7

def on_close_callbacks
  @on_close_callbacks
end

Class Method Details

.default_formatObject



9
10
11
# File 'lib/alsa_backup/writer.rb', line 9

def self.default_format
  {:sample_rate => 44100, :channels => 2, :format => "wav pcm_16"}
end

.delete_empty_file(file) ⇒ Object



102
103
104
105
106
107
# File 'lib/alsa_backup/writer.rb', line 102

def self.delete_empty_file(file)
  if File.exists?(file) and File.size(file) <= 44
    AlsaBackup.logger.warn("remove empty file #{file}")
    File.delete file
  end
end

.open(options, &block) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/alsa_backup/writer.rb', line 26

def self.open(options, &block)
  writer = Writer.new(options)
  begin
    writer.prepare
    yield writer
  ensure
    writer.close
  end
end

.rename_existing_file(file) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/alsa_backup/writer.rb', line 109

def self.rename_existing_file(file)
  if File.exists?(file)
    index = 1

    while File.exists?(new_file = File.suffix_basename(file, "-#{index}"))
      index += 1

      raise "can't find a free file for #{file}" if index > 1000
    end

    AlsaBackup.logger.warn "rename existing file #{File.basename(file)} into #{new_file}"
    File.rename(file, new_file)
  end
end

Instance Method Details

#closeObject



46
47
48
# File 'lib/alsa_backup/writer.rb', line 46

def close
  close_file
end

#close_fileObject



50
51
52
53
54
55
56
# File 'lib/alsa_backup/writer.rb', line 50

def close_file
  if @sndfile
    on_close(@sndfile.path)
    @sndfile.close
  end
  @sndfile = nil
end

#on_close(file) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/alsa_backup/writer.rb', line 58

def on_close(file)
  AlsaBackup.logger.info('close current file')
  return if Writer.delete_empty_file(file)

  AlsaBackup.logger.debug("invoke #{@on_close_callbacks.size} callback(s)")
  @on_close_callbacks.each do |callback|
    begin
      callback.call(file) 
    rescue Exception => e
      AlsaBackup.logger.error("error in on_close callback : #{e}")
      AlsaBackup.logger.debug { e.backtrace.join("\n") }
    end
  end
end

#prepareObject



36
37
38
39
40
# File 'lib/alsa_backup/writer.rb', line 36

def prepare
  # prepare sndfile
  self.sndfile
  self
end

#sndfileObject



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/alsa_backup/writer.rb', line 86

def sndfile
  target_file = self.target_file
  raise "no recording file" unless target_file

  unless @sndfile and @sndfile.path == target_file
    close_file

    Writer.rename_existing_file(target_file)
    AlsaBackup.logger.info{"new file #{File.expand_path target_file}"}

    FileUtils.mkdir_p File.dirname(target_file)
    @sndfile = Sndfile::File.new(target_file, "w", self.format)
  end
  @sndfile
end

#target_fileObject



82
83
84
# File 'lib/alsa_backup/writer.rb', line 82

def target_file
  File.join self.directory, self.file
end

#write(*arguments) ⇒ Object



42
43
44
# File 'lib/alsa_backup/writer.rb', line 42

def write(*arguments)
  self.sndfile.write *arguments
end