12#include <QAudioFormat>
33 fmt.setSampleRate(SampleRate);
34 fmt.setChannelCount(1);
35 fmt.setSampleFormat(QAudioFormat::Int16);
49 qint64
bytesAvailable()
const override {
return SampleRate * BytesPerSample; }
55 return open(QIODevice::ReadOnly);
60 qint64
readData(
char *data, qint64 maxSize)
override
62 constexpr double twoPi = 2.0 * M_PI;
63 const double increment = m_frequency / SampleRate;
65 const qint64 samples = maxSize / BytesPerSample;
67 for (qint64 i = 0; i < samples; ++i) {
73 const qint16 sample =
static_cast<qint16
>(Amplitude * std::sin(twoPi * m_phase));
74 std::memcpy(data + i * BytesPerSample, &sample,
sizeof(sample));
81 return samples * BytesPerSample;
85 qint64
writeData(
const char *, qint64)
override {
return -1; }
88 static constexpr int SampleRate = 44100;
89 static constexpr int BytesPerSample =
sizeof(qint16);
90 static constexpr double Amplitude = 28000.0;
92 double m_frequency = 1047.0;
static QAudioFormat format()
Returns the QAudioFormat matching this generator's output.
void setFrequency(double hz)
Sets the tone frequency in Hz.
ToneGenerator(QObject *parent=nullptr)
qint64 bytesAvailable() const override
Reports available data so QAudioSink knows to pull from this device.
qint64 writeData(const char *, qint64) override
Writing is not supported.
bool start()
Starts the device for reading.
double frequency() const
Returns the current frequency in Hz.
qint64 readData(char *data, qint64 maxSize) override
Fills data with maxSize bytes of PCM sine-wave samples.
bool isSequential() const override
This is a sequential (non-seekable) device.