diff --git a/src/blacksound/soundgenerator.cpp b/src/blacksound/soundgenerator.cpp index 1ae6d6a30..853e97c61 100644 --- a/src/blacksound/soundgenerator.cpp +++ b/src/blacksound/soundgenerator.cpp @@ -80,10 +80,10 @@ namespace BlackSound foreach(Tone t, this->m_tones) { - qint64 lengthPerTone = this->m_audioFormat.sampleRate() * bytesForAllChannels * t.m_durationMs / 1000; + qint64 bytesPerTone = this->m_audioFormat.sampleRate() * bytesForAllChannels * t.m_durationMs / 1000; int sampleIndexPerTone = 0; - while (lengthPerTone) + while (bytesPerTone) { // http://hyperphysics.phy-astr.gsu.edu/hbase/audio/sumdif.html // http://math.stackexchange.com/questions/164369/how-do-you-calculate-the-frequency-perceived-by-humans-of-two-sinusoidal-waves-a @@ -130,7 +130,7 @@ namespace BlackSound } bufferPointer += bytesPerSample; - lengthPerTone -= bytesPerSample; + bytesPerTone -= bytesPerSample; } ++sampleIndexPerTone; } @@ -253,9 +253,10 @@ namespace BlackSound { QList frequencies = selcal.getFrequencies(); Q_ASSERT(frequencies.size() == 4); - Tone t1(frequencies.at(0).value(CFrequencyUnit::Hz()), frequencies.at(1).value(CFrequencyUnit::Hz()), 1000); - Tone t2(0, 200); - Tone t3(frequencies.at(2).value(CFrequencyUnit::Hz()), frequencies.at(3).value(CFrequencyUnit::Hz()), 1000); + const BlackMisc::PhysicalQuantities::CTime oneSec(1000.0, BlackMisc::PhysicalQuantities::CTimeUnit::ms()); + Tone t1(frequencies.at(0), frequencies.at(1), oneSec); + Tone t2(CFrequency(), oneSec / 5.0); + Tone t3(frequencies.at(2), frequencies.at(3), oneSec); tones << t1 << t2 << t3; } return CSoundGenerator::playSignal(volume, tones, device); diff --git a/src/blacksound/soundgenerator.h b/src/blacksound/soundgenerator.h index c197e5f71..753aa76c8 100644 --- a/src/blacksound/soundgenerator.h +++ b/src/blacksound/soundgenerator.h @@ -8,6 +8,7 @@ #include "blackmisc/avselcal.h" #include "blackmisc/vaudiodevice.h" +#include "blackmisc/pqtime.h" #include #include @@ -41,19 +42,29 @@ namespace BlackSound */ struct Tone { + friend class CSoundGenerator; + + private: int m_frequencyHz; /*!< first tone's frequency, use 0 for silence */ int m_secondaryFrequencyHz; /*!< second tone's frequency, or 0 */ qint64 m_durationMs; /*!< How long to play */ + public: /*! * \brief Play frequency f for t milliseconds */ - Tone(int frequencyHz, qint64 durationMs) : m_frequencyHz(frequencyHz), m_secondaryFrequencyHz(0), m_durationMs(durationMs) {} + Tone(const BlackMisc::PhysicalQuantities::CFrequency &frequency, const BlackMisc::PhysicalQuantities::CTime &duration) : + m_frequencyHz(static_cast(frequency.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::Hz()))), + m_secondaryFrequencyHz(0), + m_durationMs(static_cast(duration.valueRounded(BlackMisc::PhysicalQuantities::CTimeUnit::ms()))) {} /*! * \brief Play 2 frequencies f for t milliseconds */ - Tone(int frequencyHz, int secondaryFrequencyHz, qint64 durationMs) : m_frequencyHz(frequencyHz), m_secondaryFrequencyHz(secondaryFrequencyHz), m_durationMs(durationMs) {} + Tone(const BlackMisc::PhysicalQuantities::CFrequency &frequency, const BlackMisc::PhysicalQuantities::CFrequency &secondaryFrequency, const BlackMisc::PhysicalQuantities::CTime &duration) : + m_frequencyHz(static_cast(frequency.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::Hz()))), + m_secondaryFrequencyHz(static_cast(secondaryFrequency.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::Hz()))), + m_durationMs(static_cast(duration.valueRounded(BlackMisc::PhysicalQuantities::CTimeUnit::ms()))) {} }; /*! @@ -185,9 +196,9 @@ namespace BlackSound /*! * \brief One cycle of tones takes t milliseconds */ - qint64 oneCycleDurationMs() const + BlackMisc::PhysicalQuantities::CTime oneCycleDurationMs() const { - return this->m_oneCycleDurationMs; + return BlackMisc::PhysicalQuantities::CTime(this->m_oneCycleDurationMs, BlackMisc::PhysicalQuantities::CTimeUnit::ms()); } signals: