Воспроизвести уведомление (частота х) звука в Qt — самый простой способ?

Qt 5.1 или позже:

Мне нужно воспроизвести звук уведомления с частотой x в течение n миллисекунд. Также было бы неплохо, если бы я мог комбинировать тоны вроде этого: 1000 Гц в течение 2 секунд, затем 3000 Гц в течение 1 секунды, ..

Самый простой способ — использовать файлы (WAV, MP3, ..), например, как описано здесь: Как играть звук с Qt Но тогда я должен создать такие файлы для каждого из моих сценариев.

Пример вывода звука Qt генерирует такие тоны в памяти ( Generator::generateData(const QAudioFormat &format, qint64 durationUs, int sampleRate) ). Я мог бы написать такой генератор для моих целей. Но должен ли я?

Так какой же самый простой способ воспроизвести частоту x в течение n миллисекунд?

0

Решение

Чтобы сгенерировать тон в 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);

Если вам нужно больше примеров кода, вы можете увидеть, как я это сделал в небольшом проекте, который я только начал Вот.

1

Другие решения

Вы можете использовать пакет «window.h» (не пакет QT).
Тогда вы просто используете звуковой сигнал (частота, миллисекунды).
Для вашего примера это должны быть Beep (1000, 2000) и Beep (3000, 1000) соответственно.

1

По вопросам рекламы [email protected]