static HRESULT WINAPI IDsCaptureDriverBufferImpl_Start(PIDSCDRIVERBUFFER iface, DWORD dwFlags) { IDsCaptureDriverBufferImpl *This = (IDsCaptureDriverBufferImpl *)iface; TRACE("(%p,%x)\n",iface,dwFlags); /* **** */ EnterCriticalSection(&This->pcm_crst); snd_pcm_start(This->pcm); This->play_looping = !!(dwFlags & DSCBSTART_LOOPING); if (!This->play_looping) /* Not well supported because of the difference in ALSA size and DSOUND's notion of size * what it does right now is fill the buffer once.. ALSA size */ FIXME("Non-looping buffers are not properly supported!\n"); CommitAll(This, TRUE); if (This->notify && This->notify->nrofnotifies && This->notify->notifies) { DWORD playpos = realpos_to_fakepos(This, This->mmap_pos); if (playpos) Capture_CheckNotify(This->notify, 0, playpos); This->notify->playpos = playpos; } /* **** */ LeaveCriticalSection(&This->pcm_crst); return DS_OK; }
static void CheckXRUN(IDsDriverBufferImpl* This) { snd_pcm_state_t state = snd_pcm_state(This->pcm); snd_pcm_sframes_t delay; int err; snd_pcm_hwsync(This->pcm); snd_pcm_delay(This->pcm, &delay); if ( state == SND_PCM_STATE_XRUN ) { err = snd_pcm_prepare(This->pcm); CommitAll(This); snd_pcm_start(This->pcm); WARN("xrun occurred\n"); if ( err < 0 ) ERR("recovery from xrun failed, prepare failed: %s\n", snd_strerror(err)); } else if ( state == SND_PCM_STATE_SUSPENDED ) { int err = snd_pcm_resume(This->pcm); TRACE("recovery from suspension occurred\n"); if (err < 0 && err != -EAGAIN){ err = snd_pcm_prepare(This->pcm); if (err < 0) ERR("recovery from suspend failed, prepare failed: %s\n", snd_strerror(err)); } } else if ( state != SND_PCM_STATE_RUNNING ) { FIXME("Unhandled state: %d\n", state); } }
void CAdvancedSettingsPage::OnOK() { CommitAll(); UpdateAll(); m_wndFonts.Invalidate(); CSettingsPage::OnOK(); }
static HRESULT WINAPI IDsDriverBufferImpl_GetPosition(PIDSDRIVERBUFFER iface, LPDWORD lpdwPlay, LPDWORD lpdwWrite) { IDsDriverBufferImpl *This = (IDsDriverBufferImpl *)iface; snd_pcm_uframes_t hw_pptr, hw_wptr; snd_pcm_state_t state; /* **** */ EnterCriticalSection(&This->pcm_crst); if (!This->pcm) { FIXME("Bad pointer for pcm: %p\n", This->pcm); LeaveCriticalSection(&This->pcm_crst); return DSERR_GENERIC; } if (!lpdwPlay && !lpdwWrite) CommitAll(This); state = snd_pcm_state(This->pcm); if (state != SND_PCM_STATE_PREPARED && state != SND_PCM_STATE_RUNNING) { CheckXRUN(This); state = snd_pcm_state(This->pcm); } if (state == SND_PCM_STATE_RUNNING) { snd_pcm_uframes_t used = This->mmap_buflen_frames - snd_pcm_avail_update(This->pcm); if (This->mmap_pos > used) hw_pptr = This->mmap_pos - used; else hw_pptr = This->mmap_buflen_frames + This->mmap_pos - used; hw_pptr %= This->mmap_buflen_frames; TRACE("At position: %ld (%ld) - Used %ld\n", hw_pptr, This->mmap_pos, used); } else hw_pptr = This->mmap_pos; hw_wptr = This->mmap_pos; LeaveCriticalSection(&This->pcm_crst); /* **** */ if (lpdwPlay) *lpdwPlay = snd_pcm_frames_to_bytes(This->pcm, hw_pptr); if (lpdwWrite) *lpdwWrite = snd_pcm_frames_to_bytes(This->pcm, hw_wptr); TRACE("hw_pptr=0x%08x, hw_wptr=0x%08x playpos=%d, writepos=%d\n", (unsigned int)hw_pptr, (unsigned int)hw_wptr, lpdwPlay?*lpdwPlay:-1, lpdwWrite?*lpdwWrite:-1); return DS_OK; }
void SysMainMemory::ResetAll() { CommitAll(); DevCon.WriteLn( Color_StrongBlue, "Resetting host memory for virtual systems..." ); ConsoleIndentScope indent(1); m_ee.Reset(); m_iop.Reset(); m_vu.Reset(); // Note: newVif is reset as part of other VIF structures. }
static HRESULT WINAPI IDsCaptureDriverBufferImpl_GetPosition(PIDSCDRIVERBUFFER iface, LPDWORD lpdwCappos, LPDWORD lpdwReadpos) { IDsCaptureDriverBufferImpl *This = (IDsCaptureDriverBufferImpl *)iface; snd_pcm_uframes_t hw_pptr, hw_wptr; EnterCriticalSection(&This->pcm_crst); if (!This->pcm) { FIXME("Bad pointer for pcm: %p\n", This->pcm); LeaveCriticalSection(&This->pcm_crst); return DSERR_GENERIC; } if (snd_pcm_state(This->pcm) != SND_PCM_STATE_RUNNING) { CheckXRUN(This); hw_pptr = This->mmap_pos; } else { /* FIXME: Unused at the moment */ snd_pcm_uframes_t used = CommitAll(This, FALSE); if (This->mmap_pos > used) hw_pptr = This->mmap_pos - used; else hw_pptr = This->mmap_buflen_frames - used + This->mmap_pos; } hw_wptr = This->mmap_pos; if (lpdwCappos) *lpdwCappos = realpos_to_fakepos(This, hw_pptr); if (lpdwReadpos) *lpdwReadpos = realpos_to_fakepos(This, hw_wptr); LeaveCriticalSection(&This->pcm_crst); TRACE("hw_pptr=%u, hw_wptr=%u playpos=%u(%p), writepos=%u(%p)\n", (unsigned int)hw_pptr, (unsigned int)hw_wptr, realpos_to_fakepos(This, hw_pptr), lpdwCappos, realpos_to_fakepos(This, hw_wptr), lpdwReadpos); return DS_OK; }
/// Commit (delete) events before target timestamp ts void eventQueue::CommitEvents(sim *obj, POSE_TimeType ts) { #ifdef EQ_SANITIZE sanitize(); #endif Event *target = frontPtr->next, *commitPtr = frontPtr->next; if (ts == POSE_endtime) { CommitAll(obj); #ifdef MEM_TEMPORAL localTimePool->set_min_time(ts); localTimePool->empty_recycle_bin(); #endif return; } // first commit the events if (obj->objID->usesAntimethods()) { while ((commitPtr->timestamp < ts) && (commitPtr != backPtr) && (commitPtr != currentPtr)) { CmiAssert(commitPtr->done == 1); // only commit executed events obj->ResolveCommitFn(commitPtr->fnIdx, commitPtr->msg); // call commit fn obj->basicStats[0]++; CommitStatsHelper(obj, commitPtr); if (commitPtr->commitBfrLen > 0) { // print buffered output CkPrintf("%s", commitPtr->commitBfr); if (commitPtr->commitErr) CmiAbort("Commit ERROR"); } commitPtr = commitPtr->next; } } else { while ((target != backPtr) && (target->timestamp < ts) && (target != currentPtr)) { // commit upto ts while (commitPtr != target) { // commit upto next checkpoint CmiAssert(commitPtr->done == 1); // only commit executed events obj->ResolveCommitFn(commitPtr->fnIdx, commitPtr->msg); obj->basicStats[0]++; CommitStatsHelper(obj, commitPtr); if (commitPtr->commitBfrLen > 0) { // print buffered output CkPrintf("%s", commitPtr->commitBfr); if (commitPtr->commitErr) CmiAbort("Commit ERROR"); } commitPtr = commitPtr->next; } //find next target target = target->next; #ifdef MEM_TEMPORAL while (!target->serialCPdata && (target->timestamp <ts) && (target != backPtr)) #else while (!target->cpData && (target->timestamp <ts) && (target != backPtr)) #endif target = target->next; } } // now free up the memory Event *link = commitPtr; commitPtr = commitPtr->prev; while (commitPtr != frontPtr) { #ifdef MEM_TEMPORAL if (commitPtr->serialCPdata) { localTimePool->tmp_free(commitPtr->timestamp, commitPtr->serialCPdata); #else if (commitPtr->cpData) { delete commitPtr->cpData; #endif } commitPtr = commitPtr->prev; delete commitPtr->next; mem_usage--; } frontPtr->next = link; link->prev = frontPtr; #ifdef EQ_SANITIZE sanitize(); #endif } /// Commit (delete) all events void eventQueue::CommitAll(sim *obj) { #ifdef EQ_SANITIZE sanitize(); #endif Event *commitPtr = frontPtr->next; // commit calls for done events while (commitPtr != backPtr) { if (commitPtr->done) { obj->ResolveCommitFn(commitPtr->fnIdx, commitPtr->msg); obj->basicStats[0]++; CommitStatsHelper(obj, commitPtr); if (commitPtr->commitBfrLen > 0) { // print buffered output CkPrintf("%s", commitPtr->commitBfr); if (commitPtr->commitErr) CmiAbort("Commit ERROR"); } } commitPtr = commitPtr->next; } // now free up the memory (frees ALL events in the queue, not just // the ones that are done) Event *link = commitPtr; commitPtr = commitPtr->prev; while (commitPtr != frontPtr) { #ifdef MEM_TEMPORAL if (commitPtr->serialCPdata) { localTimePool->tmp_free(commitPtr->timestamp, commitPtr->serialCPdata); } #else if (commitPtr->cpData) { delete commitPtr->cpData; } #endif commitPtr = commitPtr->prev; mem_usage--; delete commitPtr->next; } frontPtr->next = link; link->prev = frontPtr; #ifdef EQ_SANITIZE sanitize(); #endif }