raiff 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/raiff.rb +20 -10
- data/lib/raiff/chunk.rb +1 -0
- data/lib/raiff/chunk/sound_data.rb +55 -22
- data/lib/raiff/file.rb +2 -2
- data/raiff.gemspec +18 -20
- metadata +5 -6
- data/.gitignore +0 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/lib/raiff.rb
CHANGED
@@ -40,14 +40,6 @@ class Raiff
|
|
40
40
|
@sample_size = common_chunk.sample_size
|
41
41
|
@sample_rate = common_chunk.sample_rate
|
42
42
|
end
|
43
|
-
|
44
|
-
@samples = [ ]
|
45
|
-
|
46
|
-
if (@chunks['SSND'])
|
47
|
-
@chunks['SSND'].each do |sound_data|
|
48
|
-
@samples += sound_data.samples
|
49
|
-
end
|
50
|
-
end
|
51
43
|
end
|
52
44
|
end
|
53
45
|
|
@@ -55,9 +47,27 @@ class Raiff
|
|
55
47
|
"<Raiff\##{object_id} channels=#{channels} sample_frames=#{sample_frames} sample_size=#{sample_size} sample_rate=#{sample_rate}>"
|
56
48
|
end
|
57
49
|
|
58
|
-
def each_sample
|
50
|
+
def each_sample
|
59
51
|
@chunks['SSND'].each do |sound_data|
|
60
|
-
sound_data.
|
52
|
+
@file.seek(sound_data.start_offset)
|
53
|
+
|
54
|
+
sound_data.samples_count.times do
|
55
|
+
sample = sound_data.read_sample
|
56
|
+
|
57
|
+
yield(sample)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def each_sample_block(size)
|
63
|
+
@chunks['SSND'].each do |sound_data|
|
64
|
+
@file.seek(sound_data.start_offset)
|
65
|
+
|
66
|
+
block_count = (@sample_frames - 1) / size + 1
|
67
|
+
|
68
|
+
block_count.times do
|
69
|
+
yield(sound_data.read_samples(size))
|
70
|
+
end
|
61
71
|
end
|
62
72
|
end
|
63
73
|
end
|
data/lib/raiff/chunk.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
class Raiff::Chunk::SoundData < Raiff::Chunk
|
2
2
|
# == Properties ===========================================================
|
3
3
|
|
4
|
-
attr_reader :offset, :block_size
|
5
|
-
attr_reader :samples
|
4
|
+
attr_reader :offset, :block_size, :start_offset
|
6
5
|
|
7
6
|
# == Class Methods ========================================================
|
8
7
|
|
@@ -11,33 +10,67 @@ class Raiff::Chunk::SoundData < Raiff::Chunk
|
|
11
10
|
def initialize(file, common)
|
12
11
|
super(file)
|
13
12
|
|
14
|
-
|
13
|
+
@common = common
|
14
|
+
|
15
|
+
@start_offset = file.offset
|
16
|
+
@end_offset = file.offset + @size
|
15
17
|
|
16
18
|
@offset, @block_size = file.unpack('NN')
|
17
19
|
|
18
20
|
file.read(@offset)
|
19
21
|
|
20
|
-
sample_count = (end_offset - file.offset) / common.bytes_per_sample
|
21
|
-
bit_offset = common.bytes_per_sample * 8 - common.sample_size
|
22
|
-
value_offset = (1 << common.sample_size) - 1
|
22
|
+
@sample_count = (@end_offset - file.offset) / @common.bytes_per_sample
|
23
|
+
@bit_offset = @common.bytes_per_sample * 8 - @common.sample_size
|
23
24
|
|
24
|
-
@
|
25
|
+
file.advance(@sample_count * @common.bytes_per_sample)
|
26
|
+
end
|
27
|
+
|
28
|
+
def read_sample
|
29
|
+
self.decoder.call
|
30
|
+
end
|
31
|
+
|
32
|
+
def read_samples(count)
|
33
|
+
if (count + @file.offset > @end_offset)
|
34
|
+
count = (@end_offset - @file.offset) / @common.bytes_per_sample
|
35
|
+
end
|
25
36
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
if (sample = file.unpack(format))
|
32
|
-
@samples << sample.collect { |s| (s.to_i(2) >> bit_offset) - value_offset }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
else
|
36
|
-
format = %w[ C n x N ][common.bytes_per_sample] * common.channels
|
37
|
-
|
38
|
-
sample_count.times do
|
39
|
-
@samples << file.unpack(format).collect { |i| (i >> bit_offset) - value_offset }
|
40
|
-
end
|
37
|
+
samples = [ ]
|
38
|
+
_decoder = self.decoder
|
39
|
+
|
40
|
+
count.times do
|
41
|
+
samples << _decoder.call
|
41
42
|
end
|
43
|
+
|
44
|
+
samples
|
42
45
|
end
|
46
|
+
|
47
|
+
def decoder
|
48
|
+
sample_size = @common.bytes_per_sample
|
49
|
+
channels = (1..@common.channels).to_a
|
50
|
+
negative = 1 << (@common.sample_size - 1)
|
51
|
+
|
52
|
+
@decoder =
|
53
|
+
case (@bit_offset)
|
54
|
+
when 0
|
55
|
+
lambda {
|
56
|
+
channels.collect {
|
57
|
+
v = @file.read(sample_size).bytes.inject(0) do |a, b|
|
58
|
+
a << 8 | b
|
59
|
+
end
|
60
|
+
|
61
|
+
(v & negative) ? ((v ^ negative) - negative) : v
|
62
|
+
}
|
63
|
+
}
|
64
|
+
else
|
65
|
+
lambda {
|
66
|
+
channels.collect {
|
67
|
+
v = @file.read(sample_size).bytes.inject(0) do |a, b|
|
68
|
+
a << 8 | b
|
69
|
+
end >> @bit_offset - @value_offset
|
70
|
+
|
71
|
+
(v & negative) ? ((v ^ negative) - negative) : v
|
72
|
+
}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
43
76
|
end
|
data/lib/raiff/file.rb
CHANGED
@@ -55,11 +55,11 @@ class Raiff::File
|
|
55
55
|
((sign == '1') ? -1.0 : 1.0) * (fraction.to_f / ((1 << 63) - 1)) * (2 ** exponent)
|
56
56
|
end
|
57
57
|
|
58
|
-
def unpack(format)
|
58
|
+
def unpack(format, length = nil)
|
59
59
|
return if (@offset >= @data.length)
|
60
60
|
|
61
61
|
part = @data[@offset, @data.length].unpack(format)
|
62
|
-
advance(part.pack(format).length)
|
62
|
+
advance(length || part.pack(format).length)
|
63
63
|
part
|
64
64
|
|
65
65
|
rescue TypeError
|
data/raiff.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{raiff}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Scott Tadman"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-02-14}
|
13
13
|
s.description = %q{Reads in AIFF file data and audio contents}
|
14
14
|
s.email = %q{github@tadman.ca}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -17,30 +17,28 @@ Gem::Specification.new do |s|
|
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".document",
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
"test/test_raiff.rb"
|
20
|
+
"README.rdoc",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"lib/raiff.rb",
|
24
|
+
"lib/raiff/chunk.rb",
|
25
|
+
"lib/raiff/chunk/common.rb",
|
26
|
+
"lib/raiff/chunk/data.rb",
|
27
|
+
"lib/raiff/chunk/form.rb",
|
28
|
+
"lib/raiff/chunk/sound_data.rb",
|
29
|
+
"lib/raiff/file.rb",
|
30
|
+
"raiff.gemspec",
|
31
|
+
"sample/example-24bit.aiff",
|
32
|
+
"test/helper.rb",
|
33
|
+
"test/test_raiff.rb"
|
35
34
|
]
|
36
35
|
s.homepage = %q{http://github.com/twg/raiff}
|
37
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
38
36
|
s.require_paths = ["lib"]
|
39
37
|
s.rubygems_version = %q{1.3.7}
|
40
38
|
s.summary = %q{Ruby AIFF Reading Library}
|
41
39
|
s.test_files = [
|
42
40
|
"test/helper.rb",
|
43
|
-
|
41
|
+
"test/test_raiff.rb"
|
44
42
|
]
|
45
43
|
|
46
44
|
if s.respond_to? :specification_version then
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Scott Tadman
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-02-14 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -28,7 +28,6 @@ extra_rdoc_files:
|
|
28
28
|
- README.rdoc
|
29
29
|
files:
|
30
30
|
- .document
|
31
|
-
- .gitignore
|
32
31
|
- README.rdoc
|
33
32
|
- Rakefile
|
34
33
|
- VERSION
|
@@ -48,8 +47,8 @@ homepage: http://github.com/twg/raiff
|
|
48
47
|
licenses: []
|
49
48
|
|
50
49
|
post_install_message:
|
51
|
-
rdoc_options:
|
52
|
-
|
50
|
+
rdoc_options: []
|
51
|
+
|
53
52
|
require_paths:
|
54
53
|
- lib
|
55
54
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/.gitignore
DELETED