void oops(const mcontext_t &context) { eLog(lvlFatal, "PC: %08lx", (unsigned long)context.pc); int i; for (i=0; i<32; i += 4) { eLog(lvlFatal, " %08x %08x %08x %08x", (int)context.gregs[i+0], (int)context.gregs[i+1], (int)context.gregs[i+2], (int)context.gregs[i+3]); } }
void handleFatalSignal(int signum, siginfo_t *si, void *ctx) { #ifndef NO_OOPS_SUPPORT ucontext_t *uc = (ucontext_t*)ctx; oops(uc->uc_mcontext); #endif print_backtrace(); eLog(lvlFatal, "-------FATAL SIGNAL"); bsodFatal("enigma2, signal"); }
/* Use own backtrace print procedure because backtrace_symbols_fd * only writes to files. backtrace_symbols cannot be used because * it's not async-signal-safe and so must not be used in signal * handlers. */ void print_backtrace() { void *array[15]; size_t size; int cnt; size = backtrace(array, 15); eLog(lvlFatal, "Backtrace:"); for (cnt = 1; cnt < size; ++cnt) { Dl_info info; if (dladdr(array[cnt], &info) && info.dli_fname != NULL && info.dli_fname[0] != '\0') { eLog(lvlFatal, "%s(%s) [0x%X]", info.dli_fname, info.dli_sname != NULL ? info.dli_sname : "n/a", (unsigned long int) array[cnt]); } } }
eF32 tfADSR::process(tfADSR::State *state, eU32 len, eF32 a, eF32 d, eF32 s, eF32 r, eF32 slope, eU32 sampleRate) { eF32 attack,decay,sustain,release; eF32 scale = 0.00050f * (sampleRate / 44100.0f) * len; a = ePow(a, 3); d = ePow(d, 3); r = ePow(r, 3); a = eMax(0.000000001f, a); attack = -eLog(a * .94f) * scale; if (d <= 0) decay = -1.0f; else decay = eLog(d * .94f) * 0.25f * scale; sustain = eMax(s, 0.0f); r = eMax(r, 0.000000001f); release = eLog(r * .94f) * 0.25f * scale; eF32 volume = state->volume; switch (state->state) { case ADSR_STATE_ATTACK: volume += attack; if (volume >= 1.0f) { volume = 1.0f; state->state = ADSR_STATE_DECAY; } break; case ADSR_STATE_DECAY: { eF32 diff = 0.01f + (volume - sustain); eF32 range = 1.0f - sustain; eF32 pos = diff / range; eF32 slope_f = ePow(pos, slope); volume += decay * slope_f; if (volume <= sustain) { volume = sustain; state->state = ADSR_STATE_SUSTAIN; } } break; case ADSR_STATE_SUSTAIN: if (volume < sustain) { volume -= decay; if (volume > sustain) { volume = sustain; } } else if (volume > sustain) { volume += decay; if (volume < sustain) { volume = sustain; } } break; case ADSR_STATE_RELEASE: { eF32 slope_f = ePow(volume, slope); volume += release * slope_f; if (volume <= 0.001f) { volume = 0.0f; state->state = ADSR_STATE_FINISHED; } } break; case ADSR_STATE_FINISHED: break; } state->volume = volume; return volume; }