mirror of https://github.com/mgba-emu/mgba.git
Merge branch 'master' into qt
This commit is contained in:
commit
c12b8e6e6d
|
@ -75,7 +75,7 @@ elseif(BUILD_PGO AND PGO_STAGE_2)
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${PGO_POST_FLAGS}")
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${PGO_POST_FLAGS}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_definitions(-DBINARY_NAME="${BINARY_NAME}" -DPROJECT_NAME="${PROJECT_NAME}")
|
add_definitions(-DBINARY_NAME="${BINARY_NAME}" -DPROJECT_NAME="${PROJECT_NAME}" -DPROJECT_VERSION="${LIB_VERSION_STRING}")
|
||||||
|
|
||||||
# Feature dependencies
|
# Feature dependencies
|
||||||
find_feature(USE_CLI_DEBUGGER "libedit")
|
find_feature(USE_CLI_DEBUGGER "libedit")
|
||||||
|
|
|
@ -40,6 +40,8 @@ void GBAAudioReset(struct GBAAudio* audio) {
|
||||||
audio->ch4 = (struct GBAAudioChannel4) { .envelope = { .nextStep = INT_MAX } };
|
audio->ch4 = (struct GBAAudioChannel4) { .envelope = { .nextStep = INT_MAX } };
|
||||||
audio->chA.dmaSource = 0;
|
audio->chA.dmaSource = 0;
|
||||||
audio->chB.dmaSource = 0;
|
audio->chB.dmaSource = 0;
|
||||||
|
audio->chA.sample = 0;
|
||||||
|
audio->chB.sample = 0;
|
||||||
audio->eventDiff = 0;
|
audio->eventDiff = 0;
|
||||||
audio->nextSample = 0;
|
audio->nextSample = 0;
|
||||||
audio->sampleRate = 0x8000;
|
audio->sampleRate = 0x8000;
|
||||||
|
@ -672,13 +674,13 @@ static int32_t _updateChannel4(struct GBAAudioChannel4* ch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _applyBias(struct GBAAudio* audio, int sample) {
|
static int _applyBias(struct GBAAudio* audio, int sample) {
|
||||||
sample += audio->bias;
|
sample += GBARegisterSOUNDBIASGetBias(audio->soundbias);
|
||||||
if (sample >= 0x400) {
|
if (sample >= 0x400) {
|
||||||
sample = 0x3FF;
|
sample = 0x3FF;
|
||||||
} else if (sample < 0) {
|
} else if (sample < 0) {
|
||||||
sample = 0;
|
sample = 0;
|
||||||
}
|
}
|
||||||
return (sample - audio->bias) << 6;
|
return (sample - GBARegisterSOUNDBIASGetBias(audio->soundbias)) << 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _sample(struct GBAAudio* audio) {
|
static void _sample(struct GBAAudio* audio) {
|
||||||
|
|
|
@ -157,6 +157,10 @@ DECL_BIT(GBARegisterSOUNDCNT_X, PlayingCh3, 2);
|
||||||
DECL_BIT(GBARegisterSOUNDCNT_X, PlayingCh4, 3);
|
DECL_BIT(GBARegisterSOUNDCNT_X, PlayingCh4, 3);
|
||||||
DECL_BIT(GBARegisterSOUNDCNT_X, Enable, 7);
|
DECL_BIT(GBARegisterSOUNDCNT_X, Enable, 7);
|
||||||
|
|
||||||
|
DECL_BITFIELD(GBARegisterSOUNDBIAS, uint16_t);
|
||||||
|
DECL_BITS(GBARegisterSOUNDBIAS, Bias, 0, 10);
|
||||||
|
DECL_BITS(GBARegisterSOUNDBIAS, Resolution, 14, 2);
|
||||||
|
|
||||||
struct GBAAudio {
|
struct GBAAudio {
|
||||||
struct GBA* p;
|
struct GBA* p;
|
||||||
|
|
||||||
|
@ -200,14 +204,7 @@ struct GBAAudio {
|
||||||
|
|
||||||
unsigned sampleRate;
|
unsigned sampleRate;
|
||||||
|
|
||||||
union {
|
GBARegisterSOUNDBIAS soundbias;
|
||||||
struct {
|
|
||||||
unsigned bias : 10;
|
|
||||||
unsigned : 4;
|
|
||||||
unsigned resolution : 2;
|
|
||||||
};
|
|
||||||
uint16_t soundbias;
|
|
||||||
};
|
|
||||||
|
|
||||||
int32_t nextEvent;
|
int32_t nextEvent;
|
||||||
int32_t eventDiff;
|
int32_t eventDiff;
|
||||||
|
|
|
@ -126,6 +126,8 @@ static THREAD_ENTRY _GBAThreadRun(void* context) {
|
||||||
|
|
||||||
if (threadContext->audioBuffers) {
|
if (threadContext->audioBuffers) {
|
||||||
GBAAudioResizeBuffer(&gba.audio, threadContext->audioBuffers);
|
GBAAudioResizeBuffer(&gba.audio, threadContext->audioBuffers);
|
||||||
|
} else {
|
||||||
|
threadContext->audioBuffers = GBA_AUDIO_SAMPLES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (threadContext->renderer) {
|
if (threadContext->renderer) {
|
||||||
|
@ -577,7 +579,7 @@ bool GBASyncDrawingFrame(struct GBASync* sync) {
|
||||||
return sync->videoFrameSkip <= 0;
|
return sync->videoFrameSkip <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBASyncProduceAudio(struct GBASync* sync, int wait) {
|
void GBASyncProduceAudio(struct GBASync* sync, bool wait) {
|
||||||
if (sync->audioWait && wait) {
|
if (sync->audioWait && wait) {
|
||||||
// TODO loop properly in event of spurious wakeups
|
// TODO loop properly in event of spurious wakeups
|
||||||
ConditionWait(&sync->audioRequiredCond, &sync->audioBufferMutex);
|
ConditionWait(&sync->audioRequiredCond, &sync->audioBufferMutex);
|
||||||
|
|
|
@ -121,7 +121,7 @@ bool GBASyncWaitFrameStart(struct GBASync* sync, int frameskip);
|
||||||
void GBASyncWaitFrameEnd(struct GBASync* sync);
|
void GBASyncWaitFrameEnd(struct GBASync* sync);
|
||||||
bool GBASyncDrawingFrame(struct GBASync* sync);
|
bool GBASyncDrawingFrame(struct GBASync* sync);
|
||||||
|
|
||||||
void GBASyncProduceAudio(struct GBASync* sync, int wait);
|
void GBASyncProduceAudio(struct GBASync* sync, bool wait);
|
||||||
void GBASyncLockAudio(struct GBASync* sync);
|
void GBASyncLockAudio(struct GBASync* sync);
|
||||||
void GBASyncUnlockAudio(struct GBASync* sync);
|
void GBASyncUnlockAudio(struct GBASync* sync);
|
||||||
void GBASyncConsumeAudio(struct GBASync* sync);
|
void GBASyncConsumeAudio(struct GBASync* sync);
|
||||||
|
|
|
@ -626,6 +626,10 @@ void GBAGetGameCode(struct GBA* gba, char* out) {
|
||||||
memcpy(out, &((struct GBACartridge*) gba->memory.rom)->id, 4);
|
memcpy(out, &((struct GBACartridge*) gba->memory.rom)->id, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GBAGetGameTitle(struct GBA* gba, char* out) {
|
||||||
|
memcpy(out, &((struct GBACartridge*) gba->memory.rom)->title, 12);
|
||||||
|
}
|
||||||
|
|
||||||
void GBAHitStub(struct ARMCore* cpu, uint32_t opcode) {
|
void GBAHitStub(struct ARMCore* cpu, uint32_t opcode) {
|
||||||
struct GBA* gba = (struct GBA*) cpu->master;
|
struct GBA* gba = (struct GBA*) cpu->master;
|
||||||
enum GBALogLevel level = GBA_LOG_FATAL;
|
enum GBALogLevel level = GBA_LOG_FATAL;
|
||||||
|
|
|
@ -151,6 +151,7 @@ void GBAApplyPatch(struct GBA* gba, struct Patch* patch);
|
||||||
|
|
||||||
bool GBAIsROM(struct VFile* vf);
|
bool GBAIsROM(struct VFile* vf);
|
||||||
void GBAGetGameCode(struct GBA* gba, char* out);
|
void GBAGetGameCode(struct GBA* gba, char* out);
|
||||||
|
void GBAGetGameTitle(struct GBA* gba, char* out);
|
||||||
|
|
||||||
__attribute__((format (printf, 3, 4)))
|
__attribute__((format (printf, 3, 4)))
|
||||||
void GBALog(struct GBA* gba, enum GBALogLevel level, const char* format, ...);
|
void GBALog(struct GBA* gba, enum GBALogLevel level, const char* format, ...);
|
||||||
|
|
|
@ -171,9 +171,8 @@ static void _GBASDLHandleKeypress(struct GBAThread* context, struct GBASDLEvents
|
||||||
case SDLK_F7:
|
case SDLK_F7:
|
||||||
case SDLK_F8:
|
case SDLK_F8:
|
||||||
case SDLK_F9:
|
case SDLK_F9:
|
||||||
case SDLK_F10:
|
|
||||||
GBAThreadInterrupt(context);
|
GBAThreadInterrupt(context);
|
||||||
GBASaveState(context->gba, context->stateDir, event->keysym.sym - SDLK_F1, true);
|
GBASaveState(context->gba, context->stateDir, event->keysym.sym - SDLK_F1 + 1, true);
|
||||||
GBAThreadContinue(context);
|
GBAThreadContinue(context);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -190,9 +189,8 @@ static void _GBASDLHandleKeypress(struct GBAThread* context, struct GBASDLEvents
|
||||||
case SDLK_F7:
|
case SDLK_F7:
|
||||||
case SDLK_F8:
|
case SDLK_F8:
|
||||||
case SDLK_F9:
|
case SDLK_F9:
|
||||||
case SDLK_F10:
|
|
||||||
GBAThreadInterrupt(context);
|
GBAThreadInterrupt(context);
|
||||||
GBALoadState(context->gba, context->stateDir, event->keysym.sym - SDLK_F1);
|
GBALoadState(context->gba, context->stateDir, event->keysym.sym - SDLK_F1 + 1);
|
||||||
GBAThreadContinue(context);
|
GBAThreadContinue(context);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue