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