ffi-openmpt 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -5
- data/CHANGES.md +24 -0
- data/README.md +9 -6
- data/examples/mod-2-raw +4 -4
- data/examples/mod-info +6 -6
- data/ffi-openmpt.gemspec +2 -2
- data/lib/ffi/openmpt/module.rb +44 -12
- data/lib/ffi/openmpt/openmpt.rb +4 -6
- data/lib/ffi/openmpt/string.rb +2 -3
- data/lib/ffi/openmpt/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d30e0517446c3cf2bfabeefd2d7b3ec0db4485a27a8ee6564a854826c5a5e90
|
4
|
+
data.tar.gz: eb85f0fc61a052cfc7d032634a3229d4527d1579931d67e3e23c1ed1b658e8b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef774fbdfa2c3c80d39dee216fdf09ad894a79a8f6f1895c09101460c622239d5257cdf046bb790f097f4bf7350aa234739e1ffe7fd73e993a7910e7b90f2167
|
7
|
+
data.tar.gz: 26f6137c8f81ea90c1ebe205ed8fa2686c022d5b959d828275a323fc5116ef0b60073b6b1de7ca7fc6b59cd0d06af5eb91c035a57496a399fe0765757c6f5cdf
|
data/.travis.yml
CHANGED
@@ -4,15 +4,15 @@ language: ruby
|
|
4
4
|
cache: bundler
|
5
5
|
|
6
6
|
before_install:
|
7
|
-
- gem install bundler -v
|
7
|
+
- gem install bundler -v 2.0.1
|
8
8
|
- ./test/install-libopenmpt.sh
|
9
9
|
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TRAVIS_BUILD_DIR/usr/lib
|
10
10
|
|
11
11
|
rvm:
|
12
|
-
- 2.2.10
|
13
12
|
- 2.3.8
|
14
13
|
- 2.4.5
|
15
|
-
- 2.5.
|
14
|
+
- 2.5.5
|
15
|
+
- 2.6.2
|
16
16
|
- rbx-3
|
17
17
|
- ruby-head
|
18
18
|
|
@@ -29,7 +29,5 @@ matrix:
|
|
29
29
|
exclude:
|
30
30
|
- rvm: rbx-3
|
31
31
|
env: TEST_LIBOPENMPT_VERSION=0.3.12
|
32
|
-
- rvm: 2.2.10
|
33
|
-
env: TEST_LIBOPENMPT_VERSION=0.3.12
|
34
32
|
- rvm: 2.3.8
|
35
33
|
env: TEST_LIBOPENMPT_VERSION=0.3.12
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,29 @@
|
|
1
1
|
# Changes log for the Ruby OpenMPT library (ffi-openmpt)
|
2
2
|
|
3
|
+
## Version 0.4.0
|
4
|
+
|
5
|
+
* Update the minimum ruby version to 2.3.
|
6
|
+
* Update to use bundler 2.0.1.
|
7
|
+
* Update the string example in README.md.
|
8
|
+
* Simplify the API string code example.
|
9
|
+
* Add sample_name to the ruby interface.
|
10
|
+
* Align info method names with the C++ API.
|
11
|
+
* Ensure memory is always freed in String::get.
|
12
|
+
* Ensure memory is always freed in Module methods.
|
13
|
+
* Ensure memory is always freed in OpenMPT methods.
|
14
|
+
* Update the memory handling code example in the README.
|
15
|
+
* Use `warn` not `puts` for error messages in mod-2-raw.
|
16
|
+
* Fix wording of an error message in mod-2-raw.
|
17
|
+
* Add Module#sample_names to the ruby interface.
|
18
|
+
* Add a note in Module::new about MemoryPointer.
|
19
|
+
* Remove Module#sample_name. It's not in the C++ API.
|
20
|
+
* Generalize getting name lists from a mod.
|
21
|
+
* Add Module#instrument_names to the ruby interface.
|
22
|
+
* Add Module#pattern_names to the ruby interface.
|
23
|
+
* Add Module#order_names to the ruby interface.
|
24
|
+
* Add Module#channel_names to the ruby interface.
|
25
|
+
* Add Module#subsong_names to the ruby interface.
|
26
|
+
|
3
27
|
## Version 0.3.0
|
4
28
|
|
5
29
|
* Wrap the libopenmpt module read mono functions.
|
data/README.md
CHANGED
@@ -55,17 +55,20 @@ Not all `libopenmpt` methods are wrapped yet, but enough functionality is suppli
|
|
55
55
|
`libopenmpt` manages the memory of any strings it returns. This means that you must free up such memory explicitly after you have finished with them when using the C API. Such strings are returned to ruby as [`FFI::Pointer`][ffi-pointer] objects, so the string value can be copied to a ruby string as follows:
|
56
56
|
|
57
57
|
```ruby
|
58
|
-
|
59
|
-
ptr = openmpt_get_string('url')
|
60
|
-
str = ptr.read_string
|
61
|
-
|
58
|
+
begin
|
59
|
+
ptr = FFI::OpenMPT::API.openmpt_get_string('url')
|
60
|
+
str = ptr.read_string
|
61
|
+
ensure
|
62
|
+
FFI::OpenMPT::API.openmpt_free_string(ptr)
|
63
|
+
end
|
64
|
+
|
62
65
|
puts str
|
63
66
|
```
|
64
67
|
|
65
68
|
The ruby interface handles all this for you:
|
66
69
|
|
67
70
|
```ruby
|
68
|
-
str = FFI::OpenMPT.
|
71
|
+
str = FFI::OpenMPT::String.get(:url)
|
69
72
|
puts str
|
70
73
|
```
|
71
74
|
|
@@ -127,7 +130,7 @@ Until this library reaches version 1.0.0 the API may be subject to breaking chan
|
|
127
130
|
|
128
131
|
The Ruby OpenMPT code (ffi-openmpt) is released under the BSD licence.
|
129
132
|
|
130
|
-
Copyright (c) 2018, Robert Haines
|
133
|
+
Copyright (c) 2018, 2019 Robert Haines
|
131
134
|
All rights reserved.
|
132
135
|
|
133
136
|
See LICENCE for more details.
|
data/examples/mod-2-raw
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
# Copyright (c) 2018 Robert Haines.
|
4
|
+
# Copyright (c) 2018, 2019 Robert Haines.
|
5
5
|
#
|
6
6
|
# Licensed under the BSD License. See LICENCE for details.
|
7
7
|
|
@@ -9,7 +9,7 @@ require 'ffi/openmpt'
|
|
9
9
|
|
10
10
|
def get_filename(var)
|
11
11
|
if var.nil?
|
12
|
-
|
12
|
+
warn 'Please supply a filename to convert.'
|
13
13
|
exit(1)
|
14
14
|
end
|
15
15
|
|
@@ -28,13 +28,13 @@ end
|
|
28
28
|
|
29
29
|
# Does this file exist? Is it readable?
|
30
30
|
unless ::File.readable?(mod_path)
|
31
|
-
|
31
|
+
warn "'#{mod_path}' does not exist, or is not readable."
|
32
32
|
exit(1)
|
33
33
|
end
|
34
34
|
|
35
35
|
# Can libopenmpt open this file?
|
36
36
|
unless ::FFI::OpenMPT.probe_file(mod_path)
|
37
|
-
|
37
|
+
warn 'libopenmpt can not open this file. Are you sure it is a mod?'
|
38
38
|
exit(1)
|
39
39
|
end
|
40
40
|
|
data/examples/mod-info
CHANGED
@@ -45,10 +45,10 @@ end
|
|
45
45
|
puts "Tracker....: #{mod.tracker}"
|
46
46
|
puts "Title......: #{mod.title}"
|
47
47
|
puts "Duration...: #{duration_mins}:#{duration_secs.round(3)}"
|
48
|
-
puts "Subsongs...: #{mod.
|
49
|
-
puts "Channels...: #{mod.
|
50
|
-
puts "Orders.....: #{mod.
|
51
|
-
puts "Patterns...: #{mod.
|
52
|
-
puts "Instruments: #{mod.
|
53
|
-
puts "Samples....: #{mod.
|
48
|
+
puts "Subsongs...: #{mod.num_subsongs}"
|
49
|
+
puts "Channels...: #{mod.num_channels}"
|
50
|
+
puts "Orders.....: #{mod.num_orders}"
|
51
|
+
puts "Patterns...: #{mod.num_patterns}"
|
52
|
+
puts "Instruments: #{mod.num_instruments}"
|
53
|
+
puts "Samples....: #{mod.num_samples}"
|
54
54
|
end
|
data/ffi-openmpt.gemspec
CHANGED
@@ -28,11 +28,11 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
29
29
|
spec.require_paths = ['lib']
|
30
30
|
|
31
|
-
spec.required_ruby_version = '>= 2.
|
31
|
+
spec.required_ruby_version = '>= 2.3.0'
|
32
32
|
|
33
33
|
spec.add_runtime_dependency 'ffi', '~> 1.9'
|
34
34
|
|
35
|
-
spec.add_development_dependency 'bundler', '~> 1
|
35
|
+
spec.add_development_dependency 'bundler', '~> 2.0.1'
|
36
36
|
spec.add_development_dependency 'coveralls', '~> 0.8'
|
37
37
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
38
38
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/lib/ffi/openmpt/module.rb
CHANGED
@@ -19,6 +19,7 @@ module FFI
|
|
19
19
|
|
20
20
|
# Allocate a reusable single int buffer.
|
21
21
|
# This is for use by the 'get_render_params'-type calls.
|
22
|
+
# FFI::MemoryPointer is garbage collected automatically.
|
22
23
|
@int_value = ::FFI::MemoryPointer.new(:int, 1)
|
23
24
|
end
|
24
25
|
|
@@ -45,36 +46,60 @@ module FFI
|
|
45
46
|
openmpt_module_get_duration_seconds(@mod)
|
46
47
|
end
|
47
48
|
|
48
|
-
def
|
49
|
+
def num_subsongs
|
49
50
|
return if closed?
|
50
51
|
openmpt_module_get_num_subsongs(@mod)
|
51
52
|
end
|
52
53
|
|
53
|
-
def
|
54
|
+
def subsong_names
|
55
|
+
get_names(num_subsongs, :openmpt_module_get_subsong_name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def num_channels
|
54
59
|
return if closed?
|
55
60
|
openmpt_module_get_num_channels(@mod)
|
56
61
|
end
|
57
62
|
|
58
|
-
def
|
63
|
+
def channel_names
|
64
|
+
get_names(num_channels, :openmpt_module_get_channel_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def num_orders
|
59
68
|
return if closed?
|
60
69
|
openmpt_module_get_num_orders(@mod)
|
61
70
|
end
|
62
71
|
|
63
|
-
def
|
72
|
+
def order_names
|
73
|
+
get_names(num_orders, :openmpt_module_get_order_name)
|
74
|
+
end
|
75
|
+
|
76
|
+
def num_patterns
|
64
77
|
return if closed?
|
65
78
|
openmpt_module_get_num_patterns(@mod)
|
66
79
|
end
|
67
80
|
|
68
|
-
def
|
81
|
+
def pattern_names
|
82
|
+
get_names(num_patterns, :openmpt_module_get_pattern_name)
|
83
|
+
end
|
84
|
+
|
85
|
+
def num_instruments
|
69
86
|
return if closed?
|
70
87
|
openmpt_module_get_num_instruments(@mod)
|
71
88
|
end
|
72
89
|
|
73
|
-
def
|
90
|
+
def instrument_names
|
91
|
+
get_names(num_instruments, :openmpt_module_get_instrument_name)
|
92
|
+
end
|
93
|
+
|
94
|
+
def num_samples
|
74
95
|
return if closed?
|
75
96
|
openmpt_module_get_num_samples(@mod)
|
76
97
|
end
|
77
98
|
|
99
|
+
def sample_names
|
100
|
+
get_names(num_samples, :openmpt_module_get_sample_name)
|
101
|
+
end
|
102
|
+
|
78
103
|
def repeat_count
|
79
104
|
openmpt_module_get_repeat_count(@mod)
|
80
105
|
end
|
@@ -98,20 +123,18 @@ module FFI
|
|
98
123
|
|
99
124
|
def metadata_keys
|
100
125
|
ptr = openmpt_module_get_metadata_keys(@mod)
|
101
|
-
|
126
|
+
ptr.read_string.split(';').map(&:to_sym)
|
127
|
+
ensure
|
102
128
|
openmpt_free_string(ptr)
|
103
|
-
|
104
|
-
str.split(';').map(&:to_sym)
|
105
129
|
end
|
106
130
|
|
107
131
|
def metadata(key)
|
108
132
|
return if closed? || !metadata_keys.include?(key)
|
109
133
|
|
110
134
|
ptr = openmpt_module_get_metadata(@mod, key.to_s)
|
111
|
-
|
135
|
+
ptr.read_string
|
136
|
+
ensure
|
112
137
|
openmpt_free_string(ptr)
|
113
|
-
|
114
|
-
str
|
115
138
|
end
|
116
139
|
|
117
140
|
def gain
|
@@ -231,6 +254,15 @@ module FFI
|
|
231
254
|
@closed = (mod.address == 0)
|
232
255
|
mod
|
233
256
|
end
|
257
|
+
|
258
|
+
def get_names(num, get)
|
259
|
+
(0...num).reduce([]) do |acc, i|
|
260
|
+
ptr = send(get, @mod, i)
|
261
|
+
acc << ptr.read_string
|
262
|
+
ensure
|
263
|
+
openmpt_free_string(ptr)
|
264
|
+
end
|
265
|
+
end
|
234
266
|
end
|
235
267
|
end
|
236
268
|
end
|
data/lib/ffi/openmpt/openmpt.rb
CHANGED
@@ -17,10 +17,9 @@ module FFI
|
|
17
17
|
|
18
18
|
def self.supported_extensions
|
19
19
|
ptr = API.openmpt_get_supported_extensions
|
20
|
-
|
20
|
+
ptr.read_string.split(';').map(&:to_sym)
|
21
|
+
ensure
|
21
22
|
API.openmpt_free_string(ptr)
|
22
|
-
|
23
|
-
exts
|
24
23
|
end
|
25
24
|
|
26
25
|
def self.extension_supported?(ext)
|
@@ -33,10 +32,9 @@ module FFI
|
|
33
32
|
|
34
33
|
def self.error_string(error)
|
35
34
|
ptr = API.openmpt_error_string(error)
|
36
|
-
|
35
|
+
ptr.read_string
|
36
|
+
ensure
|
37
37
|
API.openmpt_free_string(ptr)
|
38
|
-
|
39
|
-
str
|
40
38
|
end
|
41
39
|
|
42
40
|
def self.probe_file(filename)
|
data/lib/ffi/openmpt/string.rb
CHANGED
data/lib/ffi/openmpt/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-openmpt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Haines
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.0.1
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 2.0.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: coveralls
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,7 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
139
|
requirements:
|
140
140
|
- - ">="
|
141
141
|
- !ruby/object:Gem::Version
|
142
|
-
version: 2.
|
142
|
+
version: 2.3.0
|
143
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
145
|
- - ">="
|