ruby-groove 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b837650a481fa113d43ffb9c2fcb0761e75344c
4
+ data.tar.gz: 8877ffbc45b368074456838bb975e34dce36bea0
5
+ SHA512:
6
+ metadata.gz: 3d493bcece4b16e368bd7ebbce5fdc6785e54b9acdfc8180220b8d3fc8d512656501a7f9d3c14b12284721ae69b98c2cbc25a4cd412bcfc6d74748ebf0a19a5c
7
+ data.tar.gz: b90c52bf94c14c649edd67ec02246554bb54edb22fe91e2012da62d29b13d0976681bab93576192246d3b058a6b5fcb253a0ed0b6dc15ad2955a61996ccc0ccc
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 john muhl
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,68 @@
1
+ ruby bindings to [libgroove][libgroove].
2
+
3
+ ## Installation
4
+
5
+ First install [libgroove][libgroove] (see below) then:
6
+
7
+ gem install ruby-groove
8
+
9
+ ### libgroove
10
+
11
+ #### Ubuntu, FreeBSD and Debian
12
+
13
+ Ubuntu, FreeBSD and Debian users can use a [pre-built package][packages].
14
+
15
+ #### Mac OS X
16
+
17
+ Install with [Homebrew][brew]
18
+
19
+ ~~~ sh
20
+ brew tap johnmuhl/libgroove
21
+ brew install libgroove
22
+ ~~~
23
+
24
+ ## Usage
25
+
26
+ TODO: Write usage instructions here
27
+
28
+ ## Generating the bindings
29
+
30
+ [ffi_gen][ffi_gen] automatically creates the bindings from the
31
+ [libgroove][libgroove] header files. Use the included [Vagrantfile][vagrant]
32
+ and the steps below to setup a build environment.
33
+
34
+ ~~~ sh
35
+ # host computer
36
+ cd ruby-groove
37
+ vagrant up
38
+ vagrant ssh
39
+ ~~~
40
+
41
+ ~~~ sh
42
+ # virtual machine
43
+ sudo apt-add-repository ppa:andrewrk/libgroove
44
+ sudo apt-get update
45
+ sudo apt-get install libgroove-dev libgrooveplayer-dev libgrooveloudness-dev libgroovefingerprinter-dev ruby ruby-dev clang libclang-dev llvm llvm-dev
46
+ sudo ln -sv /usr/lib/llvm-3.4/lib/libclang.so /usr/lib/libclang.so
47
+ sudo gem install bundler
48
+ cd /vagrant
49
+ bundle install
50
+ rake generate_ffi
51
+ ~~~
52
+
53
+ Bindings are output to `lib`.
54
+
55
+ ## Contributing
56
+
57
+ 1. [Fork it](https://github.com/johnmuhl/ruby-groove/fork)
58
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
59
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
60
+ 4. Push to the branch (`git push origin my-new-feature`)
61
+ 5. Create a new Pull Request
62
+
63
+ [brew]: http://brew.sh/
64
+ [ffi_gen]: https://github.com/neelance/ffi-gen
65
+ [libebur128]: https://github.com/jiixyj/libebur128
66
+ [libgroove]: https://github.com/andrewrk/libgroove
67
+ [packages]: https://github.com/andrewrk/libgroove#pre-built-packages
68
+ [vagrant]: http://www.vagrantup.com/
@@ -0,0 +1,5 @@
1
+ require "groove/groove"
2
+ require "groove/fingerprinter"
3
+ require "groove/loudness"
4
+ require "groove/player"
5
+ require "groove/version"
@@ -0,0 +1,184 @@
1
+ # Generated by ffi_gen. Please do not change this file by hand.
2
+
3
+ require 'ffi'
4
+
5
+ module Groove::Fingerprinter
6
+ extend FFI::Library
7
+ ffi_lib 'groovefingerprinter'
8
+
9
+ def self.attach_function(name, *_)
10
+ begin; super; rescue FFI::NotFoundError => e
11
+ (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
+ end
13
+ end
14
+
15
+ # (Not documented)
16
+ #
17
+ # = Fields:
18
+ # :fingerprint ::
19
+ # (FFI::Pointer(*Int32T)) raw fingerprint. A fingerprint is an array of signed 32-bit integers.
20
+ # :fingerprint_size ::
21
+ # (Integer) the number of 32-bit integers in the fingerprint array
22
+ # :duration ::
23
+ # (Float) how many seconds long this song is
24
+ # :item ::
25
+ # (FFI::Pointer(*GroovePlaylistItem)) the playlist item that this info applies to.
26
+ # When this is NULL this is the end-of-playlist sentinel and
27
+ # other properties are undefined.
28
+ class GrooveFingerprinterInfo < FFI::Struct
29
+ layout :fingerprint, :pointer,
30
+ :fingerprint_size, :int,
31
+ :duration, :double,
32
+ :item, :pointer
33
+ end
34
+
35
+ # (Not documented)
36
+ #
37
+ # = Fields:
38
+ # :info_queue_size ::
39
+ # (Integer) maximum number of GrooveFingerprinterInfo items to store in this
40
+ # fingerprinter's queue. this defaults to MAX_INT, meaning that
41
+ # the fingerprinter will cause the decoder to decode the entire
42
+ # playlist. if you want to instead, for example, obtain fingerprints
43
+ # at the same time as playback, you might set this value to 1.
44
+ # :sink_buffer_size ::
45
+ # (Integer) how big the sink buffer should be, in sample frames.
46
+ # groove_fingerprinter_create defaults this to 8192
47
+ # :playlist ::
48
+ # (FFI::Pointer(*GroovePlaylist)) read-only. set when attached and cleared when detached
49
+ class GrooveFingerprinter < FFI::Struct
50
+ layout :info_queue_size, :int,
51
+ :sink_buffer_size, :int,
52
+ :playlist, :pointer
53
+ end
54
+
55
+ # (Not documented)
56
+ #
57
+ # @method fingerprinter_create()
58
+ # @return [GrooveFingerprinter]
59
+ # @scope class
60
+ attach_function :fingerprinter_create, :groove_fingerprinter_create, [], GrooveFingerprinter
61
+
62
+ # (Not documented)
63
+ #
64
+ # @method fingerprinter_destroy(printer)
65
+ # @param [GrooveFingerprinter] printer
66
+ # @return [nil]
67
+ # @scope class
68
+ attach_function :fingerprinter_destroy, :groove_fingerprinter_destroy, [GrooveFingerprinter], :void
69
+
70
+ # once you attach, you must detach before destroying the playlist
71
+ #
72
+ # @method fingerprinter_attach(printer, playlist)
73
+ # @param [GrooveFingerprinter] printer
74
+ # @param [FFI::Pointer(*GroovePlaylist)] playlist
75
+ # @return [Integer]
76
+ # @scope class
77
+ attach_function :fingerprinter_attach, :groove_fingerprinter_attach, [GrooveFingerprinter, :pointer], :int
78
+
79
+ # (Not documented)
80
+ #
81
+ # @method fingerprinter_detach(printer)
82
+ # @param [GrooveFingerprinter] printer
83
+ # @return [Integer]
84
+ # @scope class
85
+ attach_function :fingerprinter_detach, :groove_fingerprinter_detach, [GrooveFingerprinter], :int
86
+
87
+ # returns < 0 on error, 0 on aborted (block=1) or no info ready (block=0),
88
+ # 1 on info returned.
89
+ # When you get info you must free it with groove_fingerprinter_free_info.
90
+ #
91
+ # @method fingerprinter_info_get(printer, info, block)
92
+ # @param [GrooveFingerprinter] printer
93
+ # @param [GrooveFingerprinterInfo] info
94
+ # @param [Integer] block
95
+ # @return [Integer]
96
+ # @scope class
97
+ attach_function :fingerprinter_info_get, :groove_fingerprinter_info_get, [GrooveFingerprinter, GrooveFingerprinterInfo, :int], :int
98
+
99
+ # (Not documented)
100
+ #
101
+ # @method fingerprinter_free_info(info)
102
+ # @param [GrooveFingerprinterInfo] info
103
+ # @return [nil]
104
+ # @scope class
105
+ attach_function :fingerprinter_free_info, :groove_fingerprinter_free_info, [GrooveFingerprinterInfo], :void
106
+
107
+ # returns < 0 on error, 0 on no info ready, 1 on info ready
108
+ # if block is 1, block until info is ready
109
+ #
110
+ # @method fingerprinter_info_peek(printer, block)
111
+ # @param [GrooveFingerprinter] printer
112
+ # @param [Integer] block
113
+ # @return [Integer]
114
+ # @scope class
115
+ attach_function :fingerprinter_info_peek, :groove_fingerprinter_info_peek, [GrooveFingerprinter, :int], :int
116
+
117
+ # get the position of the printer head
118
+ # both the current playlist item and the position in seconds in the playlist
119
+ # item are given. item will be set to NULL if the playlist is empty
120
+ # you may pass NULL for item or seconds
121
+ #
122
+ # @method fingerprinter_position(printer, item, seconds)
123
+ # @param [GrooveFingerprinter] printer
124
+ # @param [FFI::Pointer(**GroovePlaylistItem)] item
125
+ # @param [FFI::Pointer(*Double)] seconds
126
+ # @return [nil]
127
+ # @scope class
128
+ attach_function :fingerprinter_position, :groove_fingerprinter_position, [GrooveFingerprinter, :pointer, :pointer], :void
129
+
130
+ # Compress and base64-encode a raw fingerprint
131
+ #
132
+ # The caller is responsible for freeing the returned pointer using
133
+ # groove_fingerprinter_dealloc().
134
+ #
135
+ # Parameters:
136
+ # - fp: pointer to an array of signed 32-bit integers representing the raw
137
+ # fingerprint to be encoded
138
+ # - size: number of items in the raw fingerprint
139
+ # - encoded_fp: pointer to a pointer, where the encoded fingerprint will be
140
+ # stored
141
+ #
142
+ # Returns:
143
+ # - 0 on success, < 0 on error
144
+ #
145
+ # @method fingerprinter_encode(fp, size, encoded_fp)
146
+ # @param [FFI::Pointer(*Int32T)] fp
147
+ # @param [Integer] size
148
+ # @param [FFI::Pointer(**CharS)] encoded_fp
149
+ # @return [Integer]
150
+ # @scope class
151
+ attach_function :fingerprinter_encode, :groove_fingerprinter_encode, [:pointer, :int, :pointer], :int
152
+
153
+ # Uncompress and base64-decode an encoded fingerprint
154
+ #
155
+ # The caller is responsible for freeing the returned pointer using
156
+ # groove_fingerprinter_dealloc().
157
+ #
158
+ # Parameters:
159
+ # - encoded_fp: Pointer to an encoded fingerprint
160
+ # - encoded_size: Size of the encoded fingerprint in bytes
161
+ # - fp: Pointer to a pointer, where the decoded raw fingerprint (array
162
+ # of signed 32-bit integers) will be stored
163
+ # - size: Number of items in the returned raw fingerprint
164
+ #
165
+ # Returns:
166
+ # - 0 on success, < 0 on error
167
+ #
168
+ # @method fingerprinter_decode(encoded_fp, fp, size)
169
+ # @param [String] encoded_fp
170
+ # @param [FFI::Pointer(**Int32T)] fp
171
+ # @param [FFI::Pointer(*Int)] size
172
+ # @return [Integer]
173
+ # @scope class
174
+ attach_function :fingerprinter_decode, :groove_fingerprinter_decode, [:string, :pointer, :pointer], :int
175
+
176
+ # (Not documented)
177
+ #
178
+ # @method fingerprinter_dealloc(ptr)
179
+ # @param [FFI::Pointer(*Void)] ptr
180
+ # @return [nil]
181
+ # @scope class
182
+ attach_function :fingerprinter_dealloc, :groove_fingerprinter_dealloc, [:pointer], :void
183
+
184
+ end
@@ -0,0 +1,768 @@
1
+ # Generated by ffi_gen. Please do not change this file by hand.
2
+
3
+ require 'ffi'
4
+
5
+ module Groove
6
+ extend FFI::Library
7
+ ffi_lib 'groove'
8
+
9
+ def self.attach_function(name, *_)
10
+ begin; super; rescue FFI::NotFoundError => e
11
+ (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
+ end
13
+ end
14
+
15
+ GROOVE_LOG_ERROR = 16
16
+
17
+ GROOVE_LOG_WARNING = 24
18
+
19
+ GROOVE_LOG_INFO = 32
20
+
21
+ GROOVE_CH_FRONT_LEFT = 0x00000001
22
+
23
+ GROOVE_CH_FRONT_RIGHT = 0x00000002
24
+
25
+ GROOVE_CH_FRONT_CENTER = 0x00000004
26
+
27
+ GROOVE_TAG_MATCH_CASE = 1
28
+
29
+ GROOVE_TAG_DONT_OVERWRITE = 16
30
+
31
+ GROOVE_TAG_APPEND = 32
32
+
33
+ GROOVE_EVERY_SINK_FULL = 0
34
+
35
+ GROOVE_ANY_SINK_FULL = 1
36
+
37
+ GROOVE_BUFFER_NO = 0
38
+
39
+ GROOVE_BUFFER_YES = 1
40
+
41
+ GROOVE_BUFFER_END = 2
42
+
43
+ # (Not documented)
44
+ #
45
+ # @method init()
46
+ # @return [Integer]
47
+ # @scope class
48
+ attach_function :init, :groove_init, [], :int
49
+
50
+ # call at the end of your program to clean up. after calling this
51
+ # you may no longer use this API.
52
+ #
53
+ # @method finish()
54
+ # @return [nil]
55
+ # @scope class
56
+ attach_function :finish, :groove_finish, [], :void
57
+
58
+ # enable/disable logging of errors
59
+ #
60
+ # @method set_logging(level)
61
+ # @param [Integer] level
62
+ # @return [nil]
63
+ # @scope class
64
+ attach_function :set_logging, :groove_set_logging, [:int], :void
65
+
66
+ # get the channel count for the channel layout
67
+ #
68
+ # @method channel_layout_count(channel_layout)
69
+ # @param [Integer] channel_layout
70
+ # @return [Integer]
71
+ # @scope class
72
+ attach_function :channel_layout_count, :groove_channel_layout_count, [:ulong], :int
73
+
74
+ # get the default channel layout based on the channel count
75
+ #
76
+ # @method channel_layout_default(count)
77
+ # @param [Integer] count
78
+ # @return [Integer]
79
+ # @scope class
80
+ attach_function :channel_layout_default, :groove_channel_layout_default, [:int], :ulong
81
+
82
+ # (Not documented)
83
+ #
84
+ # <em>This entry is only for documentation and no real method. The FFI::Enum can be accessed via #enum_type(:groove_sample_format).</em>
85
+ #
86
+ # === Options:
87
+ # :fmt_none ::
88
+ #
89
+ # :fmt_u8 ::
90
+ #
91
+ # :fmt_s16 ::
92
+ # unsigned 8 bits
93
+ # :fmt_s32 ::
94
+ # signed 16 bits
95
+ # :fmt_flt ::
96
+ # signed 32 bits
97
+ # :fmt_dbl ::
98
+ # float (32 bits)
99
+ # :fmt_u8p ::
100
+ # double (64 bits)
101
+ # :fmt_s16p ::
102
+ # unsigned 8 bits, planar
103
+ # :fmt_s32p ::
104
+ # signed 16 bits, planar
105
+ # :fmt_fltp ::
106
+ # signed 32 bits, planar
107
+ # :fmt_dblp ::
108
+ # float (32 bits), planar
109
+ #
110
+ # @method _enum_groove_sample_format_
111
+ # @return [Symbol]
112
+ # @scope class
113
+ enum :groove_sample_format, [
114
+ :fmt_none, -1,
115
+ :fmt_u8, 0,
116
+ :fmt_s16, 1,
117
+ :fmt_s32, 2,
118
+ :fmt_flt, 3,
119
+ :fmt_dbl, 4,
120
+ :fmt_u8p, 5,
121
+ :fmt_s16p, 6,
122
+ :fmt_s32p, 7,
123
+ :fmt_fltp, 8,
124
+ :fmt_dblp, 9
125
+ ]
126
+
127
+ # double (64 bits), planar
128
+ #
129
+ # = Fields:
130
+ # :sample_rate ::
131
+ # (Integer)
132
+ # :channel_layout ::
133
+ # (Integer)
134
+ # :sample_fmt ::
135
+ # (Symbol from _enum_groove_sample_format_)
136
+ class GrooveAudioFormat < FFI::Struct
137
+ layout :sample_rate, :int,
138
+ :channel_layout, :ulong,
139
+ :sample_fmt, :groove_sample_format
140
+ end
141
+
142
+ # double (64 bits), planar
143
+ #
144
+ # @method sample_format_bytes_per_sample(format)
145
+ # @param [Symbol from _enum_groove_sample_format_] format
146
+ # @return [Integer]
147
+ # @scope class
148
+ attach_function :sample_format_bytes_per_sample, :groove_sample_format_bytes_per_sample, [:groove_sample_format], :int
149
+
150
+ # (Not documented)
151
+ #
152
+ # @method version_major()
153
+ # @return [Integer]
154
+ # @scope class
155
+ attach_function :version_major, :groove_version_major, [], :int
156
+
157
+ # (Not documented)
158
+ #
159
+ # @method version_minor()
160
+ # @return [Integer]
161
+ # @scope class
162
+ attach_function :version_minor, :groove_version_minor, [], :int
163
+
164
+ # (Not documented)
165
+ #
166
+ # @method version_patch()
167
+ # @return [Integer]
168
+ # @scope class
169
+ attach_function :version_patch, :groove_version_patch, [], :int
170
+
171
+ # (Not documented)
172
+ #
173
+ # @method version()
174
+ # @return [String]
175
+ # @scope class
176
+ attach_function :version, :groove_version, [], :string
177
+
178
+ # GrooveFile
179
+ #
180
+ # = Fields:
181
+ # :dirty ::
182
+ # (Integer) read-only
183
+ # :filename ::
184
+ # (String) read-only
185
+ class GrooveFile < FFI::Struct
186
+ layout :dirty, :int,
187
+ :filename, :string
188
+ end
189
+
190
+ # If the entry already exists, append to it. Note that no
191
+ # delimiter is added, the strings are simply concatenated.
192
+ class GrooveTag < FFI::Struct
193
+ layout :dummy, :char
194
+ end
195
+
196
+ # If the entry already exists, append to it. Note that no
197
+ # delimiter is added, the strings are simply concatenated.
198
+ #
199
+ # @method tag_key(tag)
200
+ # @param [GrooveTag] tag
201
+ # @return [String]
202
+ # @scope class
203
+ attach_function :tag_key, :groove_tag_key, [GrooveTag], :string
204
+
205
+ # (Not documented)
206
+ #
207
+ # @method tag_value(tag)
208
+ # @param [GrooveTag] tag
209
+ # @return [String]
210
+ # @scope class
211
+ attach_function :tag_value, :groove_tag_value, [GrooveTag], :string
212
+
213
+ # you are always responsible for calling groove_file_close on the
214
+ # returned GrooveFile.
215
+ #
216
+ # @method file_open(filename)
217
+ # @param [String] filename
218
+ # @return [GrooveFile]
219
+ # @scope class
220
+ attach_function :file_open, :groove_file_open, [:string], GrooveFile
221
+
222
+ # (Not documented)
223
+ #
224
+ # @method file_close(file)
225
+ # @param [GrooveFile] file
226
+ # @return [nil]
227
+ # @scope class
228
+ attach_function :file_close, :groove_file_close, [GrooveFile], :void
229
+
230
+ # (Not documented)
231
+ #
232
+ # @method file_metadata_get(file, key, prev, flags)
233
+ # @param [GrooveFile] file
234
+ # @param [String] key
235
+ # @param [GrooveTag] prev
236
+ # @param [Integer] flags
237
+ # @return [GrooveTag]
238
+ # @scope class
239
+ attach_function :file_metadata_get, :groove_file_metadata_get, [GrooveFile, :string, GrooveTag, :int], GrooveTag
240
+
241
+ # key entry to add to metadata. will be strdup'd
242
+ # value entry to add to metadata. will be strdup'd
243
+ # passing NULL causes existing entry to be deleted.
244
+ # return >= 0 on success otherwise an error code < 0
245
+ # note that this will not save the file; you must call groove_file_save
246
+ # to do that.
247
+ #
248
+ # @method file_metadata_set(file, key, value, flags)
249
+ # @param [GrooveFile] file
250
+ # @param [String] key
251
+ # @param [String] value
252
+ # @param [Integer] flags
253
+ # @return [Integer]
254
+ # @scope class
255
+ attach_function :file_metadata_set, :groove_file_metadata_set, [GrooveFile, :string, :string, :int], :int
256
+
257
+ # a comma separated list of short names for the format
258
+ #
259
+ # @method file_short_names(file)
260
+ # @param [GrooveFile] file
261
+ # @return [String]
262
+ # @scope class
263
+ attach_function :file_short_names, :groove_file_short_names, [GrooveFile], :string
264
+
265
+ # write changes made to metadata to disk.
266
+ # return < 0 on error
267
+ #
268
+ # @method file_save(file)
269
+ # @param [GrooveFile] file
270
+ # @return [Integer]
271
+ # @scope class
272
+ attach_function :file_save, :groove_file_save, [GrooveFile], :int
273
+
274
+ # main audio stream duration in seconds. note that this relies on a
275
+ # combination of format headers and heuristics. It can be inaccurate.
276
+ # The most accurate way to learn the duration of a file is to use
277
+ # GrooveLoudnessDetector
278
+ #
279
+ # @method file_duration(file)
280
+ # @param [GrooveFile] file
281
+ # @return [Float]
282
+ # @scope class
283
+ attach_function :file_duration, :groove_file_duration, [GrooveFile], :double
284
+
285
+ # get the audio format of the main audio stream of a file
286
+ #
287
+ # @method file_audio_format(file, audio_format)
288
+ # @param [GrooveFile] file
289
+ # @param [GrooveAudioFormat] audio_format
290
+ # @return [nil]
291
+ # @scope class
292
+ attach_function :file_audio_format, :groove_file_audio_format, [GrooveFile, GrooveAudioFormat], :void
293
+
294
+ # GroovePlaylist
295
+ #
296
+ # = Fields:
297
+ # :file ::
298
+ # (GrooveFile) all fields are read-only. modify with methods below.
299
+ # :gain ::
300
+ # (Float) A volume adjustment in float format to apply to the file when it plays.
301
+ # This is typically used for loudness compensation, for example ReplayGain.
302
+ # To convert from dB to float, use exp(log(10) * 0.05 * dB_value)
303
+ # :peak ::
304
+ # (Float) The sample peak of this playlist item is assumed to be 1.0 in float
305
+ # format. If you know for certain that the peak is less than 1.0, you
306
+ # may set this value which may allow the volume adjustment to use
307
+ # a pure amplifier rather than a compressor. This results in slightly
308
+ # better audio quality.
309
+ # :prev ::
310
+ # (FFI::Pointer(*GroovePlaylistItem)) A GroovePlaylist is a doubly linked list. Use these fields to
311
+ # traverse the list.
312
+ # :next_ ::
313
+ # (FFI::Pointer(*GroovePlaylistItem))
314
+ class GroovePlaylistItem < FFI::Struct
315
+ layout :file, GrooveFile,
316
+ :gain, :double,
317
+ :peak, :double,
318
+ :prev, :pointer,
319
+ :next_, :pointer
320
+ end
321
+
322
+ # A GroovePlaylist is a doubly linked list. Use these fields to
323
+ # traverse the list.
324
+ #
325
+ # = Fields:
326
+ # :head ::
327
+ # (GroovePlaylistItem) all fields are read-only. modify using methods below.
328
+ # doubly linked list which is the playlist
329
+ # :tail ::
330
+ # (GroovePlaylistItem)
331
+ # :gain ::
332
+ # (Float) volume adjustment in float format which applies to all playlist items
333
+ # and all sinks. defaults to 1.0.
334
+ class GroovePlaylist < FFI::Struct
335
+ layout :head, GroovePlaylistItem,
336
+ :tail, GroovePlaylistItem,
337
+ :gain, :double
338
+ end
339
+
340
+ # a playlist keeps its sinks full.
341
+ #
342
+ # @method playlist_create()
343
+ # @return [GroovePlaylist]
344
+ # @scope class
345
+ attach_function :playlist_create, :groove_playlist_create, [], GroovePlaylist
346
+
347
+ # this will not call groove_file_close on any files
348
+ # it will remove all playlist items and sinks from the playlist
349
+ #
350
+ # @method playlist_destroy(playlist)
351
+ # @param [GroovePlaylist] playlist
352
+ # @return [nil]
353
+ # @scope class
354
+ attach_function :playlist_destroy, :groove_playlist_destroy, [GroovePlaylist], :void
355
+
356
+ # (Not documented)
357
+ #
358
+ # @method playlist_play(playlist)
359
+ # @param [GroovePlaylist] playlist
360
+ # @return [nil]
361
+ # @scope class
362
+ attach_function :playlist_play, :groove_playlist_play, [GroovePlaylist], :void
363
+
364
+ # (Not documented)
365
+ #
366
+ # @method playlist_pause(playlist)
367
+ # @param [GroovePlaylist] playlist
368
+ # @return [nil]
369
+ # @scope class
370
+ attach_function :playlist_pause, :groove_playlist_pause, [GroovePlaylist], :void
371
+
372
+ # (Not documented)
373
+ #
374
+ # @method playlist_seek(playlist, item, seconds)
375
+ # @param [GroovePlaylist] playlist
376
+ # @param [GroovePlaylistItem] item
377
+ # @param [Float] seconds
378
+ # @return [nil]
379
+ # @scope class
380
+ attach_function :playlist_seek, :groove_playlist_seek, [GroovePlaylist, GroovePlaylistItem, :double], :void
381
+
382
+ # once you add a file to the playlist, you must not destroy it until you first
383
+ # remove it from the playlist.
384
+ # next: the item to insert before. if NULL, you will append to the playlist.
385
+ # gain: see GroovePlaylistItem structure. use 1.0 for no adjustment.
386
+ # peak: see GroovePlaylistItem structure. use 1.0 for no adjustment.
387
+ # returns the newly created playlist item.
388
+ #
389
+ # @method playlist_insert(playlist, file, gain, peak, next_)
390
+ # @param [GroovePlaylist] playlist
391
+ # @param [GrooveFile] file
392
+ # @param [Float] gain
393
+ # @param [Float] peak
394
+ # @param [GroovePlaylistItem] next_
395
+ # @return [GroovePlaylistItem]
396
+ # @scope class
397
+ attach_function :playlist_insert, :groove_playlist_insert, [GroovePlaylist, GrooveFile, :double, :double, GroovePlaylistItem], GroovePlaylistItem
398
+
399
+ # this will not call groove_file_close on item->file !
400
+ # item is destroyed and the address it points to is no longer valid
401
+ #
402
+ # @method playlist_remove(playlist, item)
403
+ # @param [GroovePlaylist] playlist
404
+ # @param [GroovePlaylistItem] item
405
+ # @return [nil]
406
+ # @scope class
407
+ attach_function :playlist_remove, :groove_playlist_remove, [GroovePlaylist, GroovePlaylistItem], :void
408
+
409
+ # get the position of the decode head
410
+ # both the current playlist item and the position in seconds in the playlist
411
+ # item are given. item will be set to NULL if the playlist is empty
412
+ # seconds will be set to -1.0 if item is NULL.
413
+ # you may pass NULL for item or seconds
414
+ # Note that typically you are more interested in the position of the play
415
+ # head, not the decode head. For example, if you have a GroovePlayer attached,
416
+ # groove_player_position will give you the position of the play head.
417
+ #
418
+ # @method playlist_position(playlist, item, seconds)
419
+ # @param [GroovePlaylist] playlist
420
+ # @param [FFI::Pointer(**GroovePlaylistItem)] item
421
+ # @param [FFI::Pointer(*Double)] seconds
422
+ # @return [nil]
423
+ # @scope class
424
+ attach_function :playlist_position, :groove_playlist_position, [GroovePlaylist, :pointer, :pointer], :void
425
+
426
+ # return 1 if the playlist is playing; 0 if it is not.
427
+ #
428
+ # @method playlist_playing(playlist)
429
+ # @param [GroovePlaylist] playlist
430
+ # @return [Integer]
431
+ # @scope class
432
+ attach_function :playlist_playing, :groove_playlist_playing, [GroovePlaylist], :int
433
+
434
+ # remove all playlist items
435
+ #
436
+ # @method playlist_clear(playlist)
437
+ # @param [GroovePlaylist] playlist
438
+ # @return [nil]
439
+ # @scope class
440
+ attach_function :playlist_clear, :groove_playlist_clear, [GroovePlaylist], :void
441
+
442
+ # return the count of playlist items
443
+ #
444
+ # @method playlist_count(playlist)
445
+ # @param [GroovePlaylist] playlist
446
+ # @return [Integer]
447
+ # @scope class
448
+ attach_function :playlist_count, :groove_playlist_count, [GroovePlaylist], :int
449
+
450
+ # (Not documented)
451
+ #
452
+ # @method playlist_set_gain(playlist, gain)
453
+ # @param [GroovePlaylist] playlist
454
+ # @param [Float] gain
455
+ # @return [nil]
456
+ # @scope class
457
+ attach_function :playlist_set_gain, :groove_playlist_set_gain, [GroovePlaylist, :double], :void
458
+
459
+ # (Not documented)
460
+ #
461
+ # @method playlist_set_item_gain(playlist, item, gain)
462
+ # @param [GroovePlaylist] playlist
463
+ # @param [GroovePlaylistItem] item
464
+ # @param [Float] gain
465
+ # @return [nil]
466
+ # @scope class
467
+ attach_function :playlist_set_item_gain, :groove_playlist_set_item_gain, [GroovePlaylist, GroovePlaylistItem, :double], :void
468
+
469
+ # (Not documented)
470
+ #
471
+ # @method playlist_set_item_peak(playlist, item, peak)
472
+ # @param [GroovePlaylist] playlist
473
+ # @param [GroovePlaylistItem] item
474
+ # @param [Float] peak
475
+ # @return [nil]
476
+ # @scope class
477
+ attach_function :playlist_set_item_peak, :groove_playlist_set_item_peak, [GroovePlaylist, GroovePlaylistItem, :double], :void
478
+
479
+ # Use this to set the fill mode using the constants above
480
+ #
481
+ # @method playlist_set_fill_mode(playlist, mode)
482
+ # @param [GroovePlaylist] playlist
483
+ # @param [Integer] mode
484
+ # @return [nil]
485
+ # @scope class
486
+ attach_function :playlist_set_fill_mode, :groove_playlist_set_fill_mode, [GroovePlaylist, :int], :void
487
+
488
+ # GrooveBuffer
489
+ #
490
+ # = Fields:
491
+ # :data ::
492
+ # (FFI::Pointer(**Uint8T)) all fields read-only
493
+ # for interleaved audio, data(0) is the buffer.
494
+ # for planar audio, each channel has a separate data pointer.
495
+ # for encoded audio, data(0) is the encoded buffer.
496
+ # :format ::
497
+ # (GrooveAudioFormat)
498
+ # :frame_count ::
499
+ # (Integer) number of audio frames described by this buffer
500
+ # for encoded audio, this is unknown and set to 0.
501
+ # :item ::
502
+ # (GroovePlaylistItem) when encoding, if item is NULL, this is a format header or trailer.
503
+ # otherwise, this is encoded audio for the item specified.
504
+ # when decoding, item is never NULL.
505
+ # :pos ::
506
+ # (Float)
507
+ # :size ::
508
+ # (Integer) total number of bytes contained in this buffer
509
+ # :pts ::
510
+ # (Integer) presentation time stamp of the buffer
511
+ class GrooveBuffer < FFI::Struct
512
+ layout :data, :pointer,
513
+ :format, GrooveAudioFormat.by_value,
514
+ :frame_count, :int,
515
+ :item, GroovePlaylistItem,
516
+ :pos, :double,
517
+ :size, :int,
518
+ :pts, :ulong
519
+ end
520
+
521
+ # presentation time stamp of the buffer
522
+ #
523
+ # @method buffer_ref(buffer)
524
+ # @param [GrooveBuffer] buffer
525
+ # @return [nil]
526
+ # @scope class
527
+ attach_function :buffer_ref, :groove_buffer_ref, [GrooveBuffer], :void
528
+
529
+ # (Not documented)
530
+ #
531
+ # @method buffer_unref(buffer)
532
+ # @param [GrooveBuffer] buffer
533
+ # @return [nil]
534
+ # @scope class
535
+ attach_function :buffer_unref, :groove_buffer_unref, [GrooveBuffer], :void
536
+
537
+ # use this to get access to a realtime raw audio buffer
538
+ # for example you could use it to draw a waveform or other visualization
539
+ # GroovePlayer uses this internally to get the audio buffer for playback
540
+ #
541
+ # = Fields:
542
+ # :audio_format ::
543
+ # (GrooveAudioFormat) set this to the audio format you want the sink to output
544
+ # :disable_resample ::
545
+ # (Integer) Set this flag to ignore audio_format. If you set this flag, the
546
+ # buffers you pull from this sink could have any audio format.
547
+ # :buffer_sample_count ::
548
+ # (Integer) If you leave this to its default of 0, frames pulled from the sink
549
+ # will have sample count determined by efficiency.
550
+ # If you set this to a positive number, frames pulled from the sink
551
+ # will always have this number of samples.
552
+ # :buffer_size ::
553
+ # (Integer) how big the buffer queue should be, in sample frames.
554
+ # groove_sink_create defaults this to 8192
555
+ # :gain ::
556
+ # (Float) This volume adjustment only applies to this sink.
557
+ # It is recommended that you leave this at 1.0 and instead adjust the
558
+ # gain of the playlist.
559
+ # If you want to change this value after you have already attached the
560
+ # sink to the playlist, you must use groove_sink_set_gain.
561
+ # float format. Defaults to 1.0
562
+ # :userdata ::
563
+ # (FFI::Pointer(*Void)) set to whatever you want
564
+ # :flush ::
565
+ # (FFI::Pointer(*)) called when the audio queue is flushed. For example, if you seek to a
566
+ # different location in the song.
567
+ # :purge ::
568
+ # (FFI::Pointer(*)) called when a playlist item is deleted. Take this opportunity to remove
569
+ # all your references to the GroovePlaylistItem.
570
+ # :pause ::
571
+ # (FFI::Pointer(*)) called when the playlist is paused
572
+ # :play ::
573
+ # (FFI::Pointer(*)) called when the playlist is played
574
+ # :playlist ::
575
+ # (GroovePlaylist) read-only. set when you call groove_sink_attach. cleared when you call
576
+ # groove_sink_detach
577
+ # :bytes_per_sec ::
578
+ # (Integer) read-only. automatically computed from audio_format when you call
579
+ # groove_sink_attach
580
+ class GrooveSink < FFI::Struct
581
+ layout :audio_format, GrooveAudioFormat.by_value,
582
+ :disable_resample, :int,
583
+ :buffer_sample_count, :int,
584
+ :buffer_size, :int,
585
+ :gain, :double,
586
+ :userdata, :pointer,
587
+ :flush, :pointer,
588
+ :purge, :pointer,
589
+ :pause, :pointer,
590
+ :play, :pointer,
591
+ :playlist, GroovePlaylist,
592
+ :bytes_per_sec, :int
593
+ end
594
+
595
+ # read-only. automatically computed from audio_format when you call
596
+ # groove_sink_attach
597
+ #
598
+ # @method sink_create()
599
+ # @return [GrooveSink]
600
+ # @scope class
601
+ attach_function :sink_create, :groove_sink_create, [], GrooveSink
602
+
603
+ # (Not documented)
604
+ #
605
+ # @method sink_destroy(sink)
606
+ # @param [GrooveSink] sink
607
+ # @return [nil]
608
+ # @scope class
609
+ attach_function :sink_destroy, :groove_sink_destroy, [GrooveSink], :void
610
+
611
+ # before calling this, set audio_format
612
+ # returns 0 on success, < 0 on error
613
+ #
614
+ # @method sink_attach(sink, playlist)
615
+ # @param [GrooveSink] sink
616
+ # @param [GroovePlaylist] playlist
617
+ # @return [Integer]
618
+ # @scope class
619
+ attach_function :sink_attach, :groove_sink_attach, [GrooveSink, GroovePlaylist], :int
620
+
621
+ # returns 0 on success, < 0 on error
622
+ #
623
+ # @method sink_detach(sink)
624
+ # @param [GrooveSink] sink
625
+ # @return [Integer]
626
+ # @scope class
627
+ attach_function :sink_detach, :groove_sink_detach, [GrooveSink], :int
628
+
629
+ # returns < 0 on error, GROOVE_BUFFER_NO on aborted (block=1) or no buffer
630
+ # ready (block=0), GROOVE_BUFFER_YES on buffer returned, and GROOVE_BUFFER_END
631
+ # on end of playlist.
632
+ # buffer is always set to either a valid GrooveBuffer or NULL
633
+ #
634
+ # @method sink_buffer_get(sink, buffer, block)
635
+ # @param [GrooveSink] sink
636
+ # @param [FFI::Pointer(**GrooveBuffer)] buffer
637
+ # @param [Integer] block
638
+ # @return [Integer]
639
+ # @scope class
640
+ attach_function :sink_buffer_get, :groove_sink_buffer_get, [GrooveSink, :pointer, :int], :int
641
+
642
+ # returns < 0 on error, 0 on no buffer ready, 1 on buffer ready
643
+ # if block is 1, block until buffer is ready
644
+ #
645
+ # @method sink_buffer_peek(sink, block)
646
+ # @param [GrooveSink] sink
647
+ # @param [Integer] block
648
+ # @return [Integer]
649
+ # @scope class
650
+ attach_function :sink_buffer_peek, :groove_sink_buffer_peek, [GrooveSink, :int], :int
651
+
652
+ # See the gain property of GrooveSink. It is recommended that you leave this
653
+ # at 1.0 and instead adjust the gain of the playlist.
654
+ # returns 0 on success, < 0 on error
655
+ #
656
+ # @method sink_set_gain(sink, gain)
657
+ # @param [GrooveSink] sink
658
+ # @param [Float] gain
659
+ # @return [Integer]
660
+ # @scope class
661
+ attach_function :sink_set_gain, :groove_sink_set_gain, [GrooveSink, :double], :int
662
+
663
+ # (Not documented)
664
+ #
665
+ # = Fields:
666
+ # :context ::
667
+ # (FFI::Pointer(*Void))
668
+ # :cleanup ::
669
+ # (FFI::Pointer(*)) // defaults to groove_queue_cleanup_default
670
+ # :put ::
671
+ # (FFI::Pointer(*))
672
+ # :get ::
673
+ # (FFI::Pointer(*))
674
+ # :purge ::
675
+ # (FFI::Pointer(*))
676
+ class GrooveQueue < FFI::Struct
677
+ layout :context, :pointer,
678
+ :cleanup, :pointer,
679
+ :put, :pointer,
680
+ :get, :pointer,
681
+ :purge, :pointer
682
+ end
683
+
684
+ # (Not documented)
685
+ #
686
+ # @method queue_create()
687
+ # @return [GrooveQueue]
688
+ # @scope class
689
+ attach_function :queue_create, :groove_queue_create, [], GrooveQueue
690
+
691
+ # (Not documented)
692
+ #
693
+ # @method queue_flush(queue)
694
+ # @param [GrooveQueue] queue
695
+ # @return [nil]
696
+ # @scope class
697
+ attach_function :queue_flush, :groove_queue_flush, [GrooveQueue], :void
698
+
699
+ # (Not documented)
700
+ #
701
+ # @method queue_destroy(queue)
702
+ # @param [GrooveQueue] queue
703
+ # @return [nil]
704
+ # @scope class
705
+ attach_function :queue_destroy, :groove_queue_destroy, [GrooveQueue], :void
706
+
707
+ # (Not documented)
708
+ #
709
+ # @method queue_abort(queue)
710
+ # @param [GrooveQueue] queue
711
+ # @return [nil]
712
+ # @scope class
713
+ attach_function :queue_abort, :groove_queue_abort, [GrooveQueue], :void
714
+
715
+ # (Not documented)
716
+ #
717
+ # @method queue_reset(queue)
718
+ # @param [GrooveQueue] queue
719
+ # @return [nil]
720
+ # @scope class
721
+ attach_function :queue_reset, :groove_queue_reset, [GrooveQueue], :void
722
+
723
+ # (Not documented)
724
+ #
725
+ # @method queue_put(queue, obj)
726
+ # @param [GrooveQueue] queue
727
+ # @param [FFI::Pointer(*Void)] obj
728
+ # @return [Integer]
729
+ # @scope class
730
+ attach_function :queue_put, :groove_queue_put, [GrooveQueue, :pointer], :int
731
+
732
+ # // returns -1 if aborted, 1 if got event, 0 if no event ready
733
+ #
734
+ # @method queue_get(queue, obj_ptr, block)
735
+ # @param [GrooveQueue] queue
736
+ # @param [FFI::Pointer(**Void)] obj_ptr
737
+ # @param [Integer] block
738
+ # @return [Integer]
739
+ # @scope class
740
+ attach_function :queue_get, :groove_queue_get, [GrooveQueue, :pointer, :int], :int
741
+
742
+ # (Not documented)
743
+ #
744
+ # @method queue_peek(queue, block)
745
+ # @param [GrooveQueue] queue
746
+ # @param [Integer] block
747
+ # @return [Integer]
748
+ # @scope class
749
+ attach_function :queue_peek, :groove_queue_peek, [GrooveQueue, :int], :int
750
+
751
+ # (Not documented)
752
+ #
753
+ # @method queue_purge(queue)
754
+ # @param [GrooveQueue] queue
755
+ # @return [nil]
756
+ # @scope class
757
+ attach_function :queue_purge, :groove_queue_purge, [GrooveQueue], :void
758
+
759
+ # (Not documented)
760
+ #
761
+ # @method queue_cleanup_default(queue, obj)
762
+ # @param [GrooveQueue] queue
763
+ # @param [FFI::Pointer(*Void)] obj
764
+ # @return [nil]
765
+ # @scope class
766
+ attach_function :queue_cleanup_default, :groove_queue_cleanup_default, [GrooveQueue, :pointer], :void
767
+
768
+ end