void process(AUAudioFrameCount frameCount, AUAudioFrameCount bufferOffset) override { for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { int frameOffset = int(frameIndex + bufferOffset); bitDepth = bitDepthRamper.getAndStep(); bitcrush0->bitdepth = (float)bitDepth; bitcrush1->bitdepth = (float)bitDepth; sampleRate = sampleRateRamper.getAndStep(); bitcrush0->srate = (float)sampleRate; bitcrush1->srate = (float)sampleRate; for (int channel = 0; channel < channels; ++channel) { float *in = (float *)inBufferListPtr->mBuffers[channel].mData + frameOffset; float *out = (float *)outBufferListPtr->mBuffers[channel].mData + frameOffset; if (started) { if (channel == 0) { sp_bitcrush_compute(sp, bitcrush0, in, out); } else { sp_bitcrush_compute(sp, bitcrush1, in, out); } } else { *out = *in; } } } }
void process(AUAudioFrameCount frameCount, AUAudioFrameCount bufferOffset) override { // For each sample. for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { double bitDepth = double(bitDepthRamper.getStep()); double sampleRate = double(sampleRateRamper.getStep()); int frameOffset = int(frameIndex + bufferOffset); bitcrush->bitdepth = (float)bitDepth; bitcrush->srate = (float)sampleRate; if (!started) { outBufferListPtr->mBuffers[0] = inBufferListPtr->mBuffers[0]; outBufferListPtr->mBuffers[1] = inBufferListPtr->mBuffers[1]; return; } for (int channel = 0; channel < channels; ++channel) { float *in = (float *)inBufferListPtr->mBuffers[channel].mData + frameOffset; float *out = (float *)outBufferListPtr->mBuffers[channel].mData + frameOffset; sp_bitcrush_compute(sp, bitcrush, in, out); } } }
int sporth_bitcrush(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT input; SPFLOAT out; SPFLOAT bitdepth; SPFLOAT srate; sp_bitcrush *bitcrush; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "bitcrush: Creating\n"); #endif sp_bitcrush_create(&bitcrush); plumber_add_module(pd, SPORTH_BITCRUSH, sizeof(sp_bitcrush), bitcrush); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "bitcrush: Initialising\n"); #endif if(sporth_check_args(stack, "ff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for bitcrush\n"); stack->error++; return PLUMBER_NOTOK; } srate = sporth_stack_pop_float(stack); bitdepth = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); bitcrush = pd->last->ud; sp_bitcrush_init(pd->sp, bitcrush); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: if(sporth_check_args(stack, "ff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for bitcrush\n"); stack->error++; return PLUMBER_NOTOK; } srate = sporth_stack_pop_float(stack); bitdepth = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); bitcrush = pd->last->ud; bitcrush->bitdepth = bitdepth; bitcrush->srate = srate; sp_bitcrush_compute(pd->sp, bitcrush, &input, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: bitcrush = pd->last->ud; sp_bitcrush_destroy(&bitcrush); break; default: fprintf(stderr, "bitcrush: Uknown mode!\n"); break; } return PLUMBER_OK; }