oprypin / crsfml

Crystal bindings to SFML multimedia/game library

Home Page:https://oprypin.github.io/crsfml

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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