aiie/teensy/teensy-speaker.cpp

66 lines
1.3 KiB
C++
Raw Normal View History

2017-02-20 18:55:16 +00:00
#include <Arduino.h>
#include "teensy-speaker.h"
2017-02-27 01:34:38 +00:00
#include "globals.h"
2017-02-20 18:55:16 +00:00
TeensySpeaker::TeensySpeaker(uint8_t pinNum) : PhysicalSpeaker()
{
toggleState = false;
2017-02-20 18:55:16 +00:00
speakerPin = pinNum;
pinMode(speakerPin, OUTPUT); // analog speaker output, used as digital volume control
mixerValue = numMixed = 0;
toggleCount = toggleReadPtr = toggleWritePtr = 0;
2017-02-20 18:55:16 +00:00
}
TeensySpeaker::~TeensySpeaker()
{
}
void TeensySpeaker::toggle(uint32_t c)
2017-02-20 18:55:16 +00:00
{
toggleTimes[toggleWritePtr] = c;
if (toggleCount < SPEAKERQUEUESIZE-1) {
toggleWritePtr++;
if (toggleWritePtr >= SPEAKERQUEUESIZE)
toggleWritePtr = 0;
toggleCount++;
} else {
// speaker overflow
Serial.println("spkr overflow");
}
2017-02-20 18:55:16 +00:00
}
void TeensySpeaker::maintainSpeaker(uint32_t c)
{
bool didChange = false;
while (toggleCount && c >= toggleTimes[toggleReadPtr]) {
toggleState = !toggleState;
toggleCount--;
toggleReadPtr++;
if (toggleReadPtr >= SPEAKERQUEUESIZE)
toggleReadPtr = 0;
didChange = true;
2017-02-20 18:55:16 +00:00
}
if (didChange) {
mixerValue = (toggleState ? 0x1FF : 0x00);
mixerValue >>= (16-g_volume);
// FIXME: glad it's DAC0 and all, but... how does that relate to the pin passed in the constructor?
analogWriteDAC0(mixerValue);
}
2017-02-20 18:55:16 +00:00
}
2017-02-24 15:15:17 +00:00
void TeensySpeaker::beginMixing()
2017-02-24 15:15:17 +00:00
{
// unused
2017-02-24 15:15:17 +00:00
}
void TeensySpeaker::mixOutput(uint8_t v)
{
// unused
}