Ответ 1
Как заметил Фрэнк, если ваше требование - просто воспроизвести аудиоданные из файла, API более высокого уровня выполнит эту работу и упростит ваш код приложения. Phonon будет одним из вариантов; альтернативно, проект QtMobility предоставляет API QMediaPlayer для высокоуровневых случаев использования.
Учитывая, что вопрос конкретно связан с использованием QIODevice, и что вы упомянули, что чтение из WAV файла было вашим интимным подходом, Я предполагаю, что вам действительно нужен потоковый API, то есть тот, который позволяет клиенту контролировать буферизацию, а не передавать этот элемент управления на абстракцию более высокого уровня, такую как Phonon.
QAudioOutput может использоваться в двух разных режимах, в зависимости от того, какая перегрузка start()
вызывается:
-
"Pull mode":
void QAudioOutput::start(QIODevice *)
В этом режиме QAudioOutput будет извлекать данные из предоставленного QIODevice без дополнительного вмешательства со стороны клиента. Это хороший выбор, если используется QIODevice, который предоставляется Qt (например, QFile, QAbstractSocket и т.д.).
-
"Режим Push":
QIODevice* QAudioOutput::start()
В этом режиме клиент QAudioOutput должен нажать режим на аудиоустройство, вызвав
QIODevice::write()
. Это нужно сделать в цикле, например:qint64 dataRemaining = ... // assign correct value here while (dataRemaining) { qint64 bytesWritten = audioOutput->write(buffer, dataRemaining); dataRemaining -= bytesWritten; buffer += bytesWritten; // Then wait for a short time }
Как ожидание будет реализовано, будет зависеть от контекста вашего приложения - если звук записывается из выделенного потока, он может просто sleep(). В качестве альтернативы, если звук записывается из основного потока, вы, вероятно, захотите, чтобы запись запускалась с помощью QTimer.
Поскольку вы ничего не упоминаете об использовании цикла вокруг вызовов write() в вашем приложении, похоже, что происходит то, что вы пишете короткий сегмент данных (который играет как поп), t пишите.
Вы можете видеть код, используя оба режима в приложении examples/multimedia/audiooutput, которое поставляется с Qt.