Changed SoundGenerator to use BlackMisc::PhysicalQuantities instead of integer types (req. by RW)

lengthPerTone renamed to bytesPerTone
This commit is contained in:
Klaus Basan
2014-02-07 03:10:32 +01:00
parent c46878b873
commit 27db22cb44
2 changed files with 22 additions and 10 deletions

View File

@@ -80,10 +80,10 @@ namespace BlackSound
foreach(Tone t, this->m_tones) 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; int sampleIndexPerTone = 0;
while (lengthPerTone) while (bytesPerTone)
{ {
// http://hyperphysics.phy-astr.gsu.edu/hbase/audio/sumdif.html // 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 // 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; bufferPointer += bytesPerSample;
lengthPerTone -= bytesPerSample; bytesPerTone -= bytesPerSample;
} }
++sampleIndexPerTone; ++sampleIndexPerTone;
} }
@@ -253,9 +253,10 @@ namespace BlackSound
{ {
QList<CFrequency> frequencies = selcal.getFrequencies(); QList<CFrequency> frequencies = selcal.getFrequencies();
Q_ASSERT(frequencies.size() == 4); Q_ASSERT(frequencies.size() == 4);
Tone t1(frequencies.at(0).value(CFrequencyUnit::Hz()), frequencies.at(1).value(CFrequencyUnit::Hz()), 1000); const BlackMisc::PhysicalQuantities::CTime oneSec(1000.0, BlackMisc::PhysicalQuantities::CTimeUnit::ms());
Tone t2(0, 200); Tone t1(frequencies.at(0), frequencies.at(1), oneSec);
Tone t3(frequencies.at(2).value(CFrequencyUnit::Hz()), frequencies.at(3).value(CFrequencyUnit::Hz()), 1000); Tone t2(CFrequency(), oneSec / 5.0);
Tone t3(frequencies.at(2), frequencies.at(3), oneSec);
tones << t1 << t2 << t3; tones << t1 << t2 << t3;
} }
return CSoundGenerator::playSignal(volume, tones, device); return CSoundGenerator::playSignal(volume, tones, device);

View File

@@ -8,6 +8,7 @@
#include "blackmisc/avselcal.h" #include "blackmisc/avselcal.h"
#include "blackmisc/vaudiodevice.h" #include "blackmisc/vaudiodevice.h"
#include "blackmisc/pqtime.h"
#include <QIODevice> #include <QIODevice>
#include <QAudioFormat> #include <QAudioFormat>
@@ -41,19 +42,29 @@ namespace BlackSound
*/ */
struct Tone struct Tone
{ {
friend class CSoundGenerator;
private:
int m_frequencyHz; /*!< first tone's frequency, use 0 for silence */ int m_frequencyHz; /*!< first tone's frequency, use 0 for silence */
int m_secondaryFrequencyHz; /*!< second tone's frequency, or 0 */ int m_secondaryFrequencyHz; /*!< second tone's frequency, or 0 */
qint64 m_durationMs; /*!< How long to play */ qint64 m_durationMs; /*!< How long to play */
public:
/*! /*!
* \brief Play frequency f for t milliseconds * \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<int>(frequency.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::Hz()))),
m_secondaryFrequencyHz(0),
m_durationMs(static_cast<qint64>(duration.valueRounded(BlackMisc::PhysicalQuantities::CTimeUnit::ms()))) {}
/*! /*!
* \brief Play 2 frequencies f for t milliseconds * \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<int>(frequency.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::Hz()))),
m_secondaryFrequencyHz(static_cast<int>(secondaryFrequency.valueRounded(BlackMisc::PhysicalQuantities::CFrequencyUnit::Hz()))),
m_durationMs(static_cast<qint64>(duration.valueRounded(BlackMisc::PhysicalQuantities::CTimeUnit::ms()))) {}
}; };
/*! /*!
@@ -185,9 +196,9 @@ namespace BlackSound
/*! /*!
* \brief One cycle of tones takes t milliseconds * \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: signals: