Merge pull request #2 from hrydgard/master

Sync
This commit is contained in:
CrazyMax 2013-03-31 15:54:48 -07:00
commit d82b09b087
3 changed files with 53 additions and 12 deletions

View file

@ -163,7 +163,10 @@ public:
return id; return id;
} }
MipsCall *get(u32 id) { MipsCall *get(u32 id) {
return calls_[id]; auto iter = calls_.find(id);
if (iter == calls_.end())
return NULL;
return iter->second;
} }
MipsCall *pop(u32 id) { MipsCall *pop(u32 id) {
MipsCall *temp = calls_[id]; MipsCall *temp = calls_[id];
@ -1614,7 +1617,9 @@ int sceKernelStartThread(SceUID threadToStartID, u32 argSize, u32 argBlockPtr)
// TODO: Maybe this happens even for worse-priority started threads? // TODO: Maybe this happens even for worse-priority started threads?
dispatchEnabled = true; dispatchEnabled = true;
__KernelChangeReadyState(currentThread, true); if (cur && cur->isRunning())
cur->nt.status &= ~THREADSTATUS_RUNNING;
__KernelChangeReadyState(cur, currentThread, true);
hleReSchedule("thread started"); hleReSchedule("thread started");
} }
else if (!dispatchEnabled) else if (!dispatchEnabled)

View file

