/* ======================== AdjustForCushionChannels In the very common case of having more sounds that would contribute to the mix than there are available hardware voices, it can be an audible discontinuity when a channel initially gets a voice or loses a voice. To avoid this, make sure that the last few hardware voices are mixed with a volume of zero, so they won't make a difference as they come and go. It isn't obvious what the exact best volume ramping method should be, just that it smoothly change frame to frame. ======================== */ static float AdjustForCushionChannels( const idStaticList< idActiveChannel, MAX_HARDWARE_VOICES >& activeEmitterChannels, const int uncushionedChannels, const float currentCushionDB, const float driftRate ) { float targetCushionDB; if( activeEmitterChannels.Num() <= uncushionedChannels ) { // we should be able to hear all of them targetCushionDB = DB_SILENCE; } else { // we should be able to hear all of them targetCushionDB = activeEmitterChannels[uncushionedChannels].channel->volumeDB; if( targetCushionDB < DB_SILENCE ) { targetCushionDB = DB_SILENCE; } else if( targetCushionDB > s_cushionFadeLimit.GetFloat() ) { targetCushionDB = s_cushionFadeLimit.GetFloat(); } } // linearly drift the currentTargetCushionDB towards targetCushionDB float driftedDB = currentCushionDB; if( driftedDB < targetCushionDB ) { driftedDB += driftRate; if( driftedDB > targetCushionDB ) { driftedDB = targetCushionDB; } } else { driftedDB -= driftRate; if( driftedDB < targetCushionDB ) { driftedDB = targetCushionDB; } } // ramp the lower sound volumes down for( int i = 0; i < activeEmitterChannels.Num(); i++ ) { idSoundChannel* chan = activeEmitterChannels[i].channel; chan->volumeDB = MapVolumeFromFadeDB( chan->volumeDB, driftedDB ); } return driftedDB; }
/* ======================== AssertFailed ======================== */ bool AssertFailed( const char* file, int line, const char* expression ) { // Set this to true to skip ALL assertions, including ones YOU CAUSE! static volatile bool skipAllAssertions = false; if( skipAllAssertions ) { return false; } // Set this to true to skip ONLY this assertion static volatile bool skipThisAssertion = false; skipThisAssertion = false; for( int i = 0; i < skippedAssertions.Num(); i++ ) { if( skippedAssertions[i].file == file && skippedAssertions[i].line == line ) { skipThisAssertion = true; // Set breakpoint here to re-enable if( !skipThisAssertion ) { skippedAssertions.RemoveIndexFast( i ); } return false; } } idLib::Warning( "ASSERTION FAILED! %s(%d): '%s'", file, line, expression ); // RB begin #ifdef _WIN32 if( IsDebuggerPresent() || com_assertOutOfDebugger.GetBool() ) #else //if( com_assertOutOfDebugger.GetBool() ) #endif // RB end { #ifdef _WIN32 #ifdef _MSC_VER __debugbreak(); #else // DG: mingw support DebugBreak(); #endif #else // not _WIN32 // DG: POSIX support raise( SIGTRAP ); // DG: end #endif // _WIN32 } if( skipThisAssertion ) { skippedAssertion_t* skipped = skippedAssertions.Alloc(); skipped->file = file; skipped->line = line; } return true; }
/* ======================== idParallelJobManagerLocal::WaitForAllJobLists ======================== */ void idParallelJobManagerLocal::WaitForAllJobLists() { // wait for all job lists to complete for( int i = 0; i < jobLists.Num(); i++ ) { jobLists[i]->Wait(); } }
/* ======================== idParallelJobManagerLocal::AllocJobList ======================== */ idParallelJobList* idParallelJobManagerLocal::AllocJobList( jobListId_t id, jobListPriority_t priority, unsigned int maxJobs, unsigned int maxSyncs, const idColor* color ) { for( int i = 0; i < jobLists.Num(); i++ ) { if( jobLists[i]->GetId() == id ) { // idStudio may cause job lists to be allocated multiple times } } idParallelJobList* jobList = new( TAG_JOBLIST ) idParallelJobList( id, priority, maxJobs, maxSyncs, color ); jobLists.Append( jobList ); return jobList; }
/* ======================== AssertFailed ======================== */ bool AssertFailed( const char * file, int line, const char * expression ) { // Set this to true to skip ALL assertions, including ones YOU CAUSE! static volatile bool skipAllAssertions = false; if ( skipAllAssertions ) { return false; } // Set this to true to skip ONLY this assertion static volatile bool skipThisAssertion = false; skipThisAssertion = false; for ( int i = 0; i < skippedAssertions.Num(); i++ ) { if ( skippedAssertions[i].file == file && skippedAssertions[i].line == line ) { skipThisAssertion = true; // Set breakpoint here to re-enable if ( !skipThisAssertion ) { skippedAssertions.RemoveIndexFast( i ); } return false; } } idLib::Warning( "ASSERTION FAILED! %s(%d): '%s'", file, line, expression ); if ( IsDebuggerPresent() && com_assertOutOfDebugger.GetBool() ) { __debugbreak(); } if ( skipThisAssertion ) { skippedAssertion_t * skipped = skippedAssertions.Alloc(); skipped->file = file; skipped->line = line; } return true; }
/* ======================== idParallelJobManagerLocal::GetNumFreeJobLists ======================== */ int idParallelJobManagerLocal::GetNumFreeJobLists() const { return MAX_JOBLISTS - jobLists.Num(); }
/* ======================== idParallelJobManagerLocal::GetNumJobLists ======================== */ int idParallelJobManagerLocal::GetNumJobLists() const { return jobLists.Num(); }