alsa-rawmidi 0.2.14 → 0.3.1
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.
- checksums.yaml +7 -0
- data/LICENSE +2 -2
- data/README.md +48 -0
- data/lib/alsa-rawmidi.rb +20 -12
- data/lib/alsa-rawmidi/api.rb +435 -0
- data/lib/alsa-rawmidi/device.rb +85 -56
- data/lib/alsa-rawmidi/input.rb +199 -168
- data/lib/alsa-rawmidi/output.rb +63 -51
- data/lib/alsa-rawmidi/soundcard.rb +45 -62
- data/test/helper.rb +51 -0
- data/test/input_buffer_test.rb +46 -0
- data/test/io_test.rb +80 -0
- metadata +42 -47
- data/README.rdoc +0 -45
- data/lib/alsa-rawmidi/map.rb +0 -242
metadata
CHANGED
@@ -1,74 +1,69 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: alsa-rawmidi
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.2.14
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.1
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- Ari Russo
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-10-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
17
14
|
name: ffi
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: "1.0"
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
25
20
|
type: :runtime
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
description: Realtime MIDI IO with Ruby for Linux via the ALSA RawMIDI API.
|
28
|
+
email:
|
29
29
|
- ari.russo@gmail.com
|
30
30
|
executables: []
|
31
|
-
|
32
31
|
extensions: []
|
33
|
-
|
34
32
|
extra_rdoc_files: []
|
35
|
-
|
36
|
-
|
33
|
+
files:
|
34
|
+
- LICENSE
|
35
|
+
- README.md
|
37
36
|
- lib/alsa-rawmidi.rb
|
38
|
-
- lib/alsa-rawmidi/
|
37
|
+
- lib/alsa-rawmidi/api.rb
|
39
38
|
- lib/alsa-rawmidi/device.rb
|
40
|
-
- lib/alsa-rawmidi/output.rb
|
41
39
|
- lib/alsa-rawmidi/input.rb
|
40
|
+
- lib/alsa-rawmidi/output.rb
|
42
41
|
- lib/alsa-rawmidi/soundcard.rb
|
43
|
-
-
|
44
|
-
-
|
45
|
-
|
42
|
+
- test/helper.rb
|
43
|
+
- test/input_buffer_test.rb
|
44
|
+
- test/io_test.rb
|
46
45
|
homepage: http://github.com/arirusso/alsa-rawmidi
|
47
|
-
licenses:
|
48
|
-
|
46
|
+
licenses:
|
47
|
+
- Apache 2.0
|
48
|
+
metadata: {}
|
49
49
|
post_install_message:
|
50
50
|
rdoc_options: []
|
51
|
-
|
52
|
-
require_paths:
|
51
|
+
require_paths:
|
53
52
|
- lib
|
54
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
-
|
56
|
-
requirements:
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
57
55
|
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version:
|
60
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
-
|
62
|
-
requirements:
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
63
60
|
- - ">="
|
64
|
-
- !ruby/object:Gem::Version
|
61
|
+
- !ruby/object:Gem::Version
|
65
62
|
version: 1.3.6
|
66
63
|
requirements: []
|
67
|
-
|
68
64
|
rubyforge_project: alsa-rawmidi
|
69
|
-
rubygems_version:
|
65
|
+
rubygems_version: 2.2.2
|
70
66
|
signing_key:
|
71
|
-
specification_version:
|
72
|
-
summary: Realtime MIDI
|
67
|
+
specification_version: 4
|
68
|
+
summary: Realtime MIDI IO with Ruby for Linux
|
73
69
|
test_files: []
|
74
|
-
|
data/README.rdoc
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
= alsa-rawmidi
|
2
|
-
|
3
|
-
== Summary
|
4
|
-
|
5
|
-
Perform low level realtime MIDI input and output in Ruby for Linux. Uses the ALSA RawMIDI driver interface API.
|
6
|
-
|
7
|
-
Note that in the interest of allowing people on other platforms to utilize your code, you should consider using {unimidi}[http://github.com/arirusso/unimidi]. Unimidi is a platform independent wrapper which implements alsa-rawmidi.
|
8
|
-
|
9
|
-
== Features
|
10
|
-
|
11
|
-
* Input and output on multiple devices concurrently
|
12
|
-
* Agnostically handle different MIDI Message types (including SysEx)
|
13
|
-
* Timestamped input events
|
14
|
-
|
15
|
-
== Requirements
|
16
|
-
|
17
|
-
* {ffi}[http://github.com/ffi/ffi] (gem install ffi)
|
18
|
-
* libasound, libasound-dev packages
|
19
|
-
|
20
|
-
== Install
|
21
|
-
|
22
|
-
* gem install alsa-rawmidi
|
23
|
-
|
24
|
-
== Examples
|
25
|
-
|
26
|
-
* {input}[http://github.com/arirusso/alsa-rawmidi/blob/master/examples/input.rb]
|
27
|
-
* {output}[http://github.com/arirusso/alsa-rawmidi/blob/master/examples/output.rb]
|
28
|
-
|
29
|
-
== Tests
|
30
|
-
|
31
|
-
* please see {test/config.rb}[http://github.com/arirusso/alsa-rawmidi/blob/master/test/config.rb] before running tests
|
32
|
-
|
33
|
-
== Documentation
|
34
|
-
|
35
|
-
* {rdoc}[http://rdoc.info/gems/alsa-rawmidi]
|
36
|
-
|
37
|
-
== Author
|
38
|
-
|
39
|
-
{Ari Russo}[http://github.com/arirusso] <ari.russo at gmail.com>
|
40
|
-
|
41
|
-
== License
|
42
|
-
|
43
|
-
Apache 2.0, See the file LICENSE
|
44
|
-
|
45
|
-
Copyright (c) 2010-2011 Ari Russo
|
data/lib/alsa-rawmidi/map.rb
DELETED
@@ -1,242 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
module AlsaRawMIDI
|
4
|
-
|
5
|
-
#
|
6
|
-
# libasound RawMIDI struct, enum and function bindings
|
7
|
-
#
|
8
|
-
module Map
|
9
|
-
|
10
|
-
extend FFI::Library
|
11
|
-
ffi_lib 'libasound'
|
12
|
-
|
13
|
-
Constants = {
|
14
|
-
:SND_RAWMIDI_STREAM_OUTPUT => 0,
|
15
|
-
:SND_RAWMIDI_STREAM_INPUT => 1,
|
16
|
-
:SND_RAWMIDI_APPEND => 0x0001,
|
17
|
-
:SND_RAWMIDI_NONBLOCK => 0x0002,
|
18
|
-
:SND_RAWMIDI_SYNC => 0x0004
|
19
|
-
}
|
20
|
-
|
21
|
-
typedef :ulong, :SndCtlType
|
22
|
-
typedef :ulong, :SndCtl
|
23
|
-
typedef :ulong, :SndRawMIDI
|
24
|
-
|
25
|
-
# snd_ctl
|
26
|
-
class SndCtl < FFI::Struct
|
27
|
-
|
28
|
-
layout :dl_handle, :pointer, # void*
|
29
|
-
:name, :pointer, # char*
|
30
|
-
:type, :SndCtlType,
|
31
|
-
:ops, :pointer, # const snd_ctl_ops_t*
|
32
|
-
:private_data, :pointer, # void*
|
33
|
-
:nonblock, :ulong,
|
34
|
-
:poll_fd, :ulong,
|
35
|
-
:async_handlers, :ulong
|
36
|
-
end
|
37
|
-
|
38
|
-
# snd_ctl_card_info
|
39
|
-
class SndCtlCardInfo < FFI::Struct
|
40
|
-
layout :card, :int, # card number
|
41
|
-
:pad, :int, # reserved for future (was type)
|
42
|
-
:id, [:uchar, 16], # ID of card (user selectable)
|
43
|
-
:driver, [:uchar, 16], # Driver name
|
44
|
-
:name, [:uchar, 32], # Short name of soundcard
|
45
|
-
:longname, [:uchar, 80], # name + info text about soundcard
|
46
|
-
:reserved_, [:uchar, 16], # reserved for future (was ID of mixer)
|
47
|
-
:mixername, [:uchar, 80], # visual mixer identification
|
48
|
-
:components, [:uchar, 128] # card components / fine identification, delimited with one space (AC97 etc..)
|
49
|
-
end
|
50
|
-
|
51
|
-
# snd_rawmidi_info
|
52
|
-
class SndRawMIDIInfo < FFI::Struct
|
53
|
-
layout :device, :uint, # RO/WR (control): device number
|
54
|
-
:subdevice, :uint, # RO/WR (control): subdevice number
|
55
|
-
:stream, :int, # WR: stream
|
56
|
-
:card, :int, # R: card number
|
57
|
-
:flags, :uint, # SNDRV_RAWMIDI_INFO_XXXX
|
58
|
-
:id, [:uchar, 64], # ID (user selectable)
|
59
|
-
:name, [:uchar, 80], # name of device
|
60
|
-
:subname, [:uchar, 32], # name of active or selected subdevice
|
61
|
-
:subdevices_count, :uint,
|
62
|
-
:subdevices_avail, :uint,
|
63
|
-
:reserved, [:uchar, 64] # reserved for future use
|
64
|
-
end
|
65
|
-
|
66
|
-
# timespec
|
67
|
-
class Timespec < FFI::Struct
|
68
|
-
layout :tv_sec, :time_t, # Seconds since 00:00:00 GMT
|
69
|
-
:tv_nsec, :long # Additional nanoseconds since
|
70
|
-
end
|
71
|
-
|
72
|
-
# snd_rawmidi_status
|
73
|
-
class SndRawMIDIStatus < FFI::Struct
|
74
|
-
layout :stream, :int,
|
75
|
-
:timestamp, Timespec.by_value, # Timestamp
|
76
|
-
:avail, :size_t, # available bytes
|
77
|
-
:xruns, :size_t, # count of overruns since last status (in bytes)
|
78
|
-
:reserved, [:uchar, 64] # reserved for future use
|
79
|
-
end
|
80
|
-
|
81
|
-
# Simple doubly linked list implementation
|
82
|
-
class LinkedList < FFI::Struct
|
83
|
-
layout :next, :pointer, # *LinkedList
|
84
|
-
:prev, :pointer # *LinkedList
|
85
|
-
end
|
86
|
-
|
87
|
-
# snd_rawmidi
|
88
|
-
class SndRawMIDI < FFI::Struct
|
89
|
-
layout :card, :pointer, # *snd_card
|
90
|
-
:list, LinkedList.by_value,
|
91
|
-
:device, :uint, # device number
|
92
|
-
:info_flags, :uint, # SNDRV_RAWMIDI_INFO_XXXX
|
93
|
-
:id, [:char, 64],
|
94
|
-
:name, [:char, 80]
|
95
|
-
end
|
96
|
-
|
97
|
-
# spinlock_t
|
98
|
-
class Spinlock < FFI::Struct
|
99
|
-
layout :lock, :uint
|
100
|
-
end
|
101
|
-
|
102
|
-
# wait_queue_head_t
|
103
|
-
class WaitQueueHead < FFI::Struct
|
104
|
-
layout :lock, Spinlock.by_value,
|
105
|
-
:task_list, LinkedList.by_value
|
106
|
-
end
|
107
|
-
|
108
|
-
class AtomicT < FFI::Struct
|
109
|
-
layout :counter, :int # volatile int counter
|
110
|
-
end
|
111
|
-
|
112
|
-
class Tasklet < FFI::Struct
|
113
|
-
layout :next, :pointer, # pointer to the next tasklet in the list / void (*func) (unsigned long)
|
114
|
-
:state, :ulong, # state of the tasklet
|
115
|
-
:count, AtomicT.by_value, # reference counter
|
116
|
-
:func, :pointer, # tasklet handler function / void (*func) (unsigned long)
|
117
|
-
:data, :ulong # argument to the tasklet function
|
118
|
-
end
|
119
|
-
|
120
|
-
# snd_rawmidi_runtime
|
121
|
-
class SndRawMIDIRuntime < FFI::Struct
|
122
|
-
layout :drain, :uint, 1, # drain stage
|
123
|
-
:oss, :uint, 1, # OSS compatible mode
|
124
|
-
# midi stream buffer
|
125
|
-
:buffer, :pointer, # uchar* / buffer for MIDI data
|
126
|
-
:buffer_size, :size_t, # size of buffer
|
127
|
-
:appl_ptr, :size_t, # application pointer
|
128
|
-
:hw_ptr, :size_t, # hardware pointer
|
129
|
-
:avail_min, :size_t, # min avail for wakeup
|
130
|
-
:avail, :size_t, # max used buffer for wakeup
|
131
|
-
:xruns, :size_t, # over/underruns counter
|
132
|
-
# misc
|
133
|
-
:lock, Spinlock.by_value,
|
134
|
-
:sleep, WaitQueueHead.by_value,
|
135
|
-
# event handler (new bytes, input only)
|
136
|
-
:substream, :pointer, # void (*event)(struct snd_rawmidi_substream *substream);
|
137
|
-
# defers calls to event [input] or ops->trigger [output]
|
138
|
-
:tasklet, Tasklet.by_value,
|
139
|
-
:private_data, :pointer, # void*
|
140
|
-
:private_free, :pointer # void (*private_free)(struct snd_rawmidi_substream *substream)
|
141
|
-
end
|
142
|
-
|
143
|
-
# snd_rawmidi_params
|
144
|
-
class SndRawMIDIParams < FFI::Struct
|
145
|
-
layout :stream, :int,
|
146
|
-
:buffer_size, :size_t, # queue size in bytes
|
147
|
-
:avail_min, :size_t, # minimum avail bytes for wakeup
|
148
|
-
:no_active_sensing, :uint, 1, # do not send active sensing byte in close()
|
149
|
-
:reserved, [:uchar, 16] # reserved for future use
|
150
|
-
end
|
151
|
-
|
152
|
-
#
|
153
|
-
# snd_card
|
154
|
-
#
|
155
|
-
|
156
|
-
# Try to load the driver for a card.
|
157
|
-
attach_function :snd_card_load, [:int], :int # (int card)
|
158
|
-
# Try to determine the next card.
|
159
|
-
attach_function :snd_card_next, [:pointer], :int # (int* card)
|
160
|
-
# Convert card string to an integer value.
|
161
|
-
attach_function :snd_card_get_index, [:pointer], :int # (const char* name)
|
162
|
-
# Obtain the card name.
|
163
|
-
attach_function :snd_card_get_name, [:int, :pointer], :int # (int card, char **name)
|
164
|
-
# Obtain the card long name.
|
165
|
-
attach_function :snd_card_get_longname, [:int, :pointer], :int # (int card, char **name)
|
166
|
-
|
167
|
-
#
|
168
|
-
# snd_ctl
|
169
|
-
#
|
170
|
-
|
171
|
-
# Opens a CTL.
|
172
|
-
attach_function :snd_ctl_open, [:pointer, :pointer, :int], :int # (snd_ctl_t **ctl, const char *name, int mode)
|
173
|
-
# Opens a CTL using local configuration.
|
174
|
-
attach_function :snd_ctl_open_lconf, [:pointer, :pointer, :int, :pointer], :int # (snd_ctl_t **ctl, const char *name, int mode, snd_config_t *lconf)
|
175
|
-
# close CTL handle
|
176
|
-
attach_function :snd_ctl_close, [:pointer], :int #(snd_ctl_t *ctl)
|
177
|
-
# set nonblock mode
|
178
|
-
attach_function :snd_ctl_nonblock, [:pointer, :int], :int # (snd_ctl_t *ctl, int nonblock)
|
179
|
-
# Get card related information.
|
180
|
-
attach_function :snd_ctl_card_info, [:pointer, :pointer], :int # (snd_ctl_t *ctl, snd_ctl_card_info_t *info)
|
181
|
-
# Get card name from a CTL card info.
|
182
|
-
attach_function :snd_ctl_card_info_get_name, [:pointer], :string # (const snd_ctl_card_info_t *obj) / const char*
|
183
|
-
# Get info about a RawMidi device.
|
184
|
-
attach_function :snd_ctl_rawmidi_info, [:SndCtl, :pointer], :int # (snd_ctl_t *ctl, snd_rawmidi_info_t *info)
|
185
|
-
# Get next RawMidi device number.
|
186
|
-
attach_function :snd_ctl_rawmidi_next_device, [:SndCtl, :pointer], :int # (snd_ctl_t *ctl, int *device)
|
187
|
-
|
188
|
-
#
|
189
|
-
# snd_rawmidi
|
190
|
-
#
|
191
|
-
|
192
|
-
# close RawMidi handle
|
193
|
-
attach_function :snd_rawmidi_close, [:SndRawMIDI], :int # (snd_rawmidi_t *rmidi)
|
194
|
-
# drain all bytes in the rawmidi I/O ring buffer
|
195
|
-
attach_function :snd_rawmidi_drain, [:SndRawMIDI], :int # (snd_rawmidi_t *rmidi)
|
196
|
-
# drop all bytes in the rawmidi I/O ring buffer immediately
|
197
|
-
attach_function :snd_rawmidi_drop, [:SndRawMIDI], :int # int ( snd_rawmidi_t * rawmidi)
|
198
|
-
# set nonblock mode
|
199
|
-
attach_function :snd_rawmidi_nonblock, [:SndRawMIDI, :int], :int # (snd_rawmidi_t *rmidi, int nonblock)
|
200
|
-
# Opens a new connection to the RawMidi interface.
|
201
|
-
attach_function :snd_rawmidi_open, [:pointer, :pointer, :string, :int], :int # (snd_rawmidi_t **in_rmidi, snd_rawmidi_t **out_rmidi, const char *name, int mode)
|
202
|
-
# Opens a new connection to the RawMidi interface using local configuration.
|
203
|
-
attach_function :snd_rawmidi_open_lconf, [:pointer, :pointer, :string, :int, :pointer], :int #(snd_rawmidi_t **in_rmidi, snd_rawmidi_t **out_rmidi, const char *name, int mode, snd_config_t *lconf)
|
204
|
-
# read MIDI bytes from MIDI stream
|
205
|
-
attach_function :snd_rawmidi_read, [:SndRawMIDI, :pointer, :size_t], :ssize_t # (snd_rawmidi_t *rmidi, void *buffer, size_t size)
|
206
|
-
# write MIDI bytes to MIDI stream
|
207
|
-
attach_function :snd_rawmidi_write, [:SndRawMIDI, :ulong, :size_t], :ssize_t # (snd_rawmidi_t *rmidi, const void *buffer, size_t size)
|
208
|
-
|
209
|
-
#
|
210
|
-
# snd_rawmidi_info
|
211
|
-
#
|
212
|
-
|
213
|
-
enum :snd_rawmidi_stream, [
|
214
|
-
'SND_RAWMIDI_STREAM_OUTPUT', 0,
|
215
|
-
'SND_RAWMIDI_STREAM_INPUT', 1,
|
216
|
-
'SND_RAWMIDI_STREAM_LAST', 1
|
217
|
-
]
|
218
|
-
|
219
|
-
# get information about RawMidi handle
|
220
|
-
attach_function :snd_rawmidi_info, [:pointer, :pointer], :int # (snd_rawmidi_t *rmidi, snd_rawmidi_info_t *info)
|
221
|
-
# get rawmidi count of subdevices
|
222
|
-
attach_function :snd_rawmidi_info_get_subdevices_count, [:pointer], :uint # (const snd_rawmidi_info_t *obj)
|
223
|
-
# set rawmidi device number
|
224
|
-
attach_function :snd_rawmidi_info_set_device, [:pointer, :uint], :void # (snd_rawmidi_info_t *obj, unsigned int val)
|
225
|
-
# set rawmidi subdevice number
|
226
|
-
attach_function :snd_rawmidi_info_set_subdevice, [:pointer, :uint], :void # (snd_rawmidi_info_t *obj, unsigned int val)
|
227
|
-
# set rawmidi stream identifier
|
228
|
-
attach_function :snd_rawmidi_info_set_stream, [:pointer, :snd_rawmidi_stream], :void # (snd_rawmidi_info_t *obj, snd_rawmidi_stream_t val)
|
229
|
-
# get size of the snd_rawmidi_info_t structure in bytes
|
230
|
-
attach_function :snd_rawmidi_info_sizeof, [], :size_t # (void)
|
231
|
-
|
232
|
-
#
|
233
|
-
# misc
|
234
|
-
#
|
235
|
-
|
236
|
-
# Convert an error code to a string
|
237
|
-
attach_function :snd_strerror, [:int], :string # (int errnum) / const char*
|
238
|
-
# Frees the global configuration tree in snd_config.
|
239
|
-
attach_function :snd_config_update_free_global, [], :int # (void)
|
240
|
-
|
241
|
-
end
|
242
|
-
end
|