From ee1e04f60ce8c9f9dc5a8dab05c029f2021203d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Thu, 3 Aug 2023 12:19:16 +0100
Subject: [PATCH] feat: new global buffer usage

---
 frontends/libretro/src/lib.rs | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/frontends/libretro/src/lib.rs b/frontends/libretro/src/lib.rs
index 6a4229d5..5f7d5828 100644
--- a/frontends/libretro/src/lib.rs
+++ b/frontends/libretro/src/lib.rs
@@ -153,6 +153,10 @@ pub extern "C" fn retro_init() {
     unsafe {
         EMULATOR = Some(GameBoy::new(None));
         KEY_STATES = Some(HashMap::new());
+        AUDIO_BUFFER = Some(vec![
+            0x00;
+            EMULATOR.as_ref().unwrap().apu_i().audio_buffer_max()
+        ]);
     }
 }
 
@@ -219,6 +223,7 @@ pub extern "C" fn retro_run() {
     let input_poll_cb = unsafe { INPUT_POLL_CALLBACK.as_ref().unwrap() };
     let input_state_cb = unsafe { INPUT_STATE_CALLBACK.as_ref().unwrap() };
     let key_states = unsafe { KEY_STATES.as_mut().unwrap() };
+    let audio_buffer_ref = unsafe { AUDIO_BUFFER.as_mut().unwrap() };
     let channels = emulator.audio_channels();
 
     let mut last_frame = emulator.ppu_frame();
@@ -272,14 +277,11 @@ pub extern "C" fn retro_run() {
                 .map(|v| *v as i16 * 256)
                 .collect::<Vec<i16>>();
 
-            unsafe {
-                AUDIO_BUFFER = Some(audio_buffer.to_vec());
-                let audio_buffer_ref = AUDIO_BUFFER.as_ref().unwrap();
-                sample_batch_cb(
-                    audio_buffer_ref.as_ptr(),
-                    audio_buffer_ref.len() / channels as usize,
-                );
-            }
+            audio_buffer_ref[0..audio_buffer.len()].copy_from_slice(&audio_buffer);
+            sample_batch_cb(
+                audio_buffer_ref.as_ptr(),
+                audio_buffer.len() / channels as usize,
+            );
 
             emulator.clear_audio_buffer();
         }
-- 
GitLab