int UNITY_AUDIODSP_CALLBACK GetFloatBufferCallback(UnityAudioEffectState* state, const char* name, float* buffer, int numsamples)
    {
#if !UNITY_PS3
        EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
        if (strcmp(name, "InputSpec") == 0)
            data->analyzer.ReadBuffer(buffer, numsamples, true);
        else if (strcmp(name, "OutputSpec") == 0)
            data->analyzer.ReadBuffer(buffer, numsamples, false);
        else if (strcmp(name, "LiveData") == 0)
        {
            buffer[0] = data->band[0][0].reduction;
            buffer[1] = data->band[1][0].reduction;
            buffer[2] = data->band[2][0].reduction;
            buffer[3] = data->band[0][0].env;
            buffer[4] = data->band[1][0].env;
            buffer[5] = data->band[2][0].env;
        }
        else if (strcmp(name, "Coeffs") == 0)
        {
            SetupFilterCoeffs(data, state->samplerate, &data->previewBandsplit[0], &data->previewBandsplit[1], &data->previewBandsplit[2], &data->previewBandsplit[3]);
            data->previewBandsplit[0].StoreCoeffs(buffer);
            data->previewBandsplit[1].StoreCoeffs(buffer);
            data->previewBandsplit[2].StoreCoeffs(buffer);
            data->previewBandsplit[3].StoreCoeffs(buffer);
        }
        else
#endif
        memset(buffer, 0, sizeof(float) * numsamples);
        return UNITY_AUDIODSP_OK;
    }
