diff --git a/frontends/libretro/src/lib.rs b/frontends/libretro/src/lib.rs
index 6a4229d5a6a1658736e92820d4f80839c088043c..5f7d582832906815c172fd439c31ab9add8c0284 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();
         }