// This is called periodically by the media server. static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) { SuperpoweredShortIntToFloat(audioInputOutput, inputBufferFloat, numberOfSamples); // Converting the 16-bit integer samples to 32-bit floating point. frequencyDomain->addInput(inputBufferFloat, numberOfSamples); // Input goes to the frequency domain. // In the frequency domain we are working with 1024 magnitudes and phases for every channel (left, right), if the fft size is 2048. while (frequencyDomain->timeDomainToFrequencyDomain(magnitudeLeft, magnitudeRight, phaseLeft, phaseRight)) { // You can work with frequency domain data from this point. // This is just a quick example: we remove the magnitude of the first 20 bins, meaning total bass cut between 0-430 Hz. memset(magnitudeLeft, 0, 80); memset(magnitudeRight, 0, 80); // We are done working with frequency domain data. Let's go back to the time domain. // Check if we have enough room in the fifo buffer for the output. If not, move the existing audio data back to the buffer's beginning. if (fifoOutputLastSample + stepSize >= fifoCapacity) { // This will be true for every 100th iteration only, so we save precious memory bandwidth. int samplesInFifo = fifoOutputLastSample - fifoOutputFirstSample; if (samplesInFifo > 0) memmove(fifoOutput, fifoOutput + fifoOutputFirstSample * 2, samplesInFifo * sizeof(float) * 2); fifoOutputFirstSample = 0; fifoOutputLastSample = samplesInFifo; }; // Transforming back to the time domain. frequencyDomain->frequencyDomainToTimeDomain(magnitudeLeft, magnitudeRight, phaseLeft, phaseRight, fifoOutput + fifoOutputLastSample * 2); frequencyDomain->advance(); fifoOutputLastSample += stepSize; }; // If we have enough samples in the fifo output buffer, pass them to the audio output. if (fifoOutputLastSample - fifoOutputFirstSample >= numberOfSamples) { SuperpoweredFloatToShortInt(fifoOutput + fifoOutputFirstSample * 2, audioInputOutput, numberOfSamples); fifoOutputFirstSample += numberOfSamples; return true; } else return false; }
bool SuperpoweredExample::process(short int *output, unsigned int numberOfSamples) { pthread_mutex_lock(&mutex); bool silence = !playerA->process(stereoBuffer, false, numberOfSamples, volA, 0.0, -1); pthread_mutex_unlock(&mutex); // The stereoBuffer is ready now, let's put the finished audio into the requested buffers. if (!silence) SuperpoweredFloatToShortInt(stereoBuffer, output, numberOfSamples); return !silence; }
bool SuperpoweredExample::process(short int *output, unsigned int numberOfSamples) { float masterBpm = playerA->currentBpm; bool silence = !playerA->process(stereoBuffer, false, numberOfSamples, volA, masterBpm, playerA->msElapsedSinceLastBeat); if (!silence) { flanger->process(stereoBuffer, stereoBuffer, numberOfSamples); roll->process(stereoBuffer, stereoBuffer, numberOfSamples); filter->process(stereoBuffer, stereoBuffer, numberOfSamples); }; // The stereoBuffer is ready now, let's put the finished audio into the requested buffers. if (!silence) SuperpoweredFloatToShortInt(stereoBuffer, output, numberOfSamples); return !silence; }
bool SuperpoweredExample::process(short int *output, unsigned int numberOfSamples) { pthread_mutex_lock(&mutex); bool masterIsA = (crossValue <= 0.5f); float masterBpm = masterIsA ? playerA->currentBpm : playerB->currentBpm; double msElapsedSinceLastBeatA = playerA->msElapsedSinceLastBeat; // When playerB needs it, playerA has already stepped this value, so save it now. bool silence = !playerA->process(stereoBuffer, false, numberOfSamples, volA, masterBpm, playerB->msElapsedSinceLastBeat); if (playerB->process(stereoBuffer, !silence, numberOfSamples, volB, masterBpm, msElapsedSinceLastBeatA)) silence = false; roll->bpm = flanger->bpm = masterBpm; // Syncing fx is one line. if (roll->process(silence ? NULL : stereoBuffer, stereoBuffer, numberOfSamples) && silence) silence = false; if (!silence) { filter->process(stereoBuffer, stereoBuffer, numberOfSamples); flanger->process(stereoBuffer, stereoBuffer, numberOfSamples); }; pthread_mutex_unlock(&mutex); // The stereoBuffer is ready now, let's put the finished audio into the requested buffers. if (!silence) SuperpoweredFloatToShortInt(stereoBuffer, output, numberOfSamples); return !silence; }
// This is called periodically by the media server. static bool audioProcessing(void *clientdata, short int *audioInputOutput, int numberOfSamples, int samplerate) { if (player->process(floatBuffer, false, numberOfSamples)) { SuperpoweredFloatToShortInt(floatBuffer, audioInputOutput, numberOfSamples); return true; } else return false; }