mirror of
https://github.com/joncampbell123/dosbox-x.git
synced 2025-05-08 19:32:39 +08:00
SDL2: Use the newer sound API and make some requests to improve audio rendition
This commit is contained in:
parent
706fd0ecd1
commit
75aa320879
@ -20,6 +20,16 @@
|
|||||||
#ifndef DOSBOX_MIXER_H
|
#ifndef DOSBOX_MIXER_H
|
||||||
#define DOSBOX_MIXER_H
|
#define DOSBOX_MIXER_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
#ifdef C_SDL2
|
||||||
|
#define SDL_LockAudio __DO_NOT_USE__1
|
||||||
|
#define SDL_UnlockAudio __DO_NOT_USE__2
|
||||||
|
#define SDL_PauseAudio __DO_NOT_USE__3
|
||||||
|
#define SDL_CloseAudio __DO_NOT_USE__4
|
||||||
|
#define SDL_OpenAudio __DO_NOT_USE__5
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
typedef void (*MIXER_MixHandler)(uint8_t * sampdate,uint32_t len);
|
typedef void (*MIXER_MixHandler)(uint8_t * sampdate,uint32_t len);
|
||||||
typedef void (*MIXER_Handler)(Bitu len);
|
typedef void (*MIXER_Handler)(Bitu len);
|
||||||
|
|
||||||
|
@ -64,6 +64,10 @@
|
|||||||
#define MIXER_SSIZE 4
|
#define MIXER_SSIZE 4
|
||||||
#define MIXER_VOLSHIFT 13
|
#define MIXER_VOLSHIFT 13
|
||||||
|
|
||||||
|
#ifdef C_SDL2
|
||||||
|
SDL_AudioDeviceID SDL2_AudioDevice = 0; /* valid IDs are 2 or higher, 1 for compat, 0 is never a valid ID */
|
||||||
|
#endif
|
||||||
|
|
||||||
static INLINE int16_t MIXER_CLIP(Bits SAMP) {
|
static INLINE int16_t MIXER_CLIP(Bits SAMP) {
|
||||||
if (SAMP < MAX_AUDIO) {
|
if (SAMP < MAX_AUDIO) {
|
||||||
if (SAMP > MIN_AUDIO)
|
if (SAMP > MIN_AUDIO)
|
||||||
@ -837,11 +841,19 @@ static void MIXER_MixData(Bitu fracs/*render up to*/) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void MIXER_FillUp(void) {
|
static void MIXER_FillUp(void) {
|
||||||
|
#ifdef C_SDL2
|
||||||
|
SDL_LockAudioDevice(SDL2_AudioDevice);
|
||||||
|
#else
|
||||||
SDL_LockAudio();
|
SDL_LockAudio();
|
||||||
|
#endif
|
||||||
float index = PIC_TickIndex();
|
float index = PIC_TickIndex();
|
||||||
if (index < 0) index = 0;
|
if (index < 0) index = 0;
|
||||||
MIXER_MixData((Bitu)((double)index * ((Bitu)mixer.samples_this_ms.w * mixer.samples_this_ms.fd)));
|
MIXER_MixData((Bitu)((double)index * ((Bitu)mixer.samples_this_ms.w * mixer.samples_this_ms.fd)));
|
||||||
|
#ifdef C_SDL2
|
||||||
|
SDL_UnlockAudioDevice(SDL2_AudioDevice);
|
||||||
|
#else
|
||||||
SDL_UnlockAudio();
|
SDL_UnlockAudio();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void MixerChannel::FillUp(void) {
|
void MixerChannel::FillUp(void) {
|
||||||
@ -856,7 +868,11 @@ void MIXER_MixSingle(Bitu /*val*/) {
|
|||||||
static void MIXER_Mix(void) {
|
static void MIXER_Mix(void) {
|
||||||
Bitu thr;
|
Bitu thr;
|
||||||
|
|
||||||
|
#ifdef C_SDL2
|
||||||
|
SDL_LockAudioDevice(SDL2_AudioDevice);
|
||||||
|
#else
|
||||||
SDL_LockAudio();
|
SDL_LockAudio();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* render */
|
/* render */
|
||||||
assert((mixer.work_in+mixer.samples_per_ms.w) <= MIXER_BUFSIZE);
|
assert((mixer.work_in+mixer.samples_per_ms.w) <= MIXER_BUFSIZE);
|
||||||
@ -884,7 +900,11 @@ static void MIXER_Mix(void) {
|
|||||||
memset(&mixer.work[mixer.work_in][0],0,sizeof(int32_t)*2*mixer.samples_this_ms.w);
|
memset(&mixer.work[mixer.work_in][0],0,sizeof(int32_t)*2*mixer.samples_this_ms.w);
|
||||||
mixer.samples_rendered_ms.fn = 0;
|
mixer.samples_rendered_ms.fn = 0;
|
||||||
mixer.samples_rendered_ms.w = 0;
|
mixer.samples_rendered_ms.w = 0;
|
||||||
|
#ifdef C_SDL2
|
||||||
|
SDL_UnlockAudioDevice(SDL2_AudioDevice);
|
||||||
|
#else
|
||||||
SDL_UnlockAudio();
|
SDL_UnlockAudio();
|
||||||
|
#endif
|
||||||
MIXER_FillUp();
|
MIXER_FillUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1208,10 +1228,21 @@ void MIXER_Init() {
|
|||||||
spec.userdata=NULL;
|
spec.userdata=NULL;
|
||||||
spec.samples=(Uint16)mixer.blocksize;
|
spec.samples=(Uint16)mixer.blocksize;
|
||||||
|
|
||||||
|
#ifdef C_SDL2
|
||||||
|
if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) {
|
||||||
|
LOG(LOG_MISC,LOG_DEBUG)("MIXER:Can't initialize SDL audio: %s , running in nosound mode.",SDL_GetError());
|
||||||
|
mixer.nosound = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (mixer.nosound) {
|
if (mixer.nosound) {
|
||||||
LOG(LOG_MISC,LOG_DEBUG)("MIXER:No Sound Mode Selected.");
|
LOG(LOG_MISC,LOG_DEBUG)("MIXER:No Sound Mode Selected.");
|
||||||
TIMER_AddTickHandler(MIXER_Mix);
|
TIMER_AddTickHandler(MIXER_Mix);
|
||||||
|
#ifdef C_SDL2
|
||||||
|
} else if ((SDL2_AudioDevice=SDL_OpenAudioDevice(NULL, 0, &spec, &obtained, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_SAMPLES_CHANGE)) == 0) {
|
||||||
|
#else
|
||||||
} else if (SDL_OpenAudio(&spec, &obtained) <0 ) {
|
} else if (SDL_OpenAudio(&spec, &obtained) <0 ) {
|
||||||
|
#endif
|
||||||
mixer.nosound = true;
|
mixer.nosound = true;
|
||||||
LOG(LOG_MISC,LOG_DEBUG)("MIXER:Can't open audio: %s , running in nosound mode.",SDL_GetError());
|
LOG(LOG_MISC,LOG_DEBUG)("MIXER:Can't open audio: %s , running in nosound mode.",SDL_GetError());
|
||||||
TIMER_AddTickHandler(MIXER_Mix);
|
TIMER_AddTickHandler(MIXER_Mix);
|
||||||
@ -1219,7 +1250,12 @@ void MIXER_Init() {
|
|||||||
mixer.nosound = true;
|
mixer.nosound = true;
|
||||||
LOG(LOG_MISC,LOG_DEBUG)("MIXER:Failed to get the sample format I wanted.");
|
LOG(LOG_MISC,LOG_DEBUG)("MIXER:Failed to get the sample format I wanted.");
|
||||||
TIMER_AddTickHandler(MIXER_Mix);
|
TIMER_AddTickHandler(MIXER_Mix);
|
||||||
|
#ifdef C_SDL2
|
||||||
|
SDL_CloseAudioDevice(SDL2_AudioDevice);
|
||||||
|
SDL2_AudioDevice = 0;
|
||||||
|
#else
|
||||||
SDL_CloseAudio();
|
SDL_CloseAudio();
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if(((Bitu)mixer.freq != (Bitu)obtained.freq) || ((Bitu)mixer.blocksize != (Bitu)obtained.samples))
|
if(((Bitu)mixer.freq != (Bitu)obtained.freq) || ((Bitu)mixer.blocksize != (Bitu)obtained.samples))
|
||||||
LOG(LOG_MISC,LOG_DEBUG)("MIXER:Got different values from SDL: freq %d, blocksize %d",(int)obtained.freq,(int)obtained.samples);
|
LOG(LOG_MISC,LOG_DEBUG)("MIXER:Got different values from SDL: freq %d, blocksize %d",(int)obtained.freq,(int)obtained.samples);
|
||||||
@ -1228,7 +1264,11 @@ void MIXER_Init() {
|
|||||||
mixer.blocksize=obtained.samples;
|
mixer.blocksize=obtained.samples;
|
||||||
TIMER_AddTickHandler(MIXER_Mix);
|
TIMER_AddTickHandler(MIXER_Mix);
|
||||||
if (mixer.sampleaccurate) PIC_AddEvent(MIXER_MixSingle,1000.0 / mixer.freq);
|
if (mixer.sampleaccurate) PIC_AddEvent(MIXER_MixSingle,1000.0 / mixer.freq);
|
||||||
|
#ifdef C_SDL2
|
||||||
|
SDL_PauseAudioDevice(SDL2_AudioDevice, 0);
|
||||||
|
#else
|
||||||
SDL_PauseAudio(0);
|
SDL_PauseAudio(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
mixer_start_pic_time = PIC_FullIndex();
|
mixer_start_pic_time = PIC_FullIndex();
|
||||||
mixer_sample_counter = 0;
|
mixer_sample_counter = 0;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "mapper.h"
|
#include "mapper.h"
|
||||||
#include "control.h"
|
#include "control.h"
|
||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
|
#include "mixer.h"
|
||||||
#include "build_timestamp.h"
|
#include "build_timestamp.h"
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include "direct.h"
|
#include "direct.h"
|
||||||
@ -36,6 +37,10 @@
|
|||||||
#include "../libs/tinyfiledialogs/tinyfiledialogs.h"
|
#include "../libs/tinyfiledialogs/tinyfiledialogs.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef C_SDL2
|
||||||
|
extern SDL_AudioDeviceID SDL2_AudioDevice; /* valid IDs are 2 or higher, 1 for compat, 0 is never a valid ID */
|
||||||
|
#endif
|
||||||
|
|
||||||
extern unsigned int page;
|
extern unsigned int page;
|
||||||
extern int autosave_last[10], autosave_count;
|
extern int autosave_last[10], autosave_count;
|
||||||
extern std::string autosave_name[10], savefilename;
|
extern std::string autosave_name[10], savefilename;
|
||||||
@ -1056,7 +1061,11 @@ int flagged_restore(char* zip);
|
|||||||
|
|
||||||
void SaveState::save(size_t slot) { //throw (Error)
|
void SaveState::save(size_t slot) { //throw (Error)
|
||||||
if (slot >= SLOT_COUNT*MAX_PAGE) return;
|
if (slot >= SLOT_COUNT*MAX_PAGE) return;
|
||||||
SDL_PauseAudio(0);
|
#ifdef C_SDL2
|
||||||
|
SDL_PauseAudioDevice(SDL2_AudioDevice, 0);
|
||||||
|
#else
|
||||||
|
SDL_PauseAudio(0);
|
||||||
|
#endif
|
||||||
bool save_err=false;
|
bool save_err=false;
|
||||||
if((MEM_TotalPages()*4096/1024/1024)>1024) {
|
if((MEM_TotalPages()*4096/1024/1024)>1024) {
|
||||||
LOG_MSG("Stopped. 1 GB is the maximum memory size for saving/loading states.");
|
LOG_MSG("Stopped. 1 GB is the maximum memory size for saving/loading states.");
|
||||||
@ -1278,7 +1287,11 @@ void SaveState::load(size_t slot) const { //throw (Error)
|
|||||||
notifyError("Unsupported memory size for loading states.", false);
|
notifyError("Unsupported memory size for loading states.", false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SDL_PauseAudio(0);
|
#ifdef C_SDL2
|
||||||
|
SDL_PauseAudioDevice(SDL2_AudioDevice, 0);
|
||||||
|
#else
|
||||||
|
SDL_PauseAudio(0);
|
||||||
|
#endif
|
||||||
extern const char* RunningProgram;
|
extern const char* RunningProgram;
|
||||||
bool read_version=false;
|
bool read_version=false;
|
||||||
bool read_title=false;
|
bool read_title=false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user