QT6 doesn't record audio, only header in WAV file and QWaitCondition::wakeAll(): mutex lock failure
I'm writing a simple application to record audio, unfortunately it doesn't work properly. I have simplified everything as much as possible to make it easier to find errors and still have no success. Unfortunately, I couldn't find any information on the web to help solve the problem.
I compiled the program under Debian 12 (bookworm) and under Windows 10. In both cases I use the official QT environment (6.5.2) downloaded from the QT website.
The program only saves the header of the WAV file, which looks correct.
While running a program on Debian, I get the following message and the program quits unexpectedly:
!started recording from button!
!record status changed:!
QMediaRecorder::RecordingState
!recording stoped!
QUrl("file:///tmp/test")
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
QWaitCondition::wakeAll(): mutex lock failure (Bad argument)
QWaitCondition::wakeAll(): mutex unlock failure (Bad argument)
When launched on Windows, the program gives the following messages but does not close:
!started recording from button!
!record status changed:!
QMediaRecorder::RecordingState
!recording stoped!
QUrl("file://test")
Below is the program code. I will be very grateful for help in solving the problem.
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Creating audioInput
audioInput = new QAudioInput(this);
audioInput->setDevice(QMediaDevices::defaultAudioInput());
// Creating format for simplest WAVE file
formatAudio = new QMediaFormat;
formatAudio->resolveForEncoding(QMediaFormat::NoFlags);
formatAudio->setAudioCodec(QMediaFormat::AudioCodec::Wave);
formatAudio->setFileFormat(QMediaFormat::Wave);
// Creating recorder
recorder = new QMediaRecorder(this);
recorder->setAudioChannelCount(2);
recorder->setAudioSampleRate(48000);
recorder->setMediaFormat(*formatAudio);
// anyone can write to /tmp
// user running this program is in group pulse (for access to soundcard)
recorder->setOutputLocation(QUrl::fromLocalFile("/tmp/test"));
// Creating session
session = new QMediaCaptureSession(this);
session->setAudioInput(audioInput);
session->setRecorder(recorder);
connect(recorder, SIGNAL(recorderStateChanged(QMediaRecorder::RecorderState)), this, SLOT(recStatCh(QMediaRecorder::RecorderState)));
connect(recorder, SIGNAL(errorOccurred(QMediaRecorder::Error,QString)), this, SLOT(recErrOc(QMediaRecorder::Error,QString)));
connect(recorder, SIGNAL(errorChanged()), this, SLOT(recErrCh()));
connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(startRecording()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::stopRecording()
{
recorder->stop();
qInfo() << "Recording stoped";
qInfo() << recorder->outputLocation();
}
void MainWindow::startRecording()
{
qInfo() << "Started recording from button";
recorder->record();
QTimer::singleShot(5000, this, SLOT(stopRecording()));
}
void MainWindow::recErrCh()
{
qInfo() << "recorder: errorChanged()";
}
void MainWindow::recStatCh(QMediaRecorder::RecorderState state)
{
qInfo() << "!record status changed:!";
qInfo() << state;
}
void MainWindow::recErrOc(QMediaRecorder::Error error, const QString &errorString)
{
qInfo() << "!record error occured:!";
qInfo() << error;
qInfo() << errorString;
}
As you can see, I tried to compile the program on two systems. I have verified that the sound card works fine with other programs. I tried to run the application from the QT examples but it didn't work properly either - it looks like this example in the library was not corrected from QT5 to QT6...