albanpeignier-alsa-backup 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|