26inline QByteArray createSineWaveData(
const QAudioFormat &format, std::chrono::microseconds duration,
27 qint32 sampleIndex = 0, qreal frequency = 500,
30 if (!format.isValid())
33 const qint32 length = format.bytesForDuration(duration.count());
35 QByteArray data(format.bytesForDuration(duration.count()), Qt::Uninitialized);
36 unsigned char *ptr =
reinterpret_cast<
unsigned char *>(data.data());
37 const auto end = ptr + length;
39 auto writeNextFrame = [&](
auto value) {
40 Q_ASSERT(
sizeof(value) == format.bytesPerSample());
41 *
reinterpret_cast<
decltype(value) *>(ptr) = value;
45 for (; ptr < end; ++sampleIndex) {
46 const qreal x = sin(2 * M_PI * frequency * sampleIndex / format.sampleRate()) * volume;
47 for (
int ch = 0; ch < format.channelCount(); ++ch) {
48 switch (format.sampleFormat()) {
49 case QAudioFormat::UInt8:
50 writeNextFrame(
static_cast<quint8>(std::round((1.0 + x) / 2 * 255)));
52 case QAudioFormat::Int16:
54 static_cast<qint16>(std::round(x * std::numeric_limits<qint16>::max())));
56 case QAudioFormat::Int32:
58 static_cast<qint32>(std::round(x * std::numeric_limits<qint32>::max())));
60 case QAudioFormat::Float:
61 writeNextFrame(
static_cast<
float>(x));
63 case QAudioFormat::Unknown:
64 case QAudioFormat::NSampleFormats: