Example #1
0
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]);
	}
}
Example #2
0
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");
}
Example #3
0
/* 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]);
		}
	}
}
Example #4
0
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;
}