SF::Sound#buffer broken
vypxl opened this issue · comments
This code
buffer = SF::SoundBuffer.from_file "foo.wav"
sound = SF::Sound.new
sound.buffer = buffer
buffer_get_result = sound.buffer # Error
produces following error:
in lib/crsfml/src/audio/obj.cr:1180: argument 'result' of 'VoidCSFML#sfml_sound_getbuffer' must be Pointer(Pointer(Void)), not SF::SoundBuffer (nor Pointer(Void) returned by 'SF::SoundBuffer#to_unsafe')
VoidCSFML.sfml_sound_getbuffer(to_unsafe, result)
^~~~~~
Issue seems to lie in
https://github.com/oprypin/crsfml/blob/v2.5.0/src/audio/obj.cr#L1178
def buffer() : SoundBuffer?
result = SoundBuffer.allocate
VoidCSFML.sfml_sound_getbuffer(to_unsafe, result)
return result
end
and
https://github.com/oprypin/crsfml/blob/v2.5.0/voidcsfml/src/voidcsfml/audio.cpp#L383
void sfml_sound_getbuffer(void* self, void** result) {
*(SoundBuffer**)result = const_cast<SoundBuffer*>(((Sound*)self)->getBuffer());
}
diff --git a/src/audio/obj.cr b/src/audio/obj.cr
index f1021298e..70a0fe4cd 100644
--- a/src/audio/obj.cr
+++ b/src/audio/obj.cr
@@ -1119,6 +1119,7 @@ module SF
# * *buffer* - Sound buffer containing the audio data to play with the sound
def initialize(buffer : SoundBuffer)
VoidCSFML.sfml_sound_allocate(out @this)
+ @_sound_buffer = buffer
VoidCSFML.sfml_sound_initialize_mWu(to_unsafe, buffer)
end
# Destructor
@@ -1167,8 +1168,10 @@ module SF
#
# *See also:* `buffer`
def buffer=(buffer : SoundBuffer)
+ @_sound_buffer = buffer
VoidCSFML.sfml_sound_setbuffer_mWu(to_unsafe, buffer)
end
+ @_sound_buffer : SoundBuffer? = nil
# Set whether or not the sound should loop after reaching the end
#
# If set, the sound will restart from beginning after
@@ -1199,9 +1202,7 @@ module SF
#
# *Returns:* Sound buffer attached to the sound (can be NULL)
def buffer() : SoundBuffer?
- result = SoundBuffer.allocate
- VoidCSFML.sfml_sound_getbuffer(to_unsafe, result)
- return result
+ return @_sound_buffer
end
# Tell whether or not the sound is in loop mode
#
@@ -1239,6 +1240,10 @@ module SF
VoidCSFML.sfml_sound_resetbuffer(to_unsafe)
end
# :nodoc:
+ def buffer() : SoundBuffer?
+ return @_sound_buffer
+ end
+ # :nodoc:
def pitch=(pitch : Number)
VoidCSFML.sfml_sound_setpitch_Bw9(to_unsafe, LibC::Float.new(pitch))
end
diff --git a/src/graphics/obj.cr b/src/graphics/obj.cr
index 5718c0b16..115e63928 100644
--- a/src/graphics/obj.cr
+++ b/src/graphics/obj.cr
@@ -742,7 +742,7 @@ module SF
# Construct a default set of render states with a custom shader
#
# * *shader* - Shader to use
- def initialize(shader : Shader)
+ def initialize(shader : Shader?)
@blend_mode = uninitialized BlendMode
@transform = uninitialized Transform
@texture = uninitialized Void*
@@ -756,7 +756,7 @@ module SF
# * *transform* - Transform to use
# * *texture* - Texture to use
# * *shader* - Shader to use
- def initialize(blend_mode : BlendMode, transform : Transform, texture : Texture?, shader : Shader)
+ def initialize(blend_mode : BlendMode, transform : Transform, texture : Texture?, shader : Shader?)
@blend_mode = uninitialized BlendMode
@transform = uninitialized Transform
@texture = uninitialized Void*
@@ -796,7 +796,7 @@ module SF
def shader : Shader?
@_renderstates_shader
end
- def shader=(shader : Shader)
+ def shader=(shader : Shader?)
@_renderstates_shader = shader
@shader = shader ? shader.to_unsafe : Pointer(Void).null
end