119 qint32 sampleIndex = 0, qreal frequency = 500,
122 if (!format.isValid())
125 const qint32 length = format.bytesForDuration(duration.count());
127 QByteArray data(format.bytesForDuration(duration.count()), Qt::Uninitialized);
128 unsigned char *ptr =
reinterpret_cast<
unsigned char *>(data.data());
129 const auto end = ptr + length;
131 auto writeNextFrame = [&](
auto value) {
132 Q_ASSERT(
sizeof(value) == format.bytesPerSample());
133 *
reinterpret_cast<
decltype(value) *>(ptr) = value;
134 ptr +=
sizeof(value);
137 const double initialPhase = 2.0 *
M_PI * frequency * sampleIndex / format.sampleRate();
138 SineWaveSignal generator(frequency, format.sampleRate(), initialPhase);
139 for (
double rawSample : generator) {
142 const qreal x = rawSample * volume;
143 for (
int ch = 0; ch < format.channelCount(); ++ch) {
144 switch (format.sampleFormat()) {
145 case QAudioFormat::UInt8:
146 writeNextFrame(
static_cast<quint8>(std::round((1.0 + x) / 2 * 255)));
148 case QAudioFormat::Int16:
150 static_cast<qint16>(std::round(x * std::numeric_limits<qint16>::max())));
152 case QAudioFormat::Int32:
154 static_cast<qint32>(std::round(x * std::numeric_limits<qint32>::max())));
156 case QAudioFormat::Float:
157 writeNextFrame(
static_cast<
float>(x));
159 case QAudioFormat::Unknown:
160 case QAudioFormat::NSampleFormats:
166 Q_ASSERT(ptr == end);