Merge branch 'master' into qt

This commit is contained in:
Jeffrey Pfau 2014-10-18 01:06:35 -07:00
commit c12b8e6e6d
8 changed files with 21 additions and 17 deletions

View File

@ -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")

View File

@ -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) {

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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, ...);

View File

@ -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: