audio: Try to ensure audio always works

There is a problem with repeating error messages.

Signed-off-by: Christophe de Dinechin <christophe@dinechin.org>
This commit is contained in:
Christophe de Dinechin 2024-03-14 19:24:57 +01:00
parent 87a2b4fcaa
commit 0255b867ad
2 changed files with 15 additions and 25 deletions

View file

@ -735,18 +735,16 @@ void MainWindow::initializeAudio(const QAudioDevice &deviceInfo, uint freq)
// Audio setup for the simulator
// ----------------------------------------------------------------------------
{
if (!generator || freq != generator->frequency())
{
QAudioFormat format = deviceInfo.preferredFormat();
const int durationUs = 1000000 /* microseconds */;
QAudioFormat format = deviceInfo.preferredFormat();
const int durationUs = 1000000 /* microseconds */;
if (audio)
audio->stop();
audio.reset(new QAudioSink(deviceInfo, format));
generator.reset(new AudioGenerator(format, durationUs, freq));
generator->start();
audio->start(generator.data());
}
if (audio)
audio->stop();
audio.reset(new QAudioSink(deviceInfo, format));
generator.reset(new AudioGenerator(format, durationUs, freq));
generator->start();
audio->setVolume(0);
audio->start(generator.data());
}
@ -759,20 +757,21 @@ void MainWindow::startBuzzer(uint frequency)
frequency / 100, frequency % 100);
initializeAudio(devices->defaultAudioOutput(), frequency);
audio->setVolume(1);
switch (audio->state())
{
case QAudio::SuspendedState:
case QAudio::StoppedState:
case QAudio::IdleState:
audio->resume();
break;
default:
case QAudio::ActiveState:
case QAudio::IdleState:
// no-op
break;
}
playing = true;
}
@ -794,17 +793,7 @@ void MainWindow::stopBuzzer()
audio->suspend();
break;
}
}
bool MainWindow::buzzerPlaying()
// ----------------------------------------------------------------------------
// Check if the buzzer is actually playing
// ----------------------------------------------------------------------------
{
bool result = audio->state() == QAudio::ActiveState;
record(sim_audio, "Buzzer %+s playing", result ? "is" : "is not");
return result;
playing = false;
}

View file

@ -136,6 +136,7 @@ class MainWindow : public QMainWindow
QMediaDevices *devices = nullptr;
QScopedPointer<AudioGenerator> generator;
QScopedPointer<QAudioSink> audio;
volatile bool playing;
enum { SAMPLE_RATE = 20000, SAMPLE_COUNT = SAMPLE_RATE };
public:
@ -157,7 +158,7 @@ public:
void startBuzzer(uint frequency);
void stopBuzzer();
bool buzzerPlaying();
bool buzzerPlaying() { return playing; }
protected:
virtual void keyPressEvent(QKeyEvent *ev);