diff --git a/src/audio/FreqPlayer.cpp b/src/audio/FreqPlayer.cpp index 7e8a917..b239a0f 100644 --- a/src/audio/FreqPlayer.cpp +++ b/src/audio/FreqPlayer.cpp @@ -26,7 +26,7 @@ template FreqPlayer::FreqPlayer(int _rate): volume(0.5), rate(_rate), n_frame(0), - waveform(W_SINUS) + waveform(W_TRIANGLE) { k = K(); k_update = -1; // invalid: don't update @@ -68,13 +68,31 @@ template double FreqPlayer::radius() template sample_t FreqPlayer::AudioFrame() { + double r = radius(); + double v; + switch (waveform) { case W_SINUS: - return (double) sin(radius()) * max() * volume; + v = sin(r); + break; + + case W_TRIANGLE: + r = fmod(r, M_PI * 2); + + if (r <= M_PI / 2) v = r; + else if (r <= M_PI * 1.5) v = M_PI - r; + else v = r - M_PI * 2; + + v /= (M_PI / 2); + break; + default: - return 0; + v = 0; + break; } + + return v * max() * volume; } template void FreqPlayer::WriteAudio(sample_t *out, int nb_frame, bool stop) diff --git a/src/audio/FreqPlayer.hpp b/src/audio/FreqPlayer.hpp index 7fecb28..6099129 100644 --- a/src/audio/FreqPlayer.hpp +++ b/src/audio/FreqPlayer.hpp @@ -27,7 +27,7 @@ template class FreqPlayer { public: /// waveform style - enum WAVEFORM { W_SINUS }; + enum WAVEFORM { W_SINUS, W_TRIANGLE }; private: /// current frequency