alsa-backup 0.0.8 → 0.10

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.
@@ -16,7 +16,7 @@ describe AlsaBackup::CLI, "execute" do
16
16
  options = { :file => @file, :length => 2 }.update(options)
17
17
  arguments = options.collect do |key,value|
18
18
  if value
19
- returning "--#{key}" do |argument|
19
+ "--#{key}".tap do |argument|
20
20
  argument << "=#{value}" unless value == true
21
21
  end
22
22
  end
@@ -0,0 +1,41 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe AlsaBackup::LengthController do
4
+
5
+ def continue_after(frame_count)
6
+ simple_matcher("continue after #{frame_count} frames") do |actual|
7
+ actual.continue_after?(frame_count)
8
+ end
9
+ end
10
+
11
+ describe AlsaBackup::LengthController::Loop do
12
+
13
+ before(:each) do
14
+ @controller = AlsaBackup::LengthController::Loop.new
15
+ end
16
+
17
+ it "should always continue" do
18
+ @controller.should continue_after(123)
19
+ end
20
+
21
+ end
22
+
23
+ describe AlsaBackup::LengthController::FrameCount do
24
+
25
+ before(:each) do
26
+ @controller = AlsaBackup::LengthController::FrameCount.new(123)
27
+ end
28
+
29
+ it "should not continue after controller frame count" do
30
+ @controller.should_not continue_after(@controller.frame_count)
31
+ end
32
+
33
+ it "should decrement controller frame count after each test" do
34
+ lambda {
35
+ @controller.continue_after?(10)
36
+ }.should change(@controller, :frame_count).by(-10)
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -47,6 +47,20 @@ describe AlsaBackup::Recorder do
47
47
  @recorder.start
48
48
  end
49
49
 
50
+ describe "alsa_options" do
51
+
52
+ it "should use buffer_time if specified" do
53
+ @recorder.buffer_time = 100000
54
+ @recorder.alsa_options[:buffer_time].should == 100000
55
+ end
56
+
57
+ it "should use period_time if specified" do
58
+ @recorder.period_time = 100000
59
+ @recorder.alsa_options[:period_time].should == 100000
60
+ end
61
+
62
+ end
63
+
50
64
  describe "error handler" do
51
65
 
52
66
  class TestErrorHandler
@@ -142,4 +156,20 @@ describe AlsaBackup::Recorder do
142
156
 
143
157
  end
144
158
 
159
+ describe "open_capture" do
160
+
161
+ it "should use specified device" do
162
+ @recorder.stub :device => "dummy"
163
+ ALSA::PCM::Capture.should_receive(:open).with("dummy", anything())
164
+ @recorder.open_capture {}
165
+ end
166
+
167
+ it "should use alsa_options" do
168
+ @recorder.stub :alsa_options => { :dummy => true }
169
+ ALSA::PCM::Capture.should_receive(:open).with(anything(), @recorder.alsa_options)
170
+ @recorder.open_capture {}
171
+ end
172
+
173
+ end
174
+
145
175
  end
@@ -8,7 +8,7 @@ describe AlsaBackup::Writer do
8
8
  @writer = AlsaBackup::Writer.new :directory => @directory, :file => @file
9
9
  end
10
10
 
11
- describe "when created" do
11
+ context "when created" do
12
12
 
13
13
  it "should use the :directory option as directory" do
14
14
  AlsaBackup::Writer.new(:directory => @directory).directory.should == @directory
@@ -34,33 +34,103 @@ describe AlsaBackup::Writer do
34
34
 
35
35
  end
36
36
 
37
- describe "on_close" do
37
+ describe "#on_close" do
38
+
39
+ class TestCallback
40
+
41
+ attr_reader :file
42
+
43
+ def call(file)
44
+ @file = file
45
+ end
46
+
47
+ def invoked?
48
+ not @file.nil?
49
+ end
50
+
51
+ end
52
+
53
+ let(:callback) { TestCallback.new }
54
+
55
+ before(:each) do
56
+ @writer.on_close_callbacks << callback
57
+ end
38
58
 
