annotate projects/bucket_brigade_chorus/render.cpp @ 269:ac8eb07afcf5

Oxygen text added to each render.cpp file for the default projects. Text includes project explanation from Wiki, edited in places. Empty project added as a default project. Doxyfile updated. Each of the project locations added to INPUT configuration option. Consider just watching the whole project file so all new projects are automatically pulled through.
author Robert Jack <robert.h.jack@gmail.com>
date Tue, 17 May 2016 15:40:16 +0100
parents 2bdb48d1fca6
children
rev   line source
giuliomoro@98 1 #include <BeagleRT.h>
giuliomoro@98 2 #include <Scope.h>
giuliomoro@98 3 #include <cmath>
giuliomoro@98 4 #include <Utilities.h>
giuliomoro@98 5
giuliomoro@98 6 float gPhase1, gPhase2;
giuliomoro@98 7 float gFrequency1, gFrequency2;
giuliomoro@98 8 float gInverseSampleRate;
giuliomoro@98 9
giuliomoro@98 10 // initialise_render() is called once before the audio rendering starts.
giuliomoro@98 11 // Use it to perform any initialisation and allocation which is dependent
giuliomoro@98 12 // on the period size or sample rate.
giuliomoro@98 13 //
giuliomoro@98 14 // userData holds an opaque pointer to a data structure that was passed
giuliomoro@98 15 // in from the call to initAudio().
giuliomoro@98 16 //
giuliomoro@98 17 // Return true on success; returning false halts the program.
giuliomoro@98 18 #include <I2c_Codec.h>
giuliomoro@98 19 #include <PRU.h>
giuliomoro@98 20 extern I2c_Codec *gAudioCodec;
giuliomoro@98 21 extern PRU *gPRU;
giuliomoro@98 22 float D=5264;
giuliomoro@183 23 #define delayLength 256
giuliomoro@98 24 float delay[delayLength];
giuliomoro@98 25 int writePointer=0;
giuliomoro@98 26 int readPointer=writePointer+1;
giuliomoro@98 27 AuxiliaryTask updatePll;
giuliomoro@98 28
giuliomoro@98 29 void updatePllFunction(){
giuliomoro@183 30 // gPRU->setGPIOTestPin();
giuliomoro@183 31 static int count = 0;
giuliomoro@183 32 while(!gShouldStop){
giuliomoro@183 33 gAudioCodec->setPllD(D);
giuliomoro@183 34 count++;
giuliomoro@183 35 if((count&4095)==0)
giuliomoro@183 36 printf("sampling rate: %f\n",gAudioCodec->getAudioSamplingRate());
giuliomoro@183 37 usleep(100);
giuliomoro@183 38 }
giuliomoro@183 39 // gPRU->clearGPIOTestPin();
giuliomoro@98 40 }
giuliomoro@98 41
giuliomoro@98 42 bool setup(BeagleRTContext *context, void *userData)
giuliomoro@98 43 {
giuliomoro@98 44 gInverseSampleRate = 1.0/context->audioSampleRate;
giuliomoro@98 45
giuliomoro@98 46 gPhase1 = 0.0;
giuliomoro@98 47 gPhase2 = 0.0;
giuliomoro@98 48
giuliomoro@98 49 gFrequency1 = 200.0;
giuliomoro@98 50 gFrequency2 = 201.0;
giuliomoro@183 51 updatePll=BeagleRT_createAuxiliaryTask(&updatePllFunction, 91, "update PLL");
giuliomoro@98 52 for(int n=0; n<delayLength; n++){
giuliomoro@98 53 delay[n]=0;
giuliomoro@98 54 }
giuliomoro@98 55 return true;
giuliomoro@98 56 }
giuliomoro@98 57
giuliomoro@98 58 // render() is called regularly at the highest priority by the audio engine.
giuliomoro@98 59 // Input and output are given from the audio hardware and the other
giuliomoro@98 60 // ADCs and DACs (if available). If only audio is available, numMatrixFrames
giuliomoro@98 61 // will be 0.
giuliomoro@98 62
giuliomoro@98 63 void render(BeagleRTContext *context, void *userData)
giuliomoro@98 64 {
giuliomoro@183 65 // printf("here\n");
giuliomoro@183 66 static bool init = false;
giuliomoro@183 67 if(init == false){
giuliomoro@183 68 BeagleRT_scheduleAuxiliaryTask(updatePll);
giuliomoro@183 69 // gAudioCodec->setPllP(2);
giuliomoro@183 70 // gAudioCodec->setPllR();
giuliomoro@183 71 // gAudioCodec->setAudioSamplingRate(43600);
giuliomoro@183 72 // printf("samplingRate: %f, k: %f\n", gAudioCodec->getAudioSamplingRate(), gAudioCodec->getPllK());
giuliomoro@183 73 init = true;
giuliomoro@183 74 }
giuliomoro@98 75 static int count=0;
giuliomoro@98 76 static float lfoPhase=0;
giuliomoro@98 77 static float feedback=0;
giuliomoro@183 78 int updateRate=1;
giuliomoro@183 79 if((count&(updateRate-1))==0){
giuliomoro@183 80 float amplitude = 8000;
giuliomoro@183 81 float rate = 2;
giuliomoro@98 82 lfoPhase+=rate*2*M_PI*updateRate*context->analogFrames/context->audioSampleRate;
giuliomoro@98 83 D=amplitude+amplitude*sinf(lfoPhase);
giuliomoro@98 84 if((count&255)==0){
giuliomoro@183 85 // rt_printf("frequency: %f\n", gAudioCodec->getAudioSamplingRate());
giuliomoro@183 86 // rt_printf("D: %.0f\n", D);
giuliomoro@183 87 // rt_printf("rate: %f\n", rate);
giuliomoro@183 88 // rt_printf("amplitude: %.3f\n", amplitude);
giuliomoro@183 89 // rt_printf("feedback: %.3f\n\n", feedback);
giuliomoro@98 90 }
giuliomoro@98 91 }
giuliomoro@98 92 count++;
giuliomoro@98 93
giuliomoro@98 94 for(unsigned int n = 0; n < context->audioFrames; n++) {
giuliomoro@183 95 feedback = 0.4;
giuliomoro@183 96 float input = audioReadFrame(context, n, 0) + audioReadFrame(context, n, 1);
giuliomoro@183 97 delay[writePointer++] = input + delay[readPointer]*feedback;
giuliomoro@183 98 float output = (input + 0.9*delay[readPointer++] ) * 0.5;
giuliomoro@183 99 audioWriteFrame(context, n, 0, output);
giuliomoro@183 100 audioWriteFrame(context, n, 1, output);
giuliomoro@98 101 if(writePointer>=delayLength)
giuliomoro@98 102 writePointer-=delayLength;
giuliomoro@98 103 if(readPointer>=delayLength)
giuliomoro@98 104 readPointer-=delayLength;
giuliomoro@98 105
giuliomoro@98 106 gPhase1 += 2.0 * M_PI * gFrequency1 * gInverseSampleRate;
giuliomoro@98 107 gPhase2 += 2.0 * M_PI * gFrequency2 * gInverseSampleRate;
giuliomoro@98 108 if(gPhase1 > 2.0 * M_PI)
giuliomoro@98 109 gPhase1 -= 2.0 * M_PI;
giuliomoro@98 110 if(gPhase2 > 2.0 * M_PI)
giuliomoro@98 111 gPhase2 -= 2.0 * M_PI;
giuliomoro@98 112 }
giuliomoro@98 113 }
giuliomoro@98 114
giuliomoro@98 115 // cleanup_render() is called once at the end, after the audio has stopped.
giuliomoro@98 116 // Release any resources that were allocated in initialise_render().
giuliomoro@98 117
giuliomoro@98 118 void cleanup(BeagleRTContext *context, void *userData)
giuliomoro@98 119 {
giuliomoro@98 120
giuliomoro@98 121 }