Beispiel #2
0
    UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ProcessCallback(UnityAudioEffectState* state, float* inbuffer, float* outbuffer, unsigned int length, int inchannels, int outchannels)
    {
        EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
        const float sr = (float)state->samplerate;
        float specDecay = powf(10.0f, 0.05f * data->p[P_SpectrumDecay] * length / sr);
        bool calcSpectrum = (data->p[P_ShowSpectrum] >= 0.5f);
        if (calcSpectrum)
            data->analyzer.AnalyzeInput(inbuffer, inchannels, length, specDecay);

        for (int i = 0; i < inchannels; i++)
        {
            data->band[0][i].Setup(data->p[P_LowAttack] * sr, data->p[P_LowRelease] * sr, data->p[P_LowThreshold], data->p[P_LowRatio], data->p[P_LowKnee]);
            data->band[1][i].Setup(data->p[P_MidAttack] * sr, data->p[P_MidRelease] * sr, data->p[P_MidThreshold], data->p[P_MidRatio], data->p[P_MidKnee]);
            data->band[2][i].Setup(data->p[P_HighAttack], data->p[P_HighRelease], data->p[P_HighThreshold], data->p[P_HighRatio], data->p[P_HighKnee]);
            for (int k = 0; k < MAXORDER; k++)
                SetupFilterCoeffs(data, state->samplerate, &data->bandsplit[i][k][0], &data->bandsplit[i][k][1], &data->bandsplit[i][k][2], &data->bandsplit[i][k][3]);
        }

        const float  lowGainLin = powf(10.0f, (data->p[P_LowGain] + data->p[P_MasterGain]) * 0.05f);
        const float  midGainLin = powf(10.0f, (data->p[P_MidGain] + data->p[P_MasterGain]) * 0.05f);
        const float highGainLin = powf(10.0f, (data->p[P_HighGain] + data->p[P_MasterGain]) * 0.05f);
        const int order = (int)data->p[P_FilterOrder];
        for (unsigned int n = 0; n < length; n++)
        {
            for (int i = 0; i < outchannels; i++)
            {
                float killdenormal = (float)(data->random.Get() & 255) * 1.0e-9f;
                float input = inbuffer[n * inchannels + i] + killdenormal;
                float lpf = input, bpf = input, hpf = input;
                for (int k = 0; k < order; k++)
                {
                    lpf = data->bandsplit[i][k][0].Process(lpf);
                    bpf = data->bandsplit[i][k][1].Process(bpf);
                }
                for (int k = 0; k < order; k++)
                {
                    bpf = data->bandsplit[i][k][2].Process(bpf);
                    hpf = data->bandsplit[i][k][3].Process(hpf);
                }
                outbuffer[n * outchannels + i] =
                    data->band[0]->Process(lpf) *  lowGainLin +
                    data->band[1]->Process(bpf) *  midGainLin +
                    data->band[2]->Process(hpf) * highGainLin;
            }
        }

        if (calcSpectrum)
            data->analyzer.AnalyzeOutput(outbuffer, outchannels, length, specDecay);

        return UNITY_AUDIODSP_OK;
    }
    UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ProcessCallback(UnityAudioEffectState* state, float* inbuffer, float* outbuffer, unsigned int length, int inchannels, int outchannels)
    {
        EffectData::Data* data = &state->GetEffectData<EffectData>()->data;

#if UNITY_SPU
        UNITY_PS3_CELLDMA_GET(&g_EffectData, state->effectdata, sizeof(g_EffectData));
        data = &g_EffectData.data;
#endif

        float sr = (float)state->samplerate;
        for (int i = 0; i < inchannels; i++)
            SetupFilterCoeffs(data, &data->FilterH[i], &data->FilterP[i], &data->FilterL[i], sr);

#if !UNITY_PS3 && !UNITY_SPU
        float specDecay = powf(10.0f, 0.05f * data->p[P_SpectrumDecay] * length / sr);
        bool calcSpectrum = (data->p[P_ShowSpectrum] >= 0.5f);
        if (calcSpectrum)
            data->analyzer.AnalyzeInput(inbuffer, inchannels, length, specDecay);
#endif

        const float masterGain = powf(10.0f, data->p[P_MasterGain] * 0.05f);
        for (unsigned int n = 0; n < length; n++)
        {
            for (int i = 0; i < outchannels; i++)
            {
                float killdenormal = (float)(data->random.Get() & 255) * 1.0e-9f;
                float y = inbuffer[n * inchannels + i] + killdenormal;
                y = data->FilterH[i].Process(y);
                y = data->FilterP[i].Process(y);
                y = data->FilterL[i].Process(y);
                outbuffer[n * outchannels + i] = y * masterGain;
            }
        }

#if !UNITY_PS3 && !UNITY_SPU
        if (calcSpectrum)
            data->analyzer.AnalyzeOutput(outbuffer, outchannels, length, specDecay);
#endif

#if UNITY_SPU
        UNITY_PS3_CELLDMA_PUT(&g_EffectData, state->effectdata, sizeof(g_EffectData));
#endif

        return UNITY_AUDIODSP_OK;
    }
    int UNITY_AUDIODSP_CALLBACK GetFloatBufferCallback(UnityAudioEffectState* state, const char* name, float* buffer, int numsamples)
    {
#if !UNITY_PS3
        EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
        if (strcmp(name, "InputSpec") == 0)
            data->analyzer.ReadBuffer(buffer, numsamples, true);
        else if (strcmp(name, "OutputSpec") == 0)
            data->analyzer.ReadBuffer(buffer, numsamples, false);
        else if (strcmp(name, "Coeffs") == 0)
        {
            SetupFilterCoeffs(data, &data->DisplayFilterCoeffs[0], &data->DisplayFilterCoeffs[1], &data->DisplayFilterCoeffs[2], (float)state->samplerate);
            data->DisplayFilterCoeffs[2].StoreCoeffs(buffer);
            data->DisplayFilterCoeffs[1].StoreCoeffs(buffer);
            data->DisplayFilterCoeffs[0].StoreCoeffs(buffer);
        }
        else
#endif
        memset(buffer, 0, sizeof(float) * numsamples);
        return UNITY_AUDIODSP_OK;
    }