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()
|
|
|
|
{
|
2017-02-26 16:00:41 +00:00
|
|
|
toggleState = false;
|
2017-02-20 18:55:16 +00:00
|
|
|
speakerPin = pinNum;
|
|
|
|
pinMode(speakerPin, OUTPUT); // analog speaker output, used as digital volume control
|
2017-02-26 16:00:41 +00:00
|
|
|
mixerValue = numMixed = 0;
|
2017-12-31 22:21:34 +00:00
|
|
|
|
|
|
|
toggleCount = toggleReadPtr = toggleWritePtr = 0;
|
2017-02-20 18:55:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TeensySpeaker::~TeensySpeaker()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-12-31 22:21:34 +00:00
|
|
|
void TeensySpeaker::toggle(uint32_t c)
|
2017-02-20 18:55:16 +00:00
|
|
|
{
|
2017-12-31 22:21:34 +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)
|
|
|
|
{
|
2017-12-31 22:21:34 +00:00
|
|
|
bool didChange = false;
|
|
|
|
|
|
|
|
while (toggleCount && c >= toggleTimes[toggleReadPtr]) {
|
2017-02-26 16:00:41 +00:00
|
|
|
toggleState = !toggleState;
|
2017-12-31 22:21:34 +00:00
|
|
|
toggleCount--;
|
|
|
|
toggleReadPtr++;
|
|
|
|
if (toggleReadPtr >= SPEAKERQUEUESIZE)
|
|
|
|
toggleReadPtr = 0;
|
|
|
|
didChange = true;
|
2017-02-20 18:55:16 +00:00
|
|
|
}
|
2017-02-26 16:00:41 +00:00
|
|
|
|
2017-12-31 22:21:34 +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
|
|
|
|
2017-02-26 16:00:41 +00:00
|
|
|
void TeensySpeaker::beginMixing()
|
2017-02-24 15:15:17 +00:00
|
|
|
{
|
2017-12-31 22:21:34 +00:00
|
|
|
// unused
|
2017-02-24 15:15:17 +00:00
|
|
|
}
|
2017-02-26 16:00:41 +00:00
|
|
|
|
|
|
|
void TeensySpeaker::mixOutput(uint8_t v)
|
|
|
|
{
|
2017-12-31 22:21:34 +00:00
|
|
|
// unused
|
2017-02-26 16:00:41 +00:00
|
|
|
}
|
|
|
|
|