@ -571,11 +571,11 @@ u32 sceMpegQueryStreamSize(u32 bufferAddr, u32 sizeAddr)
AnalyzeMpeg(bufferAddr, &ctx); AnalyzeMpeg(bufferAddr, &ctx);
if (ctx.mpegMagic != PSMF_MAGIC) { if (ctx.mpegMagic != PSMF_MAGIC) {
ERROR_LOG(HLE, "sceMpegQueryStreamOffset: Bad PSMF magic"); ERROR_LOG(HLE, "sceMpegQueryStreamSize: Bad PSMF magic");
Memory::Write_U32(0, sizeAddr); Memory::Write_U32(0, sizeAddr);
return ERROR_MPEG_INVALID_VALUE; return ERROR_MPEG_INVALID_VALUE;
} else if ((ctx.mpegOffset & 2047) != 0 ) { } else if ((ctx.mpegOffset & 2047) != 0 ) {
ERROR_LOG(HLE, "sceMpegQueryStreamOffset: Bad offset"); ERROR_LOG(HLE, "sceMpegQueryStreamSize: Bad offset");
Memory::Write_U32(0, sizeAddr); Memory::Write_U32(0, sizeAddr);
return ERROR_MPEG_INVALID_VALUE; return ERROR_MPEG_INVALID_VALUE;
} }
@ -1081,7 +1081,6 @@ int sceMpegGetAvcAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr)
WARN_LOG(HLE, "sceMpegGetAvcAu(%08x, %08x, %08x, %08x): bad mpeg handle", mpeg, streamId, auAddr, attrAddr); WARN_LOG(HLE, "sceMpegGetAvcAu(%08x, %08x, %08x, %08x): bad mpeg handle", mpeg, streamId, auAddr, attrAddr);
return -1; return -1;
} }
DEBUG_LOG(HLE, "sceMpegGetAvcAu(%08x, %08x, %08x, %08x)", mpeg, streamId, auAddr, attrAddr);
SceMpegRingBuffer mpegRingbuffer; SceMpegRingBuffer mpegRingbuffer;
Memory::ReadStruct(ctx->mpegRingbufferAddr, &mpegRingbuffer); Memory::ReadStruct(ctx->mpegRingbufferAddr, &mpegRingbuffer);
@ -1089,8 +1088,9 @@ int sceMpegGetAvcAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr)
SceMpegAu sceAu; SceMpegAu sceAu;
sceAu.read(auAddr); sceAu.read(auAddr);
if (mpegRingbuffer.packetsRead == 0) { if (mpegRingbuffer.packetsRead == 0 || mpegRingbuffer.packetsFree == mpegRingbuffer.packets) {
// delayThread(mpegErrorDecodeDelay) // delayThread(mpegErrorDecodeDelay)
DEBUG_LOG(HLE, "PSP_ERROR_MPEG_NO_DATA=sceMpegGetAvcAu(%08x, %08x, %08x, %08x)", mpeg, streamId, auAddr, attrAddr);
return PSP_ERROR_MPEG_NO_DATA; return PSP_ERROR_MPEG_NO_DATA;
} }
@ -1135,6 +1135,7 @@ int sceMpegGetAvcAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr)
Memory::Write_U32(1, attrAddr); Memory::Write_U32(1, attrAddr);
} }
DEBUG_LOG(HLE, "%x=sceMpegGetAvcAu(%08x, %08x, %08x, %08x)", result, mpeg, streamId, auAddr, attrAddr);
return result; return result;
} }
@ -1158,7 +1159,6 @@ int sceMpegGetAtracAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr)
WARN_LOG(HLE, "sceMpegGetAtracAu(%08x, %08x, %08x, %08x): bad mpeg handle", mpeg, streamId, auAddr, attrAddr); WARN_LOG(HLE, "sceMpegGetAtracAu(%08x, %08x, %08x, %08x): bad mpeg handle", mpeg, streamId, auAddr, attrAddr);
return -1; return -1;
} }
DEBUG_LOG(HLE, "sceMpegGetAtracAu(%08x, %08x, %08x, %08x)", mpeg, streamId, auAddr, attrAddr);
SceMpegRingBuffer mpegRingbuffer; SceMpegRingBuffer mpegRingbuffer;
Memory::ReadStruct(ctx->mpegRingbufferAddr, &mpegRingbuffer); Memory::ReadStruct(ctx->mpegRingbufferAddr, &mpegRingbuffer);
@ -1168,6 +1168,11 @@ int sceMpegGetAtracAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr)
int result = 0; int result = 0;
if (mpegRingbuffer.packetsFree == mpegRingbuffer.packets) {
DEBUG_LOG(HLE, "PSP_ERROR_MPEG_NO_DATA=sceMpegGetAtracAu(%08x, %08x, %08x, %08x)", mpeg, streamId, auAddr, attrAddr);
return PSP_ERROR_MPEG_NO_DATA;
}
//... //...
// TODO: Just faking it. // TODO: Just faking it.
sceAu.pts += videoTimestampStep; sceAu.pts += videoTimestampStep;
@ -1186,6 +1191,7 @@ int sceMpegGetAtracAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr)
Memory::Write_U32(0, attrAddr); Memory::Write_U32(0, attrAddr);
} }
DEBUG_LOG(HLE, "%x=sceMpegGetAtracAu(%08x, %08x, %08x, %08x)", result, mpeg, streamId, auAddr, attrAddr);
return result; return result;
} }
@ -1270,10 +1276,29 @@ u32 sceMpegRingbufferQueryPackNum(int memorySize)
u32 sceMpegFlushAllStream(u32 mpeg) u32 sceMpegFlushAllStream(u32 mpeg)
{ {
MpegContext *ctx = getMpegCtx(mpeg); MpegContext *ctx = getMpegCtx(mpeg);
ERROR_LOG(HLE, "UNIMPL sceMpegFlushAllStream(%08x)", mpeg); if (!ctx) {
if ( ctx->videoFrameCount > 0 || ctx->audioFrameCount > 0) { WARN_LOG(HLE, "sceMpegFlushAllStream(%08x): bad mpeg handle", mpeg);
//__MpegFinish(); return -1;
} }
WARN_LOG(HLE, "UNIMPL sceMpegFlushAllStream(%08x)", mpeg);
ctx->avcRegistered = false;
ctx->atracRegistered = false;
ctx->pcmRegistered = false;
ctx->dataRegistered = false;
ctx->streamMap.clear();
ctx->isAnalyzed = false;
if (Memory::IsValidAddress(ctx->mpegRingbufferAddr))
{
auto ringbuffer = Memory::GetStruct<SceMpegRingBuffer>(ctx->mpegRingbufferAddr);
ringbuffer->packetsFree = ringbuffer->packets;
ringbuffer->packetsRead = 0;
ringbuffer->packetsWritten = 0;
}
return 0; return 0;
} }
@ -1308,7 +1333,15 @@ u32 sceMpegAvcCsc(u32 mpeg, u32 sourceAddr, u32 rangeAddr, int frameWidth, u32 d
u32 sceMpegRingbufferDestruct(u32 ringbufferAddr) u32 sceMpegRingbufferDestruct(u32 ringbufferAddr)
{ {
DEBUG_LOG(HLE, "sceMpegRingbufferDestruct(%08x)", ringbufferAddr); DEBUG_LOG(HLE, "sceMpegRingbufferDestruct(%08x)", ringbufferAddr);
// Don't need to do anything here
if (Memory::IsValidAddress(ringbufferAddr))
{
auto ringbuffer = Memory::GetStruct<SceMpegRingBuffer>(ringbufferAddr);
ringbuffer->packetsFree = ringbuffer->packets;
ringbuffer->packetsRead = 0;
ringbuffer->packetsWritten = 0;
}
return 0; return 0;
} }

View file

@ -33,7 +33,10 @@ int KeyboardDevice::UpdateState(InputState &input_state) {
bool doAlternate = alternate && (alternator++ % 10) < 5; bool doAlternate = alternate && (alternator++ % 10) < 5;
for (int i = 0; i < sizeof(key_pad_map)/sizeof(key_pad_map[0]); i += 2) { for (int i = 0; i < sizeof(key_pad_map)/sizeof(key_pad_map[0]); i += 2) {
if (GetAsyncKeyState(key_pad_map[i]) && !doAlternate) { if (!GetAsyncKeyState(key_pad_map[i])) {
continue;
}
if (!doAlternate || key_pad_map[i + 1] > PAD_BUTTON_SELECT) {
input_state.pad_buttons |= key_pad_map[i+1]; input_state.pad_buttons |= key_pad_map[i+1];
} }
} }