ULONG64 get_process_starttime( pid_t p_id ) { ULONG64 startTime = (ULONG64)-1; /* * Do not raise privileges if we are inspecting ourselves. * This function is used not only by prl_perf_ctl, * but by all PerfCount users. */ if (::getpid() != p_id) { if (!set_debug_privilege()) WRITE_TRACE(DBG_FATAL, "Failed to set debug privilege"); } /** Converts specified 100-nanosecond intervals to milliseconds */ #define TO_MSECS(n100Nanoseconds) (n100Nanoseconds/10000) #define TO_ULONGLONG(large_var, high_part, low_part)\ ( (((unsigned long long) large_var.high_part) << 32 ) + large_var.low_part) HANDLE hProcess = hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, p_id); if (NULL != hProcess) { FILETIME CreationTime, ExitTime, KernelTime, UserTime; if (GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime)) startTime = TO_MSECS(TO_ULONGLONG(CreationTime, dwHighDateTime, dwLowDateTime)); CloseHandle(hProcess); } return startTime; #undef TO_ULONGLONG #undef TO_MSECS }
void PckTunesCDPlayer::play(int track, int num_loops, int start_frame, int duration) { if (!num_loops && !start_frame) return; EventType e; Char nameP[256], fileP[100]; static const Char *ext[] = { "mp3", "ogg" }; _pckTrack = track; _pckLoops = num_loops; _pckTrackStartFrame = TO_MSECS(start_frame); _pckTrackDuration = TO_MSECS(duration); VFSVolumeGetLabel(gVars->VFS.volRefNum, nameP, 256); StrPrintF(fileP, "/Palm/Programs/ScummVM/Audio/%s_%03ld.%s", gameP, (track + gVars->CD.firstTrack - 1), ext[gVars->CD.format]); if (PocketTunesOpenFile(nameP, fileP, 0) == errNone) { EvtGetEvent(&e, evtNoWait); PocketTunesPauseIfPlaying(); _isPlaying = true; if (_pckTrackStartFrame == 0 && _pckTrackDuration == 0) { _pckTrackDuration = getDuration(); } else { setPosition(_pckTrackStartFrame); if (_pckTrackDuration == 0) _pckTrackDuration = getDuration() - _pckTrackStartFrame; } PocketTunesPlay(); } else { _isPlaying = false; _pckTrackDuration = gVars->CD.defaultTrackLength * 1000; } _pckStopTime = 0; _pckTrackEndFrame = _pckTrackStartFrame + _pckTrackDuration; }
void MsaCDPlayer::play(int track, int num_loops, int start_frame, int duration) { if (!_isInitialized) return; if (!num_loops && !start_frame) return; _msaTrack = track + gVars->CD.firstTrack - 1; // first track >= 1 ?, not 0 (0=album) _msaLoops = num_loops; _msaStartFrame = TO_MSECS(start_frame); _msaDuration = TO_MSECS(duration); Err e; MemHandle trackH; // stop current play if any MsaStop(_msaRefNum, true); _msaStopTime = 0; // retreive track infos e = MsaGetTrackInfo(_msaRefNum, _msaTrack, 0, msa_LANG_CODE_ASCII, &trackH); // track exists if (!e && trackH) { MsaTime msaTime; MsaTrackInfo *trackP; UInt32 SU, fullLength; // FIXME (?) : this enable MsaSuToTime to return the right value in some cases MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP); MsaStop(_msaRefNum, true); // get the msa time trackP = (MsaTrackInfo *)MemHandleLock(trackH); MsaSuToTime(_msaRefNum, trackP->totalsu, &msaTime); SU = trackP->totalsu; MemPtrUnlock(trackP); MemHandleFree(trackH); // MSA frame in milli-seconds fullLength = FROM_MIN(msaTime.minute); fullLength += FROM_SEC(msaTime.second); fullLength += msaTime.frame; if (_msaDuration > 0) { _msaTrackLength = _msaDuration; } else if (_msaStartFrame > 0) { _msaTrackLength = fullLength; _msaTrackLength -= _msaStartFrame; } else { _msaTrackLength = fullLength; } // try to play the track if (start_frame == 0 && duration == 0) { MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP); _msaTrackEndSu = SU; } else { // FIXME : MsaTimeToSu doesn't work ... (may work with previous FIXME) _msaTrackStartSu = (UInt32) ((float)(_msaStartFrame) / ((float)fullLength / (float)SU)); _msaTrackEndSu = (UInt32) ((float)(_msaTrackLength) / ((float)fullLength / (float)SU)); _msaTrackEndSu += _msaTrackStartSu; if (_msaTrackEndSu > SU) _msaTrackEndSu = SU; MsaPlay(_msaRefNum, _msaTrack, _msaTrackStartSu, msa_PBRATE_SP); } } // TODO : use default track length if track not found }