rockbox/utils/rbutilqt/createvoicewindow.h
Solomon Peachy 0726ec9351 FS#13978 - rbutil: Improve GUI responsiveness during voice/talk file generation (Alessio Lenzi)
Voice file and Talk clip generation currently run synchronously in the
GUI thread. During long TTS operations this prevents the progress window
from processing input and accessibility events. On Windows this makes
the progress list unavailable to screen readers such as NVDA and can
make Rockbox Utility appear to be hung.

The attached patch moves VoiceFileCreator and TalkFileCreator to
low-priority QThreads while keeping ProgressLoggerGui in the GUI thread.
Progress and log signals are delivered through queued Qt connections.

Cancellation remains available while a synchronous TTS request is
running. The abort flags used across threads are atomic and the abort
signal is sent through a direct connection. Worker objects and threads
are deleted through the standard finished / deleteLater lifecycle.

Talk generation now passes all selected folders to one worker and
processes them sequentially, emitting the final done signal only once.
This preserves multiple-folder selection without starting work in the
GUI thread.

Change-Id: I58aa66333d43e1be249c84e0cf46c17c119a8360
2026-08-09 15:54:58 -04:00

59 lines
1.7 KiB
C++

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2007 by Dominik Wenger
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef CREATEVOICEWINDOW_H
#define CREATEVOICEWINDOW_H
#include <QDialog>
#include <QPointer>
#include <QThread>
#include <QUrl>
#include "ui_createvoicefrm.h"
#include "progressloggergui.h"
#include "voicefile.h"
class CreateVoiceWindow : public QDialog
{
Q_OBJECT
public:
CreateVoiceWindow(QWidget *parent);
void setProxy(QUrl proxy){m_proxy = proxy;}
public slots:
void accept(void);
void change(void);
void updateSettings(void);
void saveSettings(void);
signals:
void settingsUpdated(void);
private:
void changeEvent(QEvent *event);
QPointer<VoiceFileCreator> voicecreator;
QPointer<QThread> workerThread;
Ui::CreateVoiceFrm ui;
ProgressLoggerGui* logger;
QUrl m_proxy;
};
#endif