fmod 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +5 -0
- data/.yardopts +2 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +96 -0
- data/Rakefile +1 -0
- data/bin/console +28 -0
- data/bin/setup +8 -0
- data/ext/fmod.dll +0 -0
- data/ext/fmod64.dll +0 -0
- data/ext/libfmod.dylib +0 -0
- data/ext/llbfmod.zip +0 -0
- data/extras/FMOD Studio Programmers API for Windows.chm +0 -0
- data/fmod.gemspec +58 -0
- data/lib/fmod.rb +564 -0
- data/lib/fmod/channel.rb +151 -0
- data/lib/fmod/channel_control.rb +821 -0
- data/lib/fmod/channel_group.rb +61 -0
- data/lib/fmod/core.rb +35 -0
- data/lib/fmod/core/bool_description.rb +18 -0
- data/lib/fmod/core/channel_mask.rb +24 -0
- data/lib/fmod/core/data_description.rb +14 -0
- data/lib/fmod/core/driver.rb +59 -0
- data/lib/fmod/core/dsp_description.rb +7 -0
- data/lib/fmod/core/dsp_index.rb +9 -0
- data/lib/fmod/core/dsp_type.rb +43 -0
- data/lib/fmod/core/extensions.rb +28 -0
- data/lib/fmod/core/file_system.rb +86 -0
- data/lib/fmod/core/filter_type.rb +19 -0
- data/lib/fmod/core/float_description.rb +16 -0
- data/lib/fmod/core/guid.rb +50 -0
- data/lib/fmod/core/init_flags.rb +19 -0
- data/lib/fmod/core/integer_description.rb +26 -0
- data/lib/fmod/core/mode.rb +36 -0
- data/lib/fmod/core/output_type.rb +30 -0
- data/lib/fmod/core/parameter_info.rb +41 -0
- data/lib/fmod/core/parameter_type.rb +10 -0
- data/lib/fmod/core/result.rb +88 -0
- data/lib/fmod/core/reverb.rb +217 -0
- data/lib/fmod/core/sound_ex_info.rb +7 -0
- data/lib/fmod/core/sound_format.rb +30 -0
- data/lib/fmod/core/sound_group_behavior.rb +9 -0
- data/lib/fmod/core/sound_type.rb +80 -0
- data/lib/fmod/core/speaker_index.rb +18 -0
- data/lib/fmod/core/speaker_mode.rb +16 -0
- data/lib/fmod/core/spectrum_data.rb +12 -0
- data/lib/fmod/core/structure.rb +23 -0
- data/lib/fmod/core/structures.rb +41 -0
- data/lib/fmod/core/tag.rb +51 -0
- data/lib/fmod/core/tag_data_type.rb +14 -0
- data/lib/fmod/core/time_unit.rb +40 -0
- data/lib/fmod/core/vector.rb +42 -0
- data/lib/fmod/core/window_type.rb +12 -0
- data/lib/fmod/dsp.rb +510 -0
- data/lib/fmod/dsp_connection.rb +113 -0
- data/lib/fmod/effects.rb +38 -0
- data/lib/fmod/effects/channel_mix.rb +101 -0
- data/lib/fmod/effects/chorus.rb +30 -0
- data/lib/fmod/effects/compressor.rb +52 -0
- data/lib/fmod/effects/convolution_reverb.rb +31 -0
- data/lib/fmod/effects/delay.rb +44 -0
- data/lib/fmod/effects/distortion.rb +16 -0
- data/lib/fmod/effects/dsps.rb +10 -0
- data/lib/fmod/effects/echo.rb +37 -0
- data/lib/fmod/effects/envelope_follower.rb +31 -0
- data/lib/fmod/effects/fader.rb +16 -0
- data/lib/fmod/effects/fft.rb +38 -0
- data/lib/fmod/effects/flange.rb +37 -0
- data/lib/fmod/effects/high_pass.rb +24 -0
- data/lib/fmod/effects/high_pass_simple.rb +25 -0
- data/lib/fmod/effects/it_echo.rb +56 -0
- data/lib/fmod/effects/it_lowpass.rb +36 -0
- data/lib/fmod/effects/ladspa_plugin.rb +14 -0
- data/lib/fmod/effects/limiter.rb +32 -0
- data/lib/fmod/effects/loudness_meter.rb +19 -0
- data/lib/fmod/effects/low_pass.rb +25 -0
- data/lib/fmod/effects/low_pass_simple.rb +26 -0
- data/lib/fmod/effects/mixer.rb +11 -0
- data/lib/fmod/effects/multiband_eq.rb +153 -0
- data/lib/fmod/effects/normalize.rb +47 -0
- data/lib/fmod/effects/object_pan.rb +62 -0
- data/lib/fmod/effects/oscillator.rb +52 -0
- data/lib/fmod/effects/pan.rb +166 -0
- data/lib/fmod/effects/param_eq.rb +36 -0
- data/lib/fmod/effects/pitch_shift.rb +47 -0
- data/lib/fmod/effects/return.rb +18 -0
- data/lib/fmod/effects/send.rb +21 -0
- data/lib/fmod/effects/sfx_reverb.rb +87 -0
- data/lib/fmod/effects/three_eq.rb +41 -0
- data/lib/fmod/effects/transceiver.rb +57 -0
- data/lib/fmod/effects/tremolo.rb +67 -0
- data/lib/fmod/effects/vst_plugin.rb +12 -0
- data/lib/fmod/effects/winamp_plugin.rb +12 -0
- data/lib/fmod/error.rb +108 -0
- data/lib/fmod/geometry.rb +380 -0
- data/lib/fmod/handle.rb +129 -0
- data/lib/fmod/reverb3D.rb +98 -0
- data/lib/fmod/sound.rb +810 -0
- data/lib/fmod/sound_group.rb +54 -0
- data/lib/fmod/system.rb +1242 -0
- data/lib/fmod/version.rb +3 -0
- metadata +220 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
|
2
|
+
module FMOD
|
3
|
+
class ChannelGroup < ChannelControl
|
4
|
+
|
5
|
+
include Fiddle
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
integer_reader(:subgroup_count, :ChannelGroup_GetNumGroups)
|
9
|
+
integer_reader(:channel_count, :ChannelGroup_GetNumChannels)
|
10
|
+
|
11
|
+
def name
|
12
|
+
buffer = "\0" * 512
|
13
|
+
FMOD.invoke(:ChannelGroup_GetName, self, buffer, 512)
|
14
|
+
buffer.delete("\0")
|
15
|
+
end
|
16
|
+
|
17
|
+
def subgroup(index)
|
18
|
+
FMOD.valid_range?(index, 0, subgroup_count - 1)
|
19
|
+
FMOD.invoke(:ChannelGroup_GetGroup, self, index, group = int_ptr)
|
20
|
+
ChannelGroup.new(group)
|
21
|
+
end
|
22
|
+
|
23
|
+
def parent_group
|
24
|
+
FMOD.invoke(:ChannelGroup_GetParentGroup, self, group = int_ptr)
|
25
|
+
group.null? ? nil : ChannelGroup.new(group)
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](index)
|
29
|
+
FMOD.valid_range?(index, 0, channel_count - 1)
|
30
|
+
FMOD.invoke(:ChannelGroup_GetChannel, self, index, channel = int_ptr)
|
31
|
+
Channel.new(channel)
|
32
|
+
end
|
33
|
+
|
34
|
+
def each
|
35
|
+
return to_enum(:each) unless block_given?
|
36
|
+
(0...channel_count).each { |i| yield self[i] }
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def <<(channel_control)
|
41
|
+
return add_channel(channel_control) if channel_control.is_a?(Channel)
|
42
|
+
return add_group(channel_control) if channel_control.is_a?(ChannelGroup)
|
43
|
+
raise TypeError, "#{channel_control} is not a #{ChannelControl}."
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_channel(channel)
|
47
|
+
FMOD.type?(channel, Channel)
|
48
|
+
channel.group = self
|
49
|
+
channel
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_group(group, propagate_clock = true)
|
53
|
+
FMOD.type?(group, ChannelGroup)
|
54
|
+
FMOD.invoke(:ChannelGroup_AddGroup, self, group,
|
55
|
+
propagate_clock.to_i, connection = int_ptr)
|
56
|
+
DspConnection.new(connection)
|
57
|
+
end
|
58
|
+
|
59
|
+
alias_method :channel, :[]
|
60
|
+
end
|
61
|
+
end
|
data/lib/fmod/core.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
require_relative './core/structure'
|
3
|
+
require_relative './core/structures'
|
4
|
+
require_relative './core/bool_description'
|
5
|
+
require_relative './core/channel_mask'
|
6
|
+
require_relative './core/data_description'
|
7
|
+
require_relative './core/driver'
|
8
|
+
require_relative './core/dsp_description'
|
9
|
+
require_relative './core/dsp_index'
|
10
|
+
require_relative './core/dsp_type'
|
11
|
+
require_relative './core/extensions'
|
12
|
+
require_relative './core/file_system'
|
13
|
+
require_relative './core/filter_type'
|
14
|
+
require_relative './core/float_description'
|
15
|
+
require_relative './core/guid'
|
16
|
+
require_relative './core/init_flags'
|
17
|
+
require_relative './core/integer_description'
|
18
|
+
require_relative './core/mode'
|
19
|
+
require_relative './core/output_type'
|
20
|
+
require_relative './core/parameter_info'
|
21
|
+
require_relative './core/parameter_type'
|
22
|
+
require_relative './core/result'
|
23
|
+
require_relative './core/reverb'
|
24
|
+
require_relative './core/sound_ex_info'
|
25
|
+
require_relative './core/sound_format'
|
26
|
+
require_relative './core/sound_group_behavior'
|
27
|
+
require_relative './core/sound_type'
|
28
|
+
require_relative './core/speaker_index'
|
29
|
+
require_relative './core/speaker_mode'
|
30
|
+
require_relative './core/spectrum_data'
|
31
|
+
require_relative './core/tag'
|
32
|
+
require_relative './core/tag_data_type'
|
33
|
+
require_relative './core/time_unit'
|
34
|
+
require_relative './core/vector'
|
35
|
+
require_relative './core/window_type'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module FMOD
|
2
|
+
module Core
|
3
|
+
class BoolDescription < Structure
|
4
|
+
|
5
|
+
def initialize(address = nil)
|
6
|
+
super(address, [TYPE_INT, TYPE_VOIDP], [:default, :names])
|
7
|
+
end
|
8
|
+
|
9
|
+
def default
|
10
|
+
self[:default] != 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def names
|
14
|
+
%w(true false)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module FMOD
|
2
|
+
module Core
|
3
|
+
module ChannelMask
|
4
|
+
FRONT_LEFT = 0x00000001
|
5
|
+
FRONT_RIGHT = 0x00000002
|
6
|
+
FRONT_CENTER = 0x00000004
|
7
|
+
LOW_FREQUENCY = 0x00000008
|
8
|
+
SURROUND_LEFT = 0x00000010
|
9
|
+
SURROUND_RIGHT = 0x00000020
|
10
|
+
BACK_LEFT = 0x00000040
|
11
|
+
BACK_RIGHT = 0x00000080
|
12
|
+
BACK_CENTER = 0x00000100
|
13
|
+
MONO = FRONT_LEFT
|
14
|
+
STEREO = FRONT_LEFT | FRONT_RIGHT
|
15
|
+
LRC = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER
|
16
|
+
QUAD = FRONT_LEFT | FRONT_RIGHT | SURROUND_LEFT | SURROUND_RIGHT
|
17
|
+
SURROUND = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT
|
18
|
+
FIVE_POINT_ONE = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT
|
19
|
+
FIVE_POINT_ONE_REARS = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | BACK_LEFT | BACK_RIGHT
|
20
|
+
SEVEN_POINT_ZERO = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT
|
21
|
+
SEVEN_POINT_ONE = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module FMOD
|
2
|
+
module Core
|
3
|
+
|
4
|
+
##
|
5
|
+
# Identification information about a sound device.
|
6
|
+
class Driver
|
7
|
+
|
8
|
+
private_class_method :new
|
9
|
+
|
10
|
+
##
|
11
|
+
# @return [Integer] the enumerated driver ID.
|
12
|
+
attr_reader :id
|
13
|
+
|
14
|
+
##
|
15
|
+
# @return [String] the name of the device encoded in a UTF-8 string.
|
16
|
+
attr_reader :name
|
17
|
+
|
18
|
+
##
|
19
|
+
# @return [Guid] the GUID that uniquely identifies the device.
|
20
|
+
attr_reader :guid
|
21
|
+
|
22
|
+
##
|
23
|
+
# @return [Integer] the sample rate this device operates at.
|
24
|
+
attr_reader :rate
|
25
|
+
|
26
|
+
##
|
27
|
+
# @return [Integer] the speaker setup this device is currently using.
|
28
|
+
# @see SpeakerMode
|
29
|
+
attr_reader :speaker_mode
|
30
|
+
|
31
|
+
##
|
32
|
+
# @return [Integer] the number of channels in the current speaker setup.
|
33
|
+
attr_reader :channels
|
34
|
+
|
35
|
+
##
|
36
|
+
# @return [Integer] flags that provide additional information about the
|
37
|
+
# driver.
|
38
|
+
attr_reader :state
|
39
|
+
|
40
|
+
##
|
41
|
+
# @param args [Array] Array of binary data.
|
42
|
+
# @api private
|
43
|
+
def initialize(args)
|
44
|
+
@id = args.shift
|
45
|
+
# noinspection RubyResolve
|
46
|
+
@name = args.shift.delete("\0").force_encoding(Encoding::UTF_8)
|
47
|
+
args.shift
|
48
|
+
@guid = args.shift
|
49
|
+
@rate, @speaker_mode, @channels, @state = args.join.unpack('l*')
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# @return [Boolean] +true+ if this a record driver, otherwise +false+.
|
54
|
+
def record_driver?
|
55
|
+
!@state.nil?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module FMOD
|
2
|
+
module Core
|
3
|
+
module DspType
|
4
|
+
UNKNOWN = 0
|
5
|
+
MIXER = 1
|
6
|
+
OSCILLATOR = 2
|
7
|
+
LOW_PASS = 3
|
8
|
+
IT_LOW_PASS = 4
|
9
|
+
HIGH_PASS = 5
|
10
|
+
ECHO = 6
|
11
|
+
FADER = 7
|
12
|
+
FLANGE = 8
|
13
|
+
DISTORTION = 9
|
14
|
+
NORMALIZE = 10
|
15
|
+
LIMITER = 11
|
16
|
+
PARAM_EQ = 12
|
17
|
+
PITCH_SHIFT = 13
|
18
|
+
CHORUS = 14
|
19
|
+
VST_PLUGIN = 15
|
20
|
+
WINAMP_PLUGIN = 16
|
21
|
+
IT_ECHO = 17
|
22
|
+
COMPRESSOR = 18
|
23
|
+
SFX_REVERB = 19
|
24
|
+
LOW_PASS_SIMPLE = 20
|
25
|
+
DELAY = 21
|
26
|
+
TREMOLO = 22
|
27
|
+
LADSPA_PLUGIN = 23
|
28
|
+
SEND = 24
|
29
|
+
RETURN = 25
|
30
|
+
HIGH_PASS_SIMPLE = 26
|
31
|
+
PAN = 27
|
32
|
+
THREE_EQ = 28
|
33
|
+
FFT = 29
|
34
|
+
LOUDNESS_METER = 30
|
35
|
+
ENVELOPE_FOLLOWER = 31
|
36
|
+
CONVOLUTION_REVERB = 32
|
37
|
+
CHANNEL_MIX = 33
|
38
|
+
TRANSCEIVER = 34
|
39
|
+
OBJECT_PAN = 35
|
40
|
+
MULTIBAND_EQ = 36
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
class Numeric
|
3
|
+
|
4
|
+
def clamp(min, max)
|
5
|
+
[min, self, max].sort[1]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class String
|
10
|
+
|
11
|
+
unless method_defined?(:unpack1)
|
12
|
+
def unpack1(format)
|
13
|
+
unpack(format).first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class TrueClass
|
19
|
+
def to_i
|
20
|
+
1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class FalseClass
|
25
|
+
def to_i
|
26
|
+
0
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module FMOD
|
2
|
+
module Core
|
3
|
+
class FileSystem
|
4
|
+
|
5
|
+
include Fiddle
|
6
|
+
|
7
|
+
# TODO: Upsets the stack, causing a segfault with STD_CALL.
|
8
|
+
|
9
|
+
def initialize(system)
|
10
|
+
@callbacks = []
|
11
|
+
@cbs = [open_cb, close_cb, seek_cb, close_cb]
|
12
|
+
FMOD.invoke(:System_AttachFileSystem, system, *@cbs)
|
13
|
+
end
|
14
|
+
|
15
|
+
def on_open(proc = nil, &block)
|
16
|
+
set_callback(0, &(block_given? ? block : proc))
|
17
|
+
end
|
18
|
+
|
19
|
+
def on_close(proc = nil, &block)
|
20
|
+
set_callback(1, &(block_given? ? block : proc))
|
21
|
+
end
|
22
|
+
|
23
|
+
def on_read(proc = nil, &block)
|
24
|
+
set_callback(2, &(block_given? ? block : proc))
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_seek(proc = nil, &block)
|
28
|
+
set_callback(3, &(block_given? ? block : proc))
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def set_callback(index, &block)
|
34
|
+
raise LocalJumpError, "No block given." unless block_given?
|
35
|
+
@callbacks[index] = block
|
36
|
+
end
|
37
|
+
|
38
|
+
def open_cb
|
39
|
+
sig = Array.new(4, TYPE_VOIDP)
|
40
|
+
abi = FMOD::ABI
|
41
|
+
Closure::BlockCaller.new(TYPE_INT, sig, abi) do |name, size, ptr, user|
|
42
|
+
if @callbacks[0]
|
43
|
+
size = size.to_s(SIZEOF_INT).unpack1('L')
|
44
|
+
@callbacks[0].call(name, size, ptr, user)
|
45
|
+
end
|
46
|
+
Result::OK
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def close_cb
|
51
|
+
sig = [TYPE_VOIDP, TYPE_VOIDP]
|
52
|
+
abi = FMOD::ABI
|
53
|
+
Closure::BlockCaller.new(TYPE_INT, sig, abi) do |handle, user_data|
|
54
|
+
@callbacks[1].call(handle, user_data) if @callbacks[1]
|
55
|
+
Result::OK
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def read_cb
|
60
|
+
sig = Array.new(5, TYPE_VOIDP)
|
61
|
+
abi = FMOD::ABI
|
62
|
+
Closure::BlockCaller.new(TYPE_INT, sig, abi) do |handle, buffer, size, read, user|
|
63
|
+
if @callbacks[2]
|
64
|
+
@callbacks[2].call(handle, buffer, size, read, user)
|
65
|
+
end
|
66
|
+
Result::OK
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def seek_cb
|
71
|
+
sig = Array.new(3, TYPE_VOIDP)
|
72
|
+
abi = FMOD::ABI
|
73
|
+
Closure::BlockCaller.new(TYPE_INT, sig, abi) do |handle, position, user|
|
74
|
+
if @callbacks[3]
|
75
|
+
@callbacks[3].call(handle, position, user)
|
76
|
+
end
|
77
|
+
Result::OK
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# TODO: Remove after fixing
|
83
|
+
private_constant :FileSystem
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module FMOD
|
2
|
+
module Core
|
3
|
+
module FilterType
|
4
|
+
DISABLED = 0
|
5
|
+
LOW_PASS_12DB = 1
|
6
|
+
LOW_PASS_24DB = 2
|
7
|
+
LOW_PASS_48DB = 3
|
8
|
+
HIGH_PASS_12DB = 4
|
9
|
+
HIGH_PASS_24DB = 5
|
10
|
+
HIGH_PASS_48DB = 6
|
11
|
+
LOW_SHELF = 7
|
12
|
+
HIGH_SHELF = 8
|
13
|
+
PEAKING = 9
|
14
|
+
BANDPASS = 10
|
15
|
+
NOTCH = 11
|
16
|
+
ALL_PASS = 12
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module FMOD
|
2
|
+
module Core
|
3
|
+
class FloatDescription < Structure
|
4
|
+
|
5
|
+
def initialize(address = nil)
|
6
|
+
types = [TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_INT]
|
7
|
+
members = [:min, :max, :default, :mapping]
|
8
|
+
super(address, types, members)
|
9
|
+
end
|
10
|
+
|
11
|
+
[:min, :max, :default, :mapping].each do |symbol|
|
12
|
+
define_method(symbol) { self[symbol] }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module FMOD
|
4
|
+
module Core
|
5
|
+
class Guid < Structure
|
6
|
+
|
7
|
+
def initialize(address = nil)
|
8
|
+
types = [TYPE_INT, TYPE_SHORT, TYPE_SHORT, [TYPE_CHAR, 8]]
|
9
|
+
members = [:data1, :data2, :data3, :data4]
|
10
|
+
super(address, types, members)
|
11
|
+
end
|
12
|
+
|
13
|
+
def data1
|
14
|
+
[self[:data1]].pack('l').unpack1('L')
|
15
|
+
end
|
16
|
+
|
17
|
+
def data2
|
18
|
+
[self[:data2]].pack('s').unpack1('S')
|
19
|
+
end
|
20
|
+
|
21
|
+
def data3
|
22
|
+
[self[:data3]].pack('s').unpack1('S')
|
23
|
+
end
|
24
|
+
|
25
|
+
def data4
|
26
|
+
self[:data4].pack('c*').unpack('C*')
|
27
|
+
end
|
28
|
+
|
29
|
+
def eql?(obj)
|
30
|
+
if obj.is_a?(Guid)
|
31
|
+
return false unless data1 == obj.data1
|
32
|
+
return false unless data2 == obj.data2
|
33
|
+
return false unless data3 == obj.data3
|
34
|
+
return data4 == obj.data4
|
35
|
+
end
|
36
|
+
to_s.tr('-', '').casecmp(obj.to_s.tr('-', '')).zero?
|
37
|
+
end
|
38
|
+
|
39
|
+
def ==(obj)
|
40
|
+
eql?(obj)
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
d4 = data4
|
45
|
+
last = d4[2, 6].map { |byte| "%02X" % byte }.join
|
46
|
+
"%08X-%04X-%04X-%02X%02X-#{last}" % [data1, data2, data3, d4[0], d4[1]]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|