39
- it "should include a callback which delete empty file" do
40
- AlsaBackup::Writer.should_receive(:delete_empty_file).with(@file)
59
+ it "should check if file is empty" do
60
+ AlsaBackup::Writer.should_receive(:delete_empty_file).with(@file).and_return(true)
41
61
  @writer.on_close(@file)
42
62
  end
43
63
 
44
- it "should invoke all on_close_callbacks" do
45
- file_given_to_proc = nil
64
+ context "when file was empty" do
46
65
 
47
- @writer.on_close_callbacks << Proc.new do |file|
48
- file_given_to_proc = file
66
+ before(:each) do
67
+ AlsaBackup::Writer.stub :delete_empty_file => true
68
+ end
69
+
70
+ it "should not invoke callbacks" do
71
+ @writer.on_close(@file)
72
+ callback.should_not be_invoked
49
73
  end
50
- @writer.on_close(@file)
51
74
 
52
- file_given_to_proc.should == @file
75
+ end
76
+
77
+ it "should invoke all on_close_callbacks" do
78
+ @writer.on_close(@file)
79
+ callback.should be_invoked
53
80
  end
54
81
 
55
82
  it "should ignore exception from callbacks" do
56
- @writer.on_close_callbacks << Proc.new do |file|
57
- raise "Error"
58
- end
83
+ callback.stub!(:call).and_raise("Error")
59
84
  lambda { @writer.on_close(@file) }.should_not raise_error
60
85
  end
61
86
 
62
87
  end
63
88
 
89
+ describe ".delete_empty_file" do
90
+
91
+ let(:file) { "tmp/deleted_empty_file" }
92
+
93
+ after(:each) do
94
+ File.delete(file) if File.exists?(file)
95
+ end
96
+
97
+ context "when file contains 44 bytes or less" do
98
+
99
+ before(:each) do
100
+ File.open(file, "w") { |f| f.write 'a'*44 }
101
+ end
102
+
103
+ it "should remove a file" do
104
+ AlsaBackup::Writer.delete_empty_file(file)
105
+ File.exists?(file).should be_false
106
+ end
107
+
108
+ it "should return true" do
109
+ AlsaBackup::Writer.delete_empty_file(file).should be_true
110
+ end
111
+
112
+ end
113
+
114
+ context "when file contains more than 44 bytes" do
115
+
116
+ before(:each) do
117
+ File.open(file, "w") { |f| f.write "a"*45 }
118
+ end
119
+
120
+ it "should not remove the file" do
121
+ AlsaBackup::Writer.delete_empty_file(file)
122
+ File.exists?(file).should be_true
123
+ end
124
+
125
+ it "should return false" do
126
+ AlsaBackup::Writer.delete_empty_file(file).should be_false
127
+ end
128
+
129
+ end
130
+
131
+
132
+ end
133
+
64
134
  describe "file" do
65
135
 
66
136
  it "should accept file as string" do
@@ -1,3 +1,5 @@
1
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
2
+
1
3
  begin
2
4
  require 'spec'
3
5
  rescue LoadError
@@ -14,12 +14,6 @@ EOS
14
14
  exit(0)
15
15
  end
16
16
 
17
- desc "Run the specs under spec/models"
18
- Spec::Rake::SpecTask.new do |t|
19
- t.spec_opts = ['--options', "spec/spec.opts"]
20
- t.spec_files = FileList['spec/**/*_spec.rb']
21
- end
22
-
23
17
  namespace :spec do
24
18
  desc "Generate spec HTML report"
25
19
  Spec::Rake::SpecTask.new('html') do |t|
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alsa-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ hash: 31
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 10
9
+ version: "0.10"
5
10
  platform: ruby
6
11
  authors:
7
12
  - Alban Peignier
@@ -9,59 +14,89 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-01-23 00:00:00 +01:00
17
+ date: 2010-10-14 00:00:00 +02:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: ffi
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
20
25
  requirements:
