Переглянути джерело

Change peak detect API to conform to library conventions

dds
PaulStoffregen 10 роки тому
джерело
коміт
5bc41358b6
5 змінених файлів з 72 додано та 60 видалено
  1. +1
    -1
      Audio.h
  2. +10
    -21
      analyze_peak.cpp
  3. +22
    -11
      analyze_peak.h
  4. +15
    -13
      examples/Analysis/MonoPeakMeterAnalog/MonoPeakMeterAnalog.ino
  5. +24
    -14
      examples/Analysis/StereoPeakMeter/StereoPeakMeter.ino

+ 1
- 1
Audio.h Переглянути файл

#include "analyze_fft1024.h" #include "analyze_fft1024.h"
#include "analyze_print.h" #include "analyze_print.h"
#include "analyze_tonedetect.h" #include "analyze_tonedetect.h"
#include "analyze_peakdetect.h"
#include "analyze_peak.h"
#include "control_sgtl5000.h" #include "control_sgtl5000.h"
#include "control_wm8731.h" #include "control_wm8731.h"
#include "effect_chorus.h" #include "effect_chorus.h"

analyze_peakdetect.cpp → analyze_peak.cpp Переглянути файл

* THE SOFTWARE. * THE SOFTWARE.
*/ */


#include "analyze_peakdetect.h"
#include "analyze_peak.h"


void AudioAnalyzePeak::update(void) void AudioAnalyzePeak::update(void)
{ {
audio_block_t *block; audio_block_t *block;
const int16_t *p, *end; const int16_t *p, *end;
int32_t min, max;

block = receiveReadOnly(); block = receiveReadOnly();
if (!block) { if (!block) {
return; return;
} }
if (!m_enabled) {
release(block);
return;
}
p = block->data; p = block->data;
end = p + AUDIO_BLOCK_SAMPLES; end = p + AUDIO_BLOCK_SAMPLES;
min = min_sample;
max = max_sample;
do { do {
int16_t d=*p++; int16_t d=*p++;
if(d<min) min=d;
if(d>max) max=d;
if (d<min) min=d;
if (d>max) max=d;
} while (p < end); } while (p < end);
min_sample = min;
max_sample = max;
new_output = true;
release(block); release(block);
} }


void AudioAnalyzePeak::begin(bool noReset)
{
if(!noReset)
{
min=32767;
max=-32767;
}
m_enabled=true;
}
uint16_t AudioAnalyzePeak::Dpp(void)
{
if(max>min) return max-min; else return 0;
}


analyze_peakdetect.h → analyze_peak.h Переглянути файл



#include "AudioStream.h" #include "AudioStream.h"


// TODO: this needs to be renamed to AudioAnalyzePeak
class AudioAnalyzePeak : public AudioStream class AudioAnalyzePeak : public AudioStream
{ {
public: public:
AudioAnalyzePeak(void) : AudioStream(1, inputQueueArray) { }

AudioAnalyzePeak(void) : AudioStream(1, inputQueueArray) {
min_sample = 32767;
max_sample = -32768;
}
bool available(void) {
__disable_irq();
bool flag = new_output;
if (flag) new_output = false;
__enable_irq();
return flag;
}
float read(void) {
__disable_irq();
int diff = max_sample - min_sample;
min_sample = 32767;
max_sample = -32768;
__enable_irq();
return diff / 65535.0;
}
virtual void update(void); virtual void update(void);

void begin(bool noReset);
void begin(void) { begin(false); }
void stop(void) { m_enabled=false; }
uint16_t Dpp(void);
private: private:
audio_block_t *inputQueueArray[1]; audio_block_t *inputQueueArray[1];
bool m_enabled;
int16_t max;
int16_t min;
volatile bool new_output;
int16_t min_sample;
int16_t max_sample;
}; };


#endif #endif

+ 15
- 13
examples/Analysis/MonoPeakMeterAnalog/MonoPeakMeterAnalog.ino Переглянути файл

#include <SPI.h> #include <SPI.h>
#include <SD.h> #include <SD.h>


const int myInput = AUDIO_INPUT_LINEIN;
// const int myInput = AUDIO_INPUT_MIC;

AudioInputAnalog audioInput(A0); // A0 is pin 14, feel free to change. AudioInputAnalog audioInput(A0); // A0 is pin 14, feel free to change.
AudioAnalyzePeak peak_M;
AudioAnalyzePeak peak;
AudioOutputAnalog audioOutput; // DAC pin. AudioOutputAnalog audioOutput; // DAC pin.


AudioConnection c1(audioInput,peak_M);
AudioConnection c1(audioInput,peak);
AudioConnection c2(audioInput,audioOutput); AudioConnection c2(audioInput,audioOutput);


void setup() { void setup() {
AudioMemory(4); AudioMemory(4);
Serial.begin(Serial.baud());
Serial.begin(9600);
} }


// for best effect make your terminal/monitor a minimum of 31 chars wide and as high as you can.

elapsedMillis fps; elapsedMillis fps;


void loop() { void loop() {
if(fps>24) { // for best effect make your terminal/monitor a minimum of 31 chars wide and as high as you can.
Serial.println();
fps=0;
uint8_t monoPeak=peak_M.Dpp()/2184.5321;
Serial.print("|");
for(uint8_t cnt=0;cnt<monoPeak;cnt++) Serial.print(">");
peak_M.begin();
if (fps > 24) {
if (peak.available()) {
fps = 0;
uint8_t monoPeak = peak.read() * 30.0;
Serial.print("|");
for (uint8_t cnt=0;cnt<monoPeak;cnt++) {
Serial.print(">");
}
Serial.println();
}
} }
} }

+ 24
- 14
examples/Analysis/StereoPeakMeter/StereoPeakMeter.ino Переглянути файл

audioShield.inputSelect(myInput); audioShield.inputSelect(myInput);
audioShield.volume(0.75); audioShield.volume(0.75);
audioShield.unmuteLineout(); audioShield.unmuteLineout();
Serial.begin(Serial.baud());
Serial.begin(9600);
} }


// for best effect make your terminal/monitor a minimum of 62 chars wide and as high as you can.

elapsedMillis fps; elapsedMillis fps;
uint8_t cnt=0; uint8_t cnt=0;


void loop() { void loop() {
if(fps>24) { // for best effect make your terminal/monitor a minimum of 62 chars wide and as high as you can.
Serial.println();
fps=0;
uint8_t leftPeak=peak_L.Dpp()/2184.5321; // 65536 / 2184.5321 ~ 30.
for(cnt=0;cnt<30-leftPeak;cnt++) Serial.print(" ");
while(cnt++<30) Serial.print("<");
Serial.print("||");
uint8_t rightPeak=peak_R.Dpp()/2184.5321;
for(cnt=0;cnt<rightPeak;cnt++) Serial.print(">");
while(cnt++<30) Serial.print(" ");
peak_L.begin(); // no need to call .stop if all you want
peak_R.begin(); // is to zero it.
if(fps > 24) {
if (peak_L.available() && peak_R.available()) {
fps=0;
uint8_t leftPeak=peak_L.read() * 30.0;
uint8_t rightPeak=peak_R.read() * 30.0;

for(cnt=0;cnt<30-leftPeak;cnt++) {
Serial.print(" ");
}
while(cnt++<30) {
Serial.print("<");
}
Serial.print("||");
for(cnt=0;cnt<rightPeak;cnt++) {
Serial.print(">");
}
while(cnt++<30) {
Serial.print(" ");
}
Serial.println();
}
} }
} }

Завантаження…
Відмінити
Зберегти