albanpeignier-alsa-backup 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/alsa-backup.gemspec +2 -2
- data/lib/alsa.rb +4 -4
- data/lib/alsa_backup.rb +1 -1
- data/lib/alsa_backup/core_ext.rb +1 -9
- data/lib/alsa_backup/recorder.rb +22 -7
- data/lib/sndfile.rb +1 -1
- data/spec/alsa_backup/cli_spec.rb +5 -6
- data/spec/alsa_backup/core_ext_spec.rb +0 -16
- data/spec/spec_helper.rb +3 -1
- metadata +2 -2
data/History.txt
CHANGED
data/alsa-backup.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{alsa-backup}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.5"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Alban Peignier"]
|
9
|
-
s.date = %q{2009-05-
|
9
|
+
s.date = %q{2009-05-27}
|
10
10
|
s.default_executable = %q{alsa.backup}
|
11
11
|
s.description = %q{ALSA client to perform continuous recording}
|
12
12
|
s.email = ["alban.peignier@free.fr"]
|
data/lib/alsa.rb
CHANGED
@@ -17,7 +17,7 @@ module ALSA
|
|
17
17
|
def self.logger=(logger); @logger = logger; end
|
18
18
|
|
19
19
|
def self.try_to(message, &block)
|
20
|
-
logger.debug
|
20
|
+
logger.debug { message }
|
21
21
|
if ALSA::Native::error_code?(response = yield)
|
22
22
|
raise "cannot #{message} (#{ALSA::Native::strerror(response)})"
|
23
23
|
else
|
@@ -91,7 +91,7 @@ module ALSA
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def read
|
94
|
-
ALSA.logger.debug
|
94
|
+
ALSA.logger.debug { "start read with #{hw_params.sample_rate}, #{hw_params.channels} channels"}
|
95
95
|
|
96
96
|
# use an 500ms buffer
|
97
97
|
frame_count = hw_params.sample_rate / 2 * hw_params.channels
|
@@ -107,7 +107,7 @@ module ALSA
|
|
107
107
|
read_count = ALSA::try_to "read from audio interface" do
|
108
108
|
response = ALSA::PCM::Native::readi(self.handle, buffer, frame_count)
|
109
109
|
if ALSA::Native::error_code?(response)
|
110
|
-
ALSA.logger.debug
|
110
|
+
ALSA.logger.debug { "try to recover '#{ALSA::Native::strerror(response)}' on read"}
|
111
111
|
ALSA::PCM::Native::pcm_recover(self.handle, response, 1)
|
112
112
|
else
|
113
113
|
response
|
@@ -116,7 +116,7 @@ module ALSA
|
|
116
116
|
|
117
117
|
missing_frame_count = frame_count - read_count
|
118
118
|
if missing_frame_count > 0
|
119
|
-
ALSA.logger.debug
|
119
|
+
ALSA.logger.debug { "re-read missing frame count: #{missing_frame_count}"}
|
120
120
|
read_buffer_size = hw_params.buffer_size_for(read_count)
|
121
121
|
# buffer[read_buffer_size] doesn't return a MemoryPointer
|
122
122
|
read_buffer(buffer + read_buffer_size, missing_frame_count)
|
data/lib/alsa_backup.rb
CHANGED
data/lib/alsa_backup/core_ext.rb
CHANGED
@@ -9,14 +9,6 @@ end
|
|
9
9
|
|
10
10
|
class File
|
11
11
|
|
12
|
-
def self.extension(file)
|
13
|
-
if file =~ /(\.[^.]*)$/
|
14
|
-
$1
|
15
|
-
else
|
16
|
-
""
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
12
|
def self.suffix_basename(file, suffix)
|
21
13
|
dirname = File.dirname(file)
|
22
14
|
|
@@ -28,7 +20,7 @@ class File
|
|
28
20
|
dirname + "/"
|
29
21
|
end
|
30
22
|
|
31
|
-
extension = File.
|
23
|
+
extension = File.extname(file)
|
32
24
|
dirname +
|
33
25
|
File.basename(file, extension) +
|
34
26
|
suffix +
|
data/lib/alsa_backup/recorder.rb
CHANGED
@@ -15,22 +15,37 @@ module AlsaBackup
|
|
15
15
|
def start(seconds_to_record = nil)
|
16
16
|
length_controller = self.length_controller(seconds_to_record)
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
open_writer do |writer|
|
19
|
+
open_capture do |capture|
|
20
20
|
capture.read do |buffer, frame_count|
|
21
|
-
writer.write buffer, frame_count
|
21
|
+
writer.write buffer, frame_count*format[:channels]
|
22
22
|
length_controller.continue_after? frame_count
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
-
rescue Interrupt
|
27
|
-
AlsaBackup.logger.debug('recorder interrupted')
|
28
26
|
rescue Exception => e
|
27
|
+
retry if handle_error(e, seconds_to_record.nil?)
|
28
|
+
end
|
29
|
+
|
30
|
+
def open_writer(&block)
|
31
|
+
Writer.open(directory, file, format(:format => "wav pcm_16"), &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def open_capture(&block)
|
35
|
+
ALSA::PCM::Capture.open("hw:0", self.format(:sample_format => :s16_le), &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def handle_error(e, try_to_continue = true)
|
39
|
+
if Interrupt === e
|
40
|
+
AlsaBackup.logger.debug('recorder interrupted')
|
41
|
+
return false
|
42
|
+
end
|
43
|
+
|
29
44
|
AlsaBackup.logger.error(e)
|
30
45
|
AlsaBackup.logger.debug { e.backtrace.join("\n") }
|
31
46
|
|
32
|
-
if
|
33
|
-
|
47
|
+
if try_to_continue and continue_on_error?(e)
|
48
|
+
return true
|
34
49
|
else
|
35
50
|
raise e
|
36
51
|
end
|
data/lib/sndfile.rb
CHANGED
@@ -40,7 +40,7 @@ module Sndfile
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def write(buffer, frame_count)
|
43
|
-
ALSA.logger.debug
|
43
|
+
ALSA.logger.debug { "write #{frame_count} frames in #{path}"}
|
44
44
|
write_count = Sndfile::Native::write_int(@handle, buffer, frame_count)
|
45
45
|
|
46
46
|
unless write_count == frame_count
|
@@ -15,11 +15,10 @@ describe AlsaBackup::CLI, "execute" do
|
|
15
15
|
def execute_cli(options = {})
|
16
16
|
options = { :file => @file, :length => 2 }.update(options)
|
17
17
|
arguments = options.collect do |key,value|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
"--#{key}=#{value}"
|
18
|
+
if value
|
19
|
+
returning "--#{key}" do |argument|
|
20
|
+
argument << "=#{value}" unless value == true
|
21
|
+
end
|
23
22
|
end
|
24
23
|
end.compact
|
25
24
|
|
@@ -71,7 +70,7 @@ describe AlsaBackup::CLI, "execute" do
|
|
71
70
|
IO.read(pid_file).strip.should == $$.to_s
|
72
71
|
end
|
73
72
|
|
74
|
-
it "should
|
73
|
+
it "should daemonize the process with option background" do
|
75
74
|
Daemonize.should_receive(:daemonize)
|
76
75
|
execute_cli :background => true
|
77
76
|
end
|
@@ -14,22 +14,6 @@ describe Time do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
describe File do
|
17
|
-
|
18
|
-
describe "extension" do
|
19
|
-
|
20
|
-
it "should be .rb for test.rb" do
|
21
|
-
File.extension('test.rb').should == '.rb'
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should be '.' for 'test.'" do
|
25
|
-
File.extension('test.').should == '.'
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should be blank for 'test'" do
|
29
|
-
File.extension('test').should be_blank
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
17
|
|
34
18
|
describe "suffix_basename" do
|
35
19
|
|
data/spec/spec_helper.rb
CHANGED
@@ -10,7 +10,9 @@ $:.unshift(File.dirname(__FILE__) + '/../lib')
|
|
10
10
|
require 'alsa_backup'
|
11
11
|
|
12
12
|
def test_directory
|
13
|
-
File.dirname(__FILE__) + '/../tmp'
|
13
|
+
directory = File.dirname(__FILE__) + '/../tmp'
|
14
|
+
Dir.mkdir(directory) unless File.exists?(directory)
|
15
|
+
directory
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_file(name = 'test.wav')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: albanpeignier-alsa-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alban Peignier
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-27 00:00:00 -07:00
|
13
13
|
default_executable: alsa.backup
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|