Class: RbSDL2::Audio
- Inherits:
-
Object
- Object
- RbSDL2::Audio
- Includes:
- AudioSpecReader
- Defined in:
- lib/rb_sdl2/audio/audio.rb,
lib/rb_sdl2/audio/audio_spec.rb,
lib/rb_sdl2/audio/audio_buffer.rb,
lib/rb_sdl2/audio/audio_device.rb,
lib/rb_sdl2/audio/audio_spec_reader.rb
Defined Under Namespace
Modules: AudioSpecReader Classes: AudioBuffer, AudioDevice, AudioSpec, Releaser
Constant Summary collapse
- SDL_AUDIO_ALLOW_FREQUENCY_CHANGE =
0x00000001- SDL_AUDIO_ALLOW_FORMAT_CHANGE =
0x00000002- SDL_AUDIO_ALLOW_CHANNELS_CHANGE =
0x00000004- SDL_AUDIO_ALLOW_SAMPLES_CHANGE =
0x00000008- SDL_AUDIO_ALLOW_ANY_CHANGE =
SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_FORMAT_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE | SDL_AUDIO_ALLOW_SAMPLES_CHANGE
- SDL_AUDIO_STOPPED =
0- SDL_AUDIO_PLAYING =
1- SDL_AUDIO_PAUSED =
2- IS_CAPTURE =
-> (capture) { capture ? 1 : 0 }
Instance Attribute Summary collapse
-
#spec ⇒ Object
readonly
Returns the value of attribute spec.
Class Method Summary collapse
- .devices ⇒ Object
- .driver ⇒ Object
- .drivers ⇒ Object
- .init(driver) ⇒ Object
- .load ⇒ Object
- .open ⇒ Object
- .play(path) ⇒ Object
- .quit ⇒ Object
Instance Method Summary collapse
- #autoclose=(bool) ⇒ Object
- #autoclose? ⇒ Boolean
- #capture? ⇒ Boolean
- #clear ⇒ Object
- #close ⇒ Object
- #closed? ⇒ Boolean
- #id ⇒ Object (also: #audio_id)
-
#initialize(device = nil, capture = false, allow_any_change: false, allow_channels_change: false, allow_frequency_change: false, allow_format_change: false, allow_samples_change: false, autoclose: true, spec: nil, **opts) ⇒ Audio
constructor
A new instance of Audio.
- #inspect ⇒ Object
- #pause ⇒ Object
- #paused? ⇒ Boolean
- #play ⇒ Object
- #playing? ⇒ Boolean
- #read(len) ⇒ Object
- #size ⇒ Object (also: #length)
- #write(data) ⇒ Object
Constructor Details
#initialize(device = nil, capture = false, allow_any_change: false, allow_channels_change: false, allow_frequency_change: false, allow_format_change: false, allow_samples_change: false, autoclose: true, spec: nil, **opts) ⇒ Audio
Returns a new instance of Audio.
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/rb_sdl2/audio/audio.rb', line 66 def initialize(device = nil, capture = false, allow_any_change: false, allow_channels_change: false, allow_frequency_change: false, allow_format_change: false, allow_samples_change: false, autoclose: true, spec: nil, **opts) @capture = capture ? true : false @spec = AudioSpec.new allowed_changes = if allow_any_change SDL_AUDIO_ALLOW_ANY_CHANGE else 0 | (allow_channels_change ? SDL_AUDIO_ALLOW_CHANNELS_CHANGE : 0) | (allow_frequency_change ? SDL_AUDIO_ALLOW_FREQUENCY_CHANGE : 0) | (allow_format_change ? SDL_AUDIO_ALLOW_FORMAT_CHANGE : 0) | (allow_samples_change ? SDL_AUDIO_ALLOW_SAMPLES_CHANGE : 0) end @id = ::SDL.OpenAudioDevice(device ? SDL.str_to_sdl(device) : nil, IS_CAPTURE.(capture), spec || AudioSpec.new(**opts), @spec, allowed_changes) raise RbSDL2Error if @id == 0 self.autoclose = autoclose end |
Instance Attribute Details
#spec ⇒ Object (readonly)
Returns the value of attribute spec.
150 151 152 |
# File 'lib/rb_sdl2/audio/audio.rb', line 150 def spec @spec end |
Class Method Details
.devices ⇒ Object
19 |
# File 'lib/rb_sdl2/audio/audio.rb', line 19 def devices = AudioDevice.devices |
.driver ⇒ Object
21 22 23 24 25 |
# File 'lib/rb_sdl2/audio/audio.rb', line 21 def driver ptr = ::SDL.GetCurrentAudioDriver raise RbSDL2Error, "Audio subsystem has not been initialized" if ptr.null? ptr.read_string end |
.drivers ⇒ Object
27 28 29 30 31 32 33 |
# File 'lib/rb_sdl2/audio/audio.rb', line 27 def drivers ::SDL.GetNumAudioDrivers.times.map do |num| ptr = ::SDL.GetAudioDriver(num) raise RbSDL2Error if ptr.null? ptr.read_string end end |
.init(driver) ⇒ Object
35 36 37 |
# File 'lib/rb_sdl2/audio/audio.rb', line 35 def init(driver) raise RbSDL2Error if ::SDL.AudioInit(driver) < 0 end |
.load ⇒ Object
41 |
# File 'lib/rb_sdl2/audio/audio.rb', line 41 def load(...) = AudioBuffer.load(...) |
.open ⇒ Object
43 44 45 46 47 48 49 50 51 |
# File 'lib/rb_sdl2/audio/audio.rb', line 43 def open(...) obj = new(...) return obj unless block_given? begin yield(obj) ensure obj.close end end |
.play(path) ⇒ Object
53 54 55 56 57 58 59 |
# File 'lib/rb_sdl2/audio/audio.rb', line 53 def play(path) buffer = load(path) obj = Audio.new(spec: buffer.spec) obj.write(buffer) obj.play obj end |
.quit ⇒ Object
61 |
# File 'lib/rb_sdl2/audio/audio.rb', line 61 def quit = ::SDL.AudioQuit |
Instance Method Details
#autoclose=(bool) ⇒ Object
93 94 95 96 97 98 99 100 101 |
# File 'lib/rb_sdl2/audio/audio.rb', line 93 def autoclose=(bool) return if closed? if bool ObjectSpace.define_finalizer(self, Releaser.new(@id)) else ObjectSpace.undefine_finalizer(self) end @autoclose = bool ? true : false end |
#autoclose? ⇒ Boolean
103 |
# File 'lib/rb_sdl2/audio/audio.rb', line 103 def autoclose? = @autoclose |
#capture? ⇒ Boolean
105 |
# File 'lib/rb_sdl2/audio/audio.rb', line 105 def capture? = @capture |
#clear ⇒ Object
107 |
# File 'lib/rb_sdl2/audio/audio.rb', line 107 def clear = closed? ? nil : ::SDL.ClearQueuedAudio(self) |
#close ⇒ Object
109 110 111 112 113 114 115 |
# File 'lib/rb_sdl2/audio/audio.rb', line 109 def close unless closed? self.autoclose = false @id = ::SDL.CloseAudioDevice(@id) end nil end |
#closed? ⇒ Boolean
117 |
# File 'lib/rb_sdl2/audio/audio.rb', line 117 def closed? = SDL_AUDIO_STOPPED == ::SDL.GetAudioDeviceStatus(@id) || !@id |
#id ⇒ Object Also known as: audio_id
119 120 121 122 |
# File 'lib/rb_sdl2/audio/audio.rb', line 119 def id raise IOError if closed? @id end |
#inspect ⇒ Object
125 126 127 |
# File 'lib/rb_sdl2/audio/audio.rb', line 125 def inspect "#<#{self.class.name}:#{audio_id}#{closed? ? " (closed)" : nil}>" end |
#pause ⇒ Object
129 |
# File 'lib/rb_sdl2/audio/audio.rb', line 129 def pause = closed? ? nil : ::SDL.PauseAudioDevice(id, 1) |
#paused? ⇒ Boolean
131 |
# File 'lib/rb_sdl2/audio/audio.rb', line 131 def paused? = closed? ? false : SDL_AUDIO_PAUSED == ::SDL.GetAudioDeviceStatus(id) |
#play ⇒ Object
133 |
# File 'lib/rb_sdl2/audio/audio.rb', line 133 def play = closed? ? nil : ::SDL.PauseAudioDevice(id, 0) |
#playing? ⇒ Boolean
135 |
# File 'lib/rb_sdl2/audio/audio.rb', line 135 def = closed? ? false : SDL_AUDIO_PLAYING == ::SDL.GetAudioDeviceStatus(id) |
#read(len) ⇒ Object
137 138 139 140 141 142 |
# File 'lib/rb_sdl2/audio/audio.rb', line 137 def read(len) raise IOError if closed? ptr = ::FFI::MemoryPointer.new(len) size = ::SDL.DequeueAudio(id, ptr, len) ptr.read_bytes(size) end |
#size ⇒ Object Also known as: length
144 145 146 147 |
# File 'lib/rb_sdl2/audio/audio.rb', line 144 def size raise IOError if closed? ::SDL.GetQueuedAudioSize(id) end |
#write(data) ⇒ Object
155 156 157 158 159 160 |
# File 'lib/rb_sdl2/audio/audio.rb', line 155 def write(data) raise IOError if closed? err = ::SDL.QueueAudio(id, data, data.size) raise RbSDL2Error if err < 0 data.size end |