From afd7c1a63600f6eb5a203d38fb39427a990d9032 Mon Sep 17 00:00:00 2001 From: "Azamat H. Hackimov" Date: Sun, 5 May 2024 18:36:16 +0300 Subject: [PATCH] MVE: Initial sound support Sound supported by SDL backend. --- libmve/SystemInterfaces.h | 4 ++-- libmve/lnxdsound.cpp | 47 +++++++++++++++------------------------ libmve/mveplay.cpp | 47 +++++++++++++++++++-------------------- movie/d3movie.cpp | 3 ++- 4 files changed, 45 insertions(+), 56 deletions(-) diff --git a/libmve/SystemInterfaces.h b/libmve/SystemInterfaces.h index c907eb12..41b01de4 100644 --- a/libmve/SystemInterfaces.h +++ b/libmve/SystemInterfaces.h @@ -23,8 +23,8 @@ // Max&Min values for settings #define LNXSND_VOLUME_MAX 0 -#define LNXSND_VOLUME_MIN -10000 -#define LNXSND_PAN_LEFT -10000 +#define LNXSND_VOLUME_MIN (-10000) +#define LNXSND_PAN_LEFT (-10000) #define LNXSND_PAN_RIGHT 10000 // Status/Buffer flags diff --git a/libmve/lnxdsound.cpp b/libmve/lnxdsound.cpp index 64dbed72..f820926d 100644 --- a/libmve/lnxdsound.cpp +++ b/libmve/lnxdsound.cpp @@ -16,26 +16,17 @@ * along with this program. If not, see . */ -#include -#include -#include +#include #ifdef __LINUX__ -#include -#include -#include -#include +#include +#include +#include #endif -#include -#include -#include -#include -#include -#include "lnxdsound.h" + +#include + #include "args.h" - -#include "SDL.h" -#include "SDL_audio.h" - +#include "lnxdsound.h" #define FRAGMENT_LENGTH (LnxBuffers[0]->bps >> 4) #define FREQUENCY_SHIFT (14) @@ -56,9 +47,9 @@ static uint32_t LinuxSoundMixInMainBuffer(LnxSoundBuffer *dsb, int len); static void LinuxSoundMixBuffersIntoMain(int len); static void LinuxSoundThreadHandler(void *unused, Uint8 *stream, int len); -static inline void enter_critical(void) { SDL_LockAudio(); } +static inline void enter_critical() { SDL_LockAudio(); } -static inline void exit_critical(void) { SDL_UnlockAudio(); } +static inline void exit_critical() { SDL_UnlockAudio(); } /////////////////////////////// // LnxSound_CreateSoundBuffer @@ -113,7 +104,7 @@ int LnxSound_CreateSoundBuffer(LnxSoundDevice *dev, LnxBufferDesc *lbdesc, LnxSo (*lsndb)->buffer_len = dev->bps; (*lsndb)->freq = dev->freq; (*lsndb)->bps = dev->bps; - (*lsndb)->buffer = NULL; + (*lsndb)->buffer = nullptr; } else { (*lsndb)->buffer_len = lbdesc->dwBufferBytes; (*lsndb)->freq = lbdesc->lpwfxFormat->nSamplesPerSec; @@ -121,7 +112,7 @@ int LnxSound_CreateSoundBuffer(LnxSoundDevice *dev, LnxBufferDesc *lbdesc, LnxSo (*lsndb)->buffer = (uint8_t *)malloc((*lsndb)->buffer_len); if (!(*lsndb)->buffer) { free(*lsndb); - *lsndb = NULL; + *lsndb = nullptr; return -2; } memset((*lsndb)->buffer, 0, (*lsndb)->buffer_len); @@ -197,7 +188,7 @@ int LnxSoundBuffer_Release(LnxSoundBuffer *buff) { ShutdownSoundSystem(); LnxNumBuffers = 0; - LnxBuffers = NULL; + LnxBuffers = nullptr; } else { // wait until it is ok (our thread is in a good position) enter_critical(); @@ -450,7 +441,7 @@ int LnxSoundBuffer_Lock(LnxSoundBuffer *buff, uint32_t pos, uint32_t numbytes, v *(uint8_t **)ptr1 = buff->buffer + pos; *numbytes1 = numbytes; if (ptr2) - *(uint8_t **)ptr2 = NULL; + *(uint8_t **)ptr2 = nullptr; if (numbytes2) *numbytes2 = 0; } else { @@ -513,7 +504,7 @@ static bool StartupSoundSystem(LnxSoundDevice *dev) { spec.samples = sampleCount; spec.callback = LinuxSoundThreadHandler; - if (SDL_OpenAudio(&spec, NULL) < 0) { + if (SDL_OpenAudio(&spec, nullptr) < 0) { return false; } SDL_PauseAudio(0); @@ -521,7 +512,7 @@ static bool StartupSoundSystem(LnxSoundDevice *dev) { } // Shutsdown the sound processing thread -static void ShutdownSoundSystem(void) { SDL_CloseAudio(); } +static void ShutdownSoundSystem() { SDL_CloseAudio(); } static inline void GetValues(const LnxSoundBuffer *dsb, uint8_t *buf, uint32_t *fl, uint32_t *fr) { int16_t *bufs = (int16_t *)buf; @@ -553,7 +544,6 @@ static inline void GetValues(const LnxSoundBuffer *dsb, uint8_t *buf, uint32_t * *fr = *bufs; return; } - return; } static inline void SetValues(uint8_t *buf, uint32_t fl, uint32_t fr) { @@ -584,7 +574,6 @@ static inline void SetValues(uint8_t *buf, uint32_t fl, uint32_t fr) { *bufs = (fl + fr) >> 1; return; } - return; } static void LinuxSoundMixWithVolume(LnxSoundBuffer *dsb, uint8_t *buf, uint32_t len) { @@ -676,7 +665,7 @@ int DoMulDiv(int nNumber, int nNumerator, int nDenominator) { return ret; } -static void *TempSoundBuffer = NULL; +static void *TempSoundBuffer = nullptr; static int TempSoundBufferLen = 0; static uint32_t LinuxSoundMixInMainBuffer(LnxSoundBuffer *dsb, int len) { uint32_t i, ilen, advance = (LnxBuffers[0]->wfx.wBitsPerSample >> 3); @@ -786,5 +775,5 @@ static void LinuxSoundThreadHandler(void *unused, Uint8 *stream, int len) { LinuxSoundMixBuffersIntoMain(len); - LnxBuffers[0]->buffer = NULL; + LnxBuffers[0]->buffer = nullptr; } diff --git a/libmve/mveplay.cpp b/libmve/mveplay.cpp index c28aef6d..33f7226c 100644 --- a/libmve/mveplay.cpp +++ b/libmve/mveplay.cpp @@ -16,7 +16,7 @@ */ // TODO -//#define AUDIO +#define AUDIO #include #ifdef _WIN32 @@ -28,7 +28,6 @@ #if defined(AUDIO) #include -#include "SDL_mixer.h" #endif #include "decoders.h" @@ -63,7 +62,7 @@ int g_spdFactorNum = 0; static int g_spdFactorDenom = 10; static int g_frameUpdated = 0; -static ISoundDevice *snd_ds = NULL; +static ISoundDevice *snd_ds = nullptr; static short get_short(unsigned char *data) { short value; @@ -130,7 +129,7 @@ unsigned long int timer_getmicroseconds() { struct timeval tv; static time_t starttime = 0; - gettimeofday(&tv, NULL); + gettimeofday(&tv, nullptr); if (!starttime) starttime = tv.tv_sec; @@ -149,7 +148,7 @@ void timer_sleepmicroseconds(unsigned long int usec) { struct timespec ts; ts.tv_sec = usec / 1000000; ts.tv_nsec = usec % 1000000 * 1000; - nanosleep(&ts, NULL); + nanosleep(&ts, nullptr); #endif } @@ -177,18 +176,18 @@ static int create_timer_handler(unsigned char major, unsigned char minor, unsign return 1; } -static void timer_stop(void) { +static void timer_stop() { timer_expire = 0; timer_started = 0; } -static void timer_start(void) { +static void timer_start() { timer_expire = timer_getmicroseconds(); timer_expire += micro_frame_delay; timer_started = 1; } -static void do_timer_wait(void) { +static void do_timer_wait() { unsigned long int ts; unsigned long int tv; @@ -211,12 +210,10 @@ end: * audio handlers *************************/ -static int mve_audio_enabled = 0; #ifdef AUDIO #define TOTAL_AUDIO_BUFFERS 64 static int audiobuf_created = 0; -static void mve_audio_callback(void *userdata, unsigned char *stream, int len); static short *mve_audio_buffers[TOTAL_AUDIO_BUFFERS]; static int mve_audio_buflens[TOTAL_AUDIO_BUFFERS]; static int mve_audio_curbuf_curpos = 0; @@ -295,7 +292,6 @@ static int create_audiobuf_handler(unsigned char major, unsigned char minor, uns int stereo; int bitsize; - int compressed; int format; @@ -314,16 +310,13 @@ static int create_audiobuf_handler(unsigned char major, unsigned char minor, uns stereo = (flags & MVE_AUDIO_FLAGS_STEREO) ? 1 : 0; bitsize = (flags & MVE_AUDIO_FLAGS_16BIT) ? 1 : 0; - if (minor > 0) { - compressed = flags & MVE_AUDIO_FLAGS_COMPRESSED ? 1 : 0; - } else { - compressed = 0; + mve_audio_compressed = 0; + if (minor > 0 && (flags & MVE_AUDIO_FLAGS_COMPRESSED)) { + mve_audio_compressed = 1; } - mve_audio_compressed = compressed; - if (bitsize == 1) { -#ifdef WORDS_BIGENDIAN +#ifdef OUTRAGE_BIG_ENDIAN format = AUDIO_S16MSB; #else format = AUDIO_S16LSB; @@ -334,17 +327,23 @@ static int create_audiobuf_handler(unsigned char major, unsigned char minor, uns fprintf(stderr, "creating audio buffers:\n"); fprintf(stderr, "sample rate = %d, stereo = %d, bitsize = %d, compressed = %d\n", sample_rate, stereo, - bitsize ? 16 : 8, compressed); + bitsize ? 16 : 8, mve_audio_compressed); - if (Mix_OpenAudio(sample_rate, format, stereo ? 2 : 1, 4096) == 0) { + SDL_AudioSpec spec { + .freq = sample_rate, + .format = (unsigned short)format, + .channels = (unsigned char)(stereo ? 2 : 1), + .size = (unsigned int)desired_buffer, + .callback = mve_audio_callback, + }; + if (SDL_OpenAudio(&spec, nullptr) == 0) { fprintf(stderr, " success\n"); mve_audio_canplay = 1; } else { - fprintf(stderr, " failure : %s\n", Mix_GetError()); + fprintf(stderr, " failure : %s\n", SDL_GetError()); mve_audio_canplay = 0; } - Mix_SetPostMix(mve_audio_callback, NULL); mve_audio_canplay = 1; memset(mve_audio_buffers, 0, sizeof(mve_audio_buffers)); @@ -357,7 +356,7 @@ static int create_audiobuf_handler(unsigned char major, unsigned char minor, uns static int play_audio_handler(unsigned char major, unsigned char minor, unsigned char *data, int len, void *context) { #ifdef AUDIO if (mve_audio_canplay && !mve_audio_playing && mve_audio_bufhead != mve_audio_buftail) { - Mix_Resume(-1); + SDL_PauseAudio(0); mve_audio_playing = 1; } #endif @@ -650,7 +649,7 @@ void MVE_rmEndMovie(MVESTREAM *mve) { #ifdef AUDIO if (mve_audio_canplay) { // only close audio if we opened it - Mix_CloseAudio(); + SDL_CloseAudio(); mve_audio_canplay = 0; } for (int i = 0; i < TOTAL_AUDIO_BUFFERS; i++) diff --git a/movie/d3movie.cpp b/movie/d3movie.cpp index 7e80a076..e8c2afc2 100644 --- a/movie/d3movie.cpp +++ b/movie/d3movie.cpp @@ -222,7 +222,7 @@ public: ISysSoundBuffer *p = (ISysSoundBuffer *)new MovieSoundBuffer(sb); *lsndb = p; } else { - lsndb = NULL; + lsndb = nullptr; } return ret; } @@ -692,6 +692,7 @@ bool mve_InitSound(oeApplication *app, MovieSoundDevice &device) { device.SetDirectSound(snddev); MVE_sndInit(&device); + MVE_sndInit(1); return true; }