21
26
  - - ">="
22
27
  - !ruby/object:Gem::Version
28
+ hash: 25
29
+ segments:
30
+ - 0
31
+ - 3
32
+ - 5
23
33
  version: 0.3.5
24
- version:
34
+ type: :runtime
35
+ version_requirements: *id001
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: newgem
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
30
41
  requirements:
31
42
  - - ">="
32
43
  - !ruby/object:Gem::Version
33
- version: 1.5.2
34
- version:
44
+ hash: 5
45
+ segments:
46
+ - 1
47
+ - 5
48
+ - 3
49
+ version: 1.5.3
50
+ type: :runtime
51
+ version_requirements: *id002
35
52
  - !ruby/object:Gem::Dependency
36
53
  name: daemons
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
40
57
  requirements:
41
58
  - - ">="
42
59
  - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 1
63
+ - 0
64
+ - 10
43
65
  version: 1.0.10
44
- version:
66
+ type: :runtime
67
+ version_requirements: *id003
45
68
  - !ruby/object:Gem::Dependency
46
69
  name: newgem
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
70
+ prerelease: false
71
+ requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
50
73
  requirements:
51
74
  - - ">="
52
75
  - !ruby/object:Gem::Version
53
- version: 1.5.2
54
- version:
76
+ hash: 5
77
+ segments:
78
+ - 1
79
+ - 5
80
+ - 3
81
+ version: 1.5.3
82
+ type: :development
83
+ version_requirements: *id004
55
84
  - !ruby/object:Gem::Dependency
56
85
  name: hoe
57
- type: :development
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
88
+ none: false
60
89
  requirements:
61
90
  - - ">="
62
91
  - !ruby/object:Gem::Version
63
- version: 2.5.0
64
- version:
92
+ hash: 19
93
+ segments:
94
+ - 2
95
+ - 6
96
+ - 2
97
+ version: 2.6.2
98
+ type: :development
99
+ version_requirements: *id005
65
100
  description: ALSA client to perform continuous recording
66
101
  email:
67
102
  - alban@tryphon.eu
@@ -75,6 +110,8 @@ extra_rdoc_files:
75
110
  - PostInstall.txt
76
111
  files:
77
112
  - .autotest
113
+ - COPYING
114
+ - COPYRIGHT
78
115
  - History.txt
79
116
  - Manifest.txt
80
117
  - PostInstall.txt
@@ -84,7 +121,6 @@ files:
84
121
  - alsa-backup.gemspec
85
122
  - bin/alsa-backup
86
123
  - config.sample
87
- - lib/alsa.rb
88
124
  - lib/alsa_backup.rb
89
125
  - lib/alsa_backup/cli.rb
90
126
  - lib/alsa_backup/core_ext.rb
@@ -92,15 +128,16 @@ files:
92
128
  - lib/alsa_backup/recorder.rb
93
129
  - lib/alsa_backup/writer.rb
94
130
  - lib/sndfile.rb
131
+ - lib/syslog_logger.rb
95
132
  - script/console
96
133
  - script/destroy
97
134
  - script/generate
98
- - spec/alsa/pcm_spec.rb
135
+ - setup.rb
99
136
  - spec/alsa_backup/cli_spec.rb
100
137
  - spec/alsa_backup/core_ext_spec.rb
138
+ - spec/alsa_backup/length_recorder_spec.rb
101
139
  - spec/alsa_backup/recorder_spec.rb
102
140
  - spec/alsa_backup/writer_spec.rb
103
- - spec/alsa_backup_spec.rb
104
141
  - spec/fixtures/config_test.rb
105
142
  - spec/sndfile/info_spec.rb
106
143
  - spec/spec.opts
@@ -117,21 +154,27 @@ rdoc_options:
117
154
  require_paths:
118
155
  - lib
119
156
  required_ruby_version: !ruby/object:Gem::Requirement
157
+ none: false
120
158
  requirements:
121
159
  - - ">="
122
160
  - !ruby/object:Gem::Version
