Replace memcpy by SDL_MixAudio to be able to set the audio volume

Hello,

I would like to be able to set the audio volume in the Netgens [1] software (a Genesis emulator).
So, I use the SDL_MixAudio function.
I just have to replace the memcpy function by the SDL_MixAudio function:
$ svn diff src/gens/sdllayer/g_sdlsound.c
Index: src/gens/sdllayer/g_sdlsound.c===================================================================
— src/gens/sdllayer/g_sdlsound.c (revision 9)
+++ src/gens/sdllayer/g_sdlsound.c (working copy)
@@ -12,6 +12,7 @@
#include “pcm.h”
#include “misc.h” // for Have_MMX flag
#include “support.h”
+#include “audio.h” /* for Audio_Volume */

int Seg_To_Buffer = 8; // for frame skip
int Seg_L[882], Seg_R[882];
@@ -38,13 +39,16 @@
{
if (audio_len < (int) len)
{

  •  memcpy (buffer, user, audio_len);
    
  •  /*memcpy (buffer, user, audio_len);*/
    
  •  SDL_MixAudio(buffer, user, audio_len, Audio_Volume);
     audio_len = 0;
     return;
    
    }
  • memcpy (buffer, user, len);
  • /memcpy (buffer, user, len);/
  • SDL_MixAudio(buffer, user, len, Audio_Volume);
    audio_len -= len;
  • memcpy (user, (unsigned char *) user + len, audio_len);
  • /*memcpy (user, (unsigned char ) user + len, audio_len);/
  • SDL_MixAudio(user, (unsigned char *) user + len, audio_len, Audio_Volume);

}

But when I do that, the audio I can heard is not correct.
I read [2] which seems to be a similar problem.
The solution is to initialize correctly the audio buffer using the memset function.
But in my case, the buffer seems to be already correctly initialized because the memset function is already used somewhere in this file.
Anyway, if I use the memset function before the calls to SDL_MixAudio, then I heard nothing :
$ svn diff src/gens/sdllayer/g_sdlsound.c
Index: src/gens/sdllayer/g_sdlsound.c

— src/gens/sdllayer/g_sdlsound.c (revision 9)
+++ src/gens/sdllayer/g_sdlsound.c (working copy)
@@ -12,6 +12,7 @@
#include “pcm.h”
#include “misc.h” // for Have_MMX flag
#include “support.h”
+#include “audio.h” /* for Audio_Volume */

int Seg_To_Buffer = 8; // for frame skip
int Seg_L[882], Seg_R[882];
@@ -38,13 +39,19 @@
{
if (audio_len < (int) len)
{

  •  memcpy (buffer, user, audio_len);
    
  •  /*memcpy (buffer, user, audio_len);*/
    
  •  memset(buffer, 0, audio_len);
    
  •  SDL_MixAudio(buffer, user, audio_len, Audio_Volume);
     audio_len = 0;
     return;
    
    }
  • memcpy (buffer, user, len);
  • /memcpy (buffer, user, len);/
  • memset(buffer, 0, len);
  • SDL_MixAudio(buffer, user, len, Audio_Volume);
    audio_len -= len;
  • memcpy (user, (unsigned char *) user + len, audio_len);
  • /*memcpy (user, (unsigned char ) user + len, audio_len);/
  • memset(user, 0, audio_len);
  • SDL_MixAudio(user, (unsigned char *) user + len, audio_len, Audio_Volume);

}

So have you any idea how can I replace memcpy by SDL_MixAudio in this code to be able to set the audio volume ? (and keep a correct audio)

Thank you.
Regards.

[1] http://sourceforge.net/projects/netgens/
[2] http://forums.libsdl.org/viewtopic.php?t=7647&sid=ea2f74f631b63f9d24c0b7fa9f45db36