Improve audiorecorder example.
- Show actual recording location - Update control buttons depending on the recorder state instead of the status - Create audio levels using the actual audio format from the audio buffers. The format from the QMediaRecorder might not always contain the value actually used. Task-number: QTBUG-36154 Change-Id: I418b4472b0d984f47efb1a1813da6ef440ba9a40 Reviewed-by: Christian Stromme <christian.stromme@digia.com>
This commit is contained in:
@@ -114,6 +114,8 @@ AudioRecorder::AudioRecorder(QWidget *parent) :
|
|||||||
SLOT(updateProgress(qint64)));
|
SLOT(updateProgress(qint64)));
|
||||||
connect(audioRecorder, SIGNAL(statusChanged(QMediaRecorder::Status)), this,
|
connect(audioRecorder, SIGNAL(statusChanged(QMediaRecorder::Status)), this,
|
||||||
SLOT(updateStatus(QMediaRecorder::Status)));
|
SLOT(updateStatus(QMediaRecorder::Status)));
|
||||||
|
connect(audioRecorder, SIGNAL(stateChanged(QMediaRecorder::State)),
|
||||||
|
this, SLOT(onStateChanged(QMediaRecorder::State)));
|
||||||
connect(audioRecorder, SIGNAL(error(QMediaRecorder::Error)), this,
|
connect(audioRecorder, SIGNAL(error(QMediaRecorder::Error)), this,
|
||||||
SLOT(displayErrorMessage()));
|
SLOT(displayErrorMessage()));
|
||||||
}
|
}
|
||||||
@@ -138,47 +140,44 @@ void AudioRecorder::updateStatus(QMediaRecorder::Status status)
|
|||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case QMediaRecorder::RecordingStatus:
|
case QMediaRecorder::RecordingStatus:
|
||||||
if (audioLevels.count() != audioRecorder->audioSettings().channelCount()) {
|
statusMessage = tr("Recording to %1").arg(audioRecorder->actualLocation().toString());
|
||||||
qDeleteAll(audioLevels);
|
|
||||||
audioLevels.clear();
|
|
||||||
for (int i = 0; i < audioRecorder->audioSettings().channelCount(); ++i) {
|
|
||||||
QAudioLevel *level = new QAudioLevel(ui->centralwidget);
|
|
||||||
audioLevels.append(level);
|
|
||||||
ui->levelsLayout->addWidget(level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->recordButton->setText(tr("Stop"));
|
|
||||||
ui->pauseButton->setText(tr("Pause"));
|
|
||||||
if (audioRecorder->outputLocation().isEmpty())
|
|
||||||
statusMessage = tr("Recording");
|
|
||||||
else
|
|
||||||
statusMessage = tr("Recording to %1").arg(
|
|
||||||
audioRecorder->outputLocation().toString());
|
|
||||||
break;
|
break;
|
||||||
case QMediaRecorder::PausedStatus:
|
case QMediaRecorder::PausedStatus:
|
||||||
clearAudioLevels();
|
clearAudioLevels();
|
||||||
ui->recordButton->setText(tr("Stop"));
|
|
||||||
ui->pauseButton->setText(tr("Resume"));
|
|
||||||
statusMessage = tr("Paused");
|
statusMessage = tr("Paused");
|
||||||
break;
|
break;
|
||||||
case QMediaRecorder::UnloadedStatus:
|
case QMediaRecorder::UnloadedStatus:
|
||||||
case QMediaRecorder::LoadedStatus:
|
case QMediaRecorder::LoadedStatus:
|
||||||
clearAudioLevels();
|
clearAudioLevels();
|
||||||
ui->recordButton->setText(tr("Record"));
|
|
||||||
ui->pauseButton->setText(tr("Pause"));
|
|
||||||
statusMessage = tr("Stopped");
|
statusMessage = tr("Stopped");
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ui->pauseButton->setEnabled(audioRecorder->state()
|
|
||||||
!= QMediaRecorder::StoppedState);
|
|
||||||
|
|
||||||
if (audioRecorder->error() == QMediaRecorder::NoError)
|
if (audioRecorder->error() == QMediaRecorder::NoError)
|
||||||
ui->statusbar->showMessage(statusMessage);
|
ui->statusbar->showMessage(statusMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioRecorder::onStateChanged(QMediaRecorder::State state)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case QMediaRecorder::RecordingState:
|
||||||
|
ui->recordButton->setText(tr("Stop"));
|
||||||
|
ui->pauseButton->setText(tr("Pause"));
|
||||||
|
break;
|
||||||
|
case QMediaRecorder::PausedState:
|
||||||
|
ui->recordButton->setText(tr("Stop"));
|
||||||
|
ui->pauseButton->setText(tr("Resume"));
|
||||||
|
break;
|
||||||
|
case QMediaRecorder::StoppedState:
|
||||||
|
ui->recordButton->setText(tr("Record"));
|
||||||
|
ui->pauseButton->setText(tr("Pause"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->pauseButton->setEnabled(audioRecorder->state() != QMediaRecorder::StoppedState);
|
||||||
|
}
|
||||||
|
|
||||||
static QVariant boxValue(const QComboBox *box)
|
static QVariant boxValue(const QComboBox *box)
|
||||||
{
|
{
|
||||||
int idx = box->currentIndex();
|
int idx = box->currentIndex();
|
||||||
@@ -347,6 +346,16 @@ QVector<qreal> getBufferLevels(const T *buffer, int frames, int channels)
|
|||||||
|
|
||||||
void AudioRecorder::processBuffer(const QAudioBuffer& buffer)
|
void AudioRecorder::processBuffer(const QAudioBuffer& buffer)
|
||||||
{
|
{
|
||||||
|
if (audioLevels.count() != buffer.format().channelCount()) {
|
||||||
|
qDeleteAll(audioLevels);
|
||||||
|
audioLevels.clear();
|
||||||
|
for (int i = 0; i < buffer.format().channelCount(); ++i) {
|
||||||
|
QAudioLevel *level = new QAudioLevel(ui->centralwidget);
|
||||||
|
audioLevels.append(level);
|
||||||
|
ui->levelsLayout->addWidget(level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QVector<qreal> levels = getBufferLevels(buffer);
|
QVector<qreal> levels = getBufferLevels(buffer);
|
||||||
for (int i = 0; i < levels.count(); ++i)
|
for (int i = 0; i < levels.count(); ++i)
|
||||||
audioLevels.at(i)->setLevel(levels.at(i));
|
audioLevels.at(i)->setLevel(levels.at(i));
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ private slots:
|
|||||||
void toggleRecord();
|
void toggleRecord();
|
||||||
|
|
||||||
void updateStatus(QMediaRecorder::Status);
|
void updateStatus(QMediaRecorder::Status);
|
||||||
|
void onStateChanged(QMediaRecorder::State);
|
||||||
void updateProgress(qint64 pos);
|
void updateProgress(qint64 pos);
|
||||||
void displayErrorMessage();
|
void displayErrorMessage();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user