Qt 5.1 или позже:
Мне нужно воспроизвести звук уведомления с частотой x в течение n миллисекунд. Также было бы неплохо, если бы я мог комбинировать тоны вроде этого: 1000 Гц в течение 2 секунд, затем 3000 Гц в течение 1 секунды, ..
Самый простой способ — использовать файлы (WAV, MP3, ..), например, как описано здесь: Как играть звук с Qt Но тогда я должен создать такие файлы для каждого из моих сценариев.
Пример вывода звука Qt генерирует такие тоны в памяти ( Generator::generateData(const QAudioFormat &format, qint64 durationUs, int sampleRate)
). Я мог бы написать такой генератор для моих целей. Но должен ли я?
Так какой же самый простой способ воспроизвести частоту x в течение n миллисекунд?
Чтобы сгенерировать тон в Qt, мы можем передать наш собственный QBuffer в QAudioOutput для воспроизведения.
Посмотрите на первый пример на странице QAudioOutput.
То, что я сделал, было создать мою форму волны в QByteArray.
Помни что sin(2 * pi * frequency * i / sample_rate)
даст вам греховный тон желаемой частоты:
#define FREQ_CONST ((2.0 * M_PI) / SAMPLE_RATE)
QByteArray* bytebuf = new QByteArray();
buf->resize(seconds * SAMPLE_RATE);
for (int i=0; i<(seconds * SAMPLE_RATE); i++) {
qreal t = (qreal)(freq * i);
t = t * FREQ_CONST;
t = qSin(t);
// now we normalize t
t *= TG_MAX_VAL;
(*bytebuf)[i] = (quint8)t;
}
Затем мы можем взять этот буфер и сделать что-то вроде этого, чтобы воспроизвести его:
// Make a QBuffer from our QByteArray
QBuffer* input = new QBuffer(bytebuf);
input->open(QIODevice::ReadOnly);
// Create an output with our premade QAudioFormat (See example in QAudioOutput)
QAudioOutput* audio = new QAudioOutput(format, this);
audio->start(input);
Если вам нужно больше примеров кода, вы можете увидеть, как я это сделал в небольшом проекте, который я только начал Вот.
Вы можете использовать пакет «window.h» (не пакет QT).
Тогда вы просто используете звуковой сигнал (частота, миллисекунды).
Для вашего примера это должны быть Beep (1000, 2000) и Beep (3000, 1000) соответственно.