Я использую Qt 4.8 с Qt Creator 2.4.1 на Windows 7 Ultimate x64.
Я беру аудиовход, используя класс QAudioInput
, и воспроизводю его, используя QAudioOutput
. Имеется 2-секундный тайм-аут, после которого я прекращаю принимать данные, а затем настраиваю выход следующим образом:
class MainWindow
{
// ...
QByteArray output_data;
QBuffer output_data_buffer;
QAudioOutput *audio_out;
// ...
};
MainWindow::MainWindow(QWidget *parent)
{
// ...
output_data_buffer.setBuffer(&output_data);
// ...
}
void MainWindow::audioInputStopped(QByteArray data)
{
output_data = data;
output_data_buffer.open(QIODevice::ReadOnly);
audio_out = new QAudioOutput(audio_format, this);
connect(audio_out, SIGNAL(stateChanged(QAudio::State)),
SLOT(audioOutputStateChanged(QAudio::State)));
audio_out->start(&output_data_buffer);
}
Используемый мной аудиоформат поддерживается как устройствами ввода, так и вывода. Я проверил их, используя QAudioDeviceInfo::isFormatSupported()
. 2-секундный звук (data
in audioInputStopped()
) всегда воспроизводится нормально.
В слоте audioOutputStateChanged
я всегда сталкиваюсь с ошибкой QAudio::UnderrunError
от audio_out->error()
после завершения воспроизведения буфера. После вызова audio_out->start()
состояние (переданное как параметр в audioOutputStateChanged()
) и ошибка выглядят следующим образом:
- Нет ошибок. Активное состояние.
- Нет ошибок. Остановленное состояние.
- Ошибка опустошения. Состояние бездействия.
Обратите внимание, что я останавливаю audio_out
в состоянии ожидания , следуя этому примеру . Почему в коде обнаружена ошибка опустошения? Это нормально?