161
+ hash: 3
162
+ segments:
163
+ - 0
123
164
  version: "0"
124
- version:
125
165
  required_rubygems_version: !ruby/object:Gem::Requirement
166
+ none: false
126
167
  requirements:
127
168
  - - ">="
128
169
  - !ruby/object:Gem::Version
170
+ hash: 3
171
+ segments:
172
+ - 0
129
173
  version: "0"
130
- version:
131
174
  requirements: []
132
175
 
133
176
  rubyforge_project: alsa-backup
134
- rubygems_version: 1.3.5
177
+ rubygems_version: 1.3.7
135
178
  signing_key:
136
179
  specification_version: 3
137
180
  summary: ALSA client to perform continuous recording
@@ -1,299 +0,0 @@
1
- require 'ffi'
2
-
3
- require 'logger'
4
-
5
- module ALSA
6
-
7
- def self.logger
8
- unless @logger
9
- @logger = Logger.new(STDERR)
10
- @logger.level = Logger::WARN
11
- end
12
-
13
- @logger
14
- end
15
-
16
- def self.logger=(logger); @logger = logger; end
17
-
18
- def self.try_to(message, &block)
19
- logger.debug { message }
20
- if ALSA::Native::error_code?(response = yield)
21
- raise "cannot #{message} (#{ALSA::Native::strerror(response)})"
22
- else
23
- response
24
- end
25
- end
26
-
27
- module Native
28
- extend FFI::Library
29
- ffi_lib "libasound.so"
30
-
31
- attach_function :strerror, :snd_strerror, [:int], :string
32
-
33
- def self.error_code?(response)
34
- response < 0
35
- end
36
- end
37
-
38
- module PCM
39
-
40
- class Capture
41
-
42
- attr_accessor :handle
43
-
44
- def self.open(device, hardware_attributes = {}, &block)
45
- Capture.new.open(device, hardware_attributes, &block)
46
- end
47
-
48
- def open(device, hardware_attributes = {}, &block)
49
- capture_handle = FFI::MemoryPointer.new :pointer
50
- ALSA::try_to "open audio device #{device}" do
51
- ALSA::PCM::Native::open capture_handle, device, ALSA::PCM::Native::STREAM_CAPTURE, ALSA::PCM::Native::BLOCK
52
- end
53
- self.handle = capture_handle.read_pointer
54
-
55
- self.hardware_parameters=hardware_attributes
56
-
57
- if block_given?
58
- begin
59
- yield self
60
- ensure
61
- self.close
62
- end
63
- end
64
- end
65
-
66
- def change_hardware_parameters
67
- hw_params = HwParameters.new(self).default_for_device
68
-
69
- begin
70
- yield hw_params
71
-
72
- ALSA::try_to "set hw parameters" do
73
- ALSA::PCM::Native::hw_params self.handle, hw_params.handle
74
- end
75
- ensure
76
- hw_params.free
77
- end
78
- end
79
-
80
- def hardware_parameters
81
- HwParameters.new(self).current_for_device
82
- end
83
- alias_method :hw_params, :hardware_parameters
84
-
85
- def hardware_parameters=(attributes= {})
86
- attributes = {:access => :rw_interleaved}.update(attributes)
87
- change_hardware_parameters do |hw_params|
88
- hw_params.update_attributes(attributes)
89
- end
90
- end
91
-
92
- def read
93
- ALSA.logger.debug { "start read with #{hw_params.sample_rate}, #{hw_params.channels} channels"}
94
-
95
- # use an 500ms buffer
96
- frame_count = hw_params.sample_rate / 2
97
- ALSA.logger.debug { "allocate #{hw_params.buffer_size_for(frame_count)} bytes for #{frame_count} frames" }
98
- FFI::MemoryPointer.new(:char, hw_params.buffer_size_for(frame_count)) do |buffer|
99
- begin
100
- read_buffer buffer, frame_count
101
- end while yield buffer, frame_count
102
- end
103
- end
104
-
105
- def read_buffer(buffer, frame_count)
106
- read_count = ALSA::try_to "read from audio interface" do
107
- response = ALSA::PCM::Native::readi(self.handle, buffer, frame_count)
108
- if ALSA::Native::error_code?(response)
109
- ALSA.logger.warn { "try to recover '#{ALSA::Native::strerror(response)}' on read"}
110
- ALSA::PCM::Native::pcm_recover(self.handle, response, 1)
111
- else
112
- response
113
- end
114
- end
115
-
116
- missing_frame_count = frame_count - read_count
117
- if missing_frame_count > 0
118
- ALSA.logger.debug { "re-read missing frame count: #{missing_frame_count}"}
119
- read_buffer_size = hw_params.buffer_size_for(read_count)
120
- # buffer[read_buffer_size] doesn't return a MemoryPointer
121
- read_buffer(buffer + read_buffer_size, missing_frame_count)
122
- end
123
- end
124
-
125
- def close
126
- ALSA::try_to "close audio device" do
127
- ALSA::PCM::Native::close self.handle
128
- end
129
- end
130
-
131
- class HwParameters
132
-
133
- attr_accessor :handle, :device
134
-
135
- def initialize(device = nil)
136
- hw_params_pointer = FFI::MemoryPointer.new :pointer
137
-
138
- ALSA::PCM::Native::hw_params_malloc hw_params_pointer
139
- self.handle = hw_params_pointer.read_pointer
140
-
141
- self.device = device if device
142
- end
143
-
144
- def update_attributes(attributes)
145
- attributes.each_pair { |name, value| send("#{name}=", value) }
146
- end
147
-
148
- def default_for_device
149
- ALSA::try_to "initialize hardware parameter structure" do
150
- ALSA::PCM::Native::hw_params_any device.handle, self.handle
151
- end
152
- self
153
- end
154
-
155
- def current_for_device
156
- ALSA::try_to "retrieve current hardware parameters" do
157
- ALSA::PCM::Native::hw_params_current device.handle, self.handle
158
- end
159
- self
160
- end
161
-
162
- def access=(access)
163
- ALSA::try_to "set access type" do
164
- ALSA::PCM::Native::hw_params_set_access self.device.handle, self.handle, ALSA::PCM::Native::Access.const_get(access.to_s.upcase)
165
- end
166
- end
167
-
168
- def channels=(channels)
169
- ALSA::try_to "set channel count : #{channels}" do
170
- ALSA::PCM::Native::hw_params_set_channels self.device.handle, self.handle, channels
171
- end
172
- end
173
-
174
- def sample_rate=(sample_rate)
175
- ALSA::try_to "set sample rate" do
176
- rate = FFI::MemoryPointer.new(:int)
177
- rate.write_int(sample_rate)
178
-
179
- dir = FFI::MemoryPointer.new(:int)
180
- dir.write_int(0)
181
-
182
- error_code = ALSA::PCM::Native::hw_params_set_rate_near self.device.handle, self.handle, rate, dir
183
-
184
- rate.free
185
- dir.free
186
-
187
- error_code
188
- end
189
- end
190
-
191
- def sample_rate
192
- rate = nil
193
- ALSA::try_to "get sample rate" do
194
- rate_pointer = FFI::MemoryPointer.new(:int)
195
- dir_pointer = FFI::MemoryPointer.new(:int)
196
- dir_pointer.write_int(0)
197
-
198
- error_code = ALSA::PCM::Native::hw_params_get_rate self.handle, rate_pointer, dir_pointer
199
-
200
- rate = rate_pointer.read_int
201
-
202
- rate_pointer.free
203
- dir_pointer.free
204
-
205
- error_code
206
- end
207
- rate
208
- end
209
-
210
- def sample_format=(sample_format)
211
- ALSA::try_to "set sample format" do
212
- ALSA::PCM::Native::hw_params_set_format self.device.handle, self.handle, ALSA::PCM::Native::Format.const_get(sample_format.to_s.upcase)
213
- end
214
- end
215
-
216
- def sample_format
217
- format = nil
218
- FFI::MemoryPointer.new(:int) do |format_pointer|
219
- ALSA::try_to "get sample format" do
220
- ALSA::PCM::Native::hw_params_get_format self.handle, format_pointer
221
- end
222
- format = format_pointer.read_int
223
- end
224
- format
225
- end
226
-
227
- def channels
228
- channels = nil
229
- FFI::MemoryPointer.new(:int) do |channels_pointer|
230
- ALSA::try_to "get channels" do
231
- ALSA::PCM::Native::hw_params_get_channels self.handle, channels_pointer
232
- end
233
- channels = channels_pointer.read_int
234
- end
235
- channels
236
- end
237
-
238
- def buffer_size_for(frame_count)
239
- ALSA::PCM::Native::format_size(self.sample_format, frame_count) * self.channels
240
- end
241
-
242
- def free
243
- ALSA::try_to "unallocate hw_params" do
244
- ALSA::PCM::Native::hw_params_free self.handle
245
- end
246
- end
247
-
248
- end
249
-
250
- end
251
-
252
- module Native
253
- extend FFI::Library
254
- ffi_lib "libasound.so"
255
-
256
- STREAM_CAPTURE = 1
257
- BLOCK = 0
258
- attach_function :open, :snd_pcm_open, [:pointer, :string, :int, :int], :int
259
- attach_function :prepare, :snd_pcm_prepare, [ :pointer ], :int
260
- attach_function :close, :snd_pcm_close, [:pointer], :int
261
-
262
- attach_function :readi, :snd_pcm_readi, [ :pointer, :pointer, :ulong ], :long
263
-
264
- attach_function :pcm_recover, :snd_pcm_recover, [ :pointer, :int, :int ], :int
265
-
266
- attach_function :hw_params_malloc, :snd_pcm_hw_params_malloc, [:pointer], :int
267
- attach_function :hw_params_free, :snd_pcm_hw_params_free, [:pointer], :int
268
-
269
- attach_function :hw_params, :snd_pcm_hw_params, [ :pointer, :pointer ], :int
270
- attach_function :hw_params_any, :snd_pcm_hw_params_any, [:pointer, :pointer], :int
271
- attach_function :hw_params_current, :snd_pcm_hw_params_current, [ :pointer, :pointer ], :int
272
-
273
-
274
- module Access
275
- MMAP_INTERLEAVED = 0
276
- MMAP_NONINTERLEAVED = 1
277
- MMAP_COMPLEX = 2
278
- RW_INTERLEAVED = 3
279
- RW_NONINTERLEAVED = 4
280
- end
281
-
282
- attach_function :hw_params_set_access, :snd_pcm_hw_params_set_access, [ :pointer, :pointer, :int ], :int
283
-
284
- module Format
285
- S16_LE = 2
286
- end
287
-
288
- attach_function :hw_params_set_format, :snd_pcm_hw_params_set_format, [ :pointer, :pointer, :int ], :int
289
- attach_function :hw_params_get_format, :snd_pcm_hw_params_get_format, [ :pointer, :pointer ], :int
290
- attach_function :hw_params_get_rate, :snd_pcm_hw_params_get_rate, [ :pointer, :pointer, :pointer ], :int
291
- attach_function :hw_params_set_rate_near, :snd_pcm_hw_params_set_rate_near, [ :pointer, :pointer, :pointer, :pointer ], :int
292
- attach_function :hw_params_set_channels, :snd_pcm_hw_params_set_channels, [ :pointer, :pointer, :uint ], :int
293
- attach_function :hw_params_get_channels, :snd_pcm_hw_params_get_format, [ :pointer, :pointer ], :int
294
- attach_function :hw_params_set_periods, :snd_pcm_hw_params_set_periods, [ :pointer, :pointer, :uint, :int ], :int
295
-
296
- attach_function :format_size, :snd_pcm_format_size, [ :int, :uint ], :int
297
- end
298
- end
299
- end