RobLoach / node-raylib

Node.js bindings for Raylib
https://robloach.github.io/node-raylib/
Other
237 stars 20 forks source link

MusicStream #94

Closed konsumer closed 2 years ago

konsumer commented 2 years ago

I wrote a simple demo in raylib, in C, that loads a mod music file, and I am trying to create the same thing in node:

const r = require('raylib')

r.InitWindow(320, 240, 'music demo')
r.SetTargetFPS(60)

const music = r.LoadMusicStream('assets/the_golden_ages.mod')
r.PlayMusicStream(music)

while (!r.WindowShouldClose()) {
  r.UpdateMusicStream(music)

  r.BeginDrawing()
  r.ClearBackground(r.BLACK)
  r.DrawText('HELLO!', 10, 10, 20, r.LIGHTGRAY)
  r.EndDrawing()
}

r.UnloadMusicStream(music)
r.CloseWindow()

It appears like it's working, and prints "Hello!" on screen, but I don't hear any sound.

It outputs this:

INFO: Initializing raylib 3.5
INFO: DISPLAY: Device initialized successfully
INFO:     > Display size: 3840 x 2160
INFO:     > Render size:  320 x 240
INFO:     > Screen size:  320 x 240
INFO:     > Viewport offsets: 0, 0
INFO: GLAD: OpenGL extensions loaded successfully
INFO: GL: OpenGL 3.3 Core profile supported
INFO: GL: OpenGL device information:
INFO:     > Vendor:   AMD
INFO:     > Renderer: AMD Radeon VII (VEGA20, DRM 3.41.0, 5.13.19-xanmod1, LLVM 11.0.0)
INFO:     > Version:  4.6 (Core Profile) Mesa 21.0.1
INFO:     > GLSL:     4.60
INFO: GL: Supported extensions count: 229
INFO: GL: DXT compressed textures supported
INFO: GL: ETC2/EAC compressed textures supported
INFO: GL: Anisotropic textures filtering supported (max: 16X)
INFO: GL: Mirror clamp wrap texture mode supported
INFO: TEXTURE: [ID 1] Texture created successfully (1x1 - 1 mipmaps)
INFO: TEXTURE: [ID 1] Default texture loaded successfully
INFO: SHADER: [ID 1] Compiled successfully
INFO: SHADER: [ID 2] Compiled successfully
INFO: SHADER: [ID 3] Program loaded successfully
INFO: SHADER: [ID 3] Default shader loaded successfully
INFO: RLGL: Internal vertex buffers initialized successfully in RAM (CPU)
INFO: RLGL: Render batch vertex buffers loaded successfully
INFO: RLGL: Default state initialized successfully
INFO: TEXTURE: [ID 2] Texture created successfully (128x128 - 1 mipmaps)
INFO: FONT: Default font loaded successfully
INFO: TIMER: Target time per frame: 16.667 milliseconds
INFO: STREAM: Initialized successfully (48000 Hz, 16 bit, Stereo)
INFO: FILEIO: [assets/the_golden_ages.mod] Music file successfully loaded:
INFO:     > Total samples: 46418558
INFO:     > Sample rate:   48000 Hz
INFO:     > Sample size:   16 bits
INFO:     > Channels:      2 (Stereo)

In C I needed this:

#define SUPPORT_FILEFORMAT_MOD

How do I add this to node-raylib?

konsumer commented 2 years ago

Ah, silly me, I forgot I needed InitAudioDevice() in C, too. I added it and it works great:

const r = require('raylib')

r.InitWindow(320, 240, 'music demo')
r.SetTargetFPS(60)
r.InitAudioDevice()

const music = r.LoadMusicStream('assets/the_golden_ages.mod')
r.PlayMusicStream(music)

while (!r.WindowShouldClose()) {
  r.UpdateMusicStream(music)

  r.BeginDrawing()
  r.ClearBackground(r.BLACK)
  r.DrawText('HELLO!', 10, 10, 20, r.LIGHTGRAY)
  r.EndDrawing()
}

r.UnloadMusicStream(music)
r.CloseWindow()

Sorry for the queue-noise.

RobLoach commented 2 years ago

We could add a check in the constructor to ensure it's initialized.

konsumer commented 2 years ago

Nah, not necessary at all. I like that it works the same, personally, just an error on my part.

konsumer commented 2 years ago

Sidenote: I love what you did with this. It works really well, and mirrors the C interface really closely (so far) so it's fairly easy to figure out how to make stuff work.