mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 10:46:51 -07:00
Add Sleep Trigger to GUI
This commit is contained in:
parent
6052d9d7d7
commit
8ddbad6f61
8 changed files with 108 additions and 6 deletions
|
@ -38,6 +38,13 @@ enum class ControllerButtonExt
|
|||
ANALOG_STICK_RIGHT_Y_DOWN = (1 << 25),
|
||||
};
|
||||
|
||||
enum class DisconnectAction
|
||||
{
|
||||
AlwaysNothing,
|
||||
AlwaysSleep,
|
||||
Ask
|
||||
};
|
||||
|
||||
class Settings : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
@ -95,6 +102,9 @@ class Settings : public QObject
|
|||
|
||||
ChiakiConnectVideoProfile GetVideoProfile();
|
||||
|
||||
DisconnectAction GetDisconnectAction();
|
||||
void SetDisconnectAction(DisconnectAction action);
|
||||
|
||||
QList<RegisteredHost> GetRegisteredHosts() const { return registered_hosts.values(); }
|
||||
void AddRegisteredHost(const RegisteredHost &host);
|
||||
void RemoveRegisteredHost(const HostMAC &mac);
|
||||
|
|
|
@ -34,6 +34,7 @@ class SettingsDialog : public QDialog
|
|||
Settings *settings;
|
||||
|
||||
QCheckBox *log_verbose_check_box;
|
||||
QComboBox *disconnect_action_combo_box;
|
||||
|
||||
QComboBox *resolution_combo_box;
|
||||
QComboBox *fps_combo_box;
|
||||
|
@ -48,6 +49,7 @@ class SettingsDialog : public QDialog
|
|||
|
||||
private slots:
|
||||
void LogVerboseChanged();
|
||||
void DisconnectActionSelected();
|
||||
|
||||
void ResolutionSelected();
|
||||
void FPSSelected();
|
||||
|
|
|
@ -48,6 +48,7 @@ class ChiakiException: public Exception
|
|||
|
||||
struct StreamSessionConnectInfo
|
||||
{
|
||||
Settings *settings;
|
||||
QMap<Qt::Key, int> key_map;
|
||||
HardwareDecodeEngine hw_decode_engine;
|
||||
uint32_t log_level_mask;
|
||||
|
@ -71,6 +72,7 @@ class StreamSession : public QObject
|
|||
SessionLog log;
|
||||
ChiakiSession session;
|
||||
ChiakiOpusDecoder opus_decoder;
|
||||
bool connected;
|
||||
|
||||
Controller *controller;
|
||||
#if CHIAKI_GUI_ENABLE_SETSU
|
||||
|
@ -103,8 +105,11 @@ class StreamSession : public QObject
|
|||
explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr);
|
||||
~StreamSession();
|
||||
|
||||
bool IsConnected() { return connected; }
|
||||
|
||||
void Start();
|
||||
void Stop();
|
||||
void GoToBed();
|
||||
|
||||
void SetLoginPIN(const QString &pin);
|
||||
|
||||
|
|
|
@ -34,11 +34,12 @@ class StreamWindow: public QMainWindow
|
|||
~StreamWindow() override;
|
||||
|
||||
private:
|
||||
const StreamSessionConnectInfo connect_info;
|
||||
StreamSession *session;
|
||||
|
||||
AVOpenGLWidget *av_widget;
|
||||
|
||||
void Init(const StreamSessionConnectInfo &connect_info);
|
||||
void Init();
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *event) override;
|
||||
|
|
|
@ -136,6 +136,25 @@ ChiakiConnectVideoProfile Settings::GetVideoProfile()
|
|||
return profile;
|
||||
}
|
||||
|
||||
static const QMap<DisconnectAction, QString> disconnect_action_values = {
|
||||
{ DisconnectAction::Ask, "ask" },
|
||||
{ DisconnectAction::AlwaysNothing, "nothing" },
|
||||
{ DisconnectAction::AlwaysSleep, "sleep" }
|
||||
};
|
||||
|
||||
static const DisconnectAction disconnect_action_default = DisconnectAction::Ask;
|
||||
|
||||
DisconnectAction Settings::GetDisconnectAction()
|
||||
{
|
||||
auto v = settings.value("settings/disconnect_action", disconnect_action_values[disconnect_action_default]).toString();
|
||||
return disconnect_action_values.key(v, disconnect_action_default);
|
||||
}
|
||||
|
||||
void Settings::SetDisconnectAction(DisconnectAction action)
|
||||
{
|
||||
settings.setValue("settings/disconnect_action", disconnect_action_values[action]);
|
||||
}
|
||||
|
||||
void Settings::LoadRegisteredHosts()
|
||||
{
|
||||
registered_hosts.clear();
|
||||
|
|
|
@ -85,6 +85,23 @@ SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(pa
|
|||
log_directory_label->setReadOnly(true);
|
||||
general_layout->addRow(tr("Log Directory:"), log_directory_label);
|
||||
|
||||
disconnect_action_combo_box = new QComboBox(this);
|
||||
QList<QPair<DisconnectAction, const char *>> disconnect_action_strings = {
|
||||
{ DisconnectAction::AlwaysNothing, "Do Nothing"},
|
||||
{ DisconnectAction::AlwaysSleep, "Enter Sleep Mode"},
|
||||
{ DisconnectAction::Ask, "Ask"}
|
||||
};
|
||||
auto current_disconnect_action = settings->GetDisconnectAction();
|
||||
for(const auto &p : disconnect_action_strings)
|
||||
{
|
||||
disconnect_action_combo_box->addItem(tr(p.second), (int)p.first);
|
||||
if(current_disconnect_action == p.first)
|
||||
disconnect_action_combo_box->setCurrentIndex(disconnect_action_combo_box->count() - 1);
|
||||
}
|
||||
connect(disconnect_action_combo_box, SIGNAL(currentIndexChanged(int)), this, SLOT(DisconnectActionSelected()));
|
||||
|
||||
general_layout->addRow(tr("Action on Disconnect:"), disconnect_action_combo_box);
|
||||
|
||||
auto about_button = new QPushButton(tr("About Chiaki"), this);
|
||||
general_layout->addRow(about_button);
|
||||
connect(about_button, &QPushButton::clicked, this, [this]() {
|
||||
|
@ -140,7 +157,7 @@ SettingsDialog::SettingsDialog(Settings *settings, QWidget *parent) : QDialog(pa
|
|||
UpdateBitratePlaceholder();
|
||||
|
||||
audio_buffer_size_edit = new QLineEdit(this);
|
||||
audio_buffer_size_edit->setValidator(new QIntValidator(1024, 0x20000));
|
||||
audio_buffer_size_edit->setValidator(new QIntValidator(1024, 0x20000, audio_buffer_size_edit));
|
||||
unsigned int audio_buffer_size = settings->GetAudioBufferSizeRaw();
|
||||
audio_buffer_size_edit->setText(audio_buffer_size ? QString::number(audio_buffer_size) : "");
|
||||
stream_settings_layout->addRow(tr("Audio Buffer Size:"), audio_buffer_size_edit);
|
||||
|
@ -249,6 +266,11 @@ void SettingsDialog::ResolutionSelected()
|
|||
UpdateBitratePlaceholder();
|
||||
}
|
||||
|
||||
void SettingsDialog::DisconnectActionSelected()
|
||||
{
|
||||
settings->SetDisconnectAction(static_cast<DisconnectAction>(disconnect_action_combo_box->currentData().toInt()));
|
||||
}
|
||||
|
||||
void SettingsDialog::LogVerboseChanged()
|
||||
{
|
||||
settings->SetLogVerbose(log_verbose_check_box->isChecked());
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#define SETSU_UPDATE_INTERVAL_MS 4
|
||||
|
||||
StreamSessionConnectInfo::StreamSessionConnectInfo(Settings *settings, QString host, QByteArray regist_key, QByteArray morning)
|
||||
: settings(settings)
|
||||
{
|
||||
key_map = settings->GetControllerMappingForDecoding();
|
||||
hw_decode_engine = settings->GetHardwareDecodeEngine();
|
||||
|
@ -58,6 +59,7 @@ StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObje
|
|||
audio_output(nullptr),
|
||||
audio_io(nullptr)
|
||||
{
|
||||
connected = false;
|
||||
chiaki_opus_decoder_init(&opus_decoder, log.GetChiakiLog());
|
||||
audio_buffer_size = connect_info.audio_buffer_size;
|
||||
|
||||
|
@ -135,6 +137,11 @@ void StreamSession::Stop()
|
|||
chiaki_session_stop(&session);
|
||||
}
|
||||
|
||||
void StreamSession::GoToBed()
|
||||
{
|
||||
chiaki_session_goto_bed(&session);
|
||||
}
|
||||
|
||||
void StreamSession::SetLoginPIN(const QString &pin)
|
||||
{
|
||||
QByteArray data = pin.toUtf8();
|
||||
|
@ -299,8 +306,10 @@ void StreamSession::Event(ChiakiEvent *event)
|
|||
switch(event->type)
|
||||
{
|
||||
case CHIAKI_EVENT_CONNECTED:
|
||||
connected = true;
|
||||
break;
|
||||
case CHIAKI_EVENT_QUIT:
|
||||
connected = false;
|
||||
emit SessionQuit(event->quit.reason, event->quit.reason_str ? QString::fromUtf8(event->quit.reason_str) : QString());
|
||||
break;
|
||||
case CHIAKI_EVENT_LOGIN_PIN_REQUEST:
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <streamsession.h>
|
||||
#include <avopenglwidget.h>
|
||||
#include <loginpindialog.h>
|
||||
#include <settings.h>
|
||||
|
||||
#include <QLabel>
|
||||
#include <QMessageBox>
|
||||
|
@ -26,7 +27,8 @@
|
|||
#include <QAction>
|
||||
|
||||
StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
: QMainWindow(parent),
|
||||
connect_info(connect_info)
|
||||
{
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
setWindowTitle(qApp->applicationName() + " | Stream");
|
||||
|
@ -36,7 +38,7 @@ StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget
|
|||
|
||||
try
|
||||
{
|
||||
Init(connect_info);
|
||||
Init();
|
||||
}
|
||||
catch(const Exception &e)
|
||||
{
|
||||
|
@ -51,7 +53,7 @@ StreamWindow::~StreamWindow()
|
|||
delete av_widget;
|
||||
}
|
||||
|
||||
void StreamWindow::Init(const StreamSessionConnectInfo &connect_info)
|
||||
void StreamWindow::Init()
|
||||
{
|
||||
session = new StreamSession(connect_info, this);
|
||||
|
||||
|
@ -98,10 +100,42 @@ void StreamWindow::mouseReleaseEvent(QMouseEvent *event)
|
|||
session->HandleMouseEvent(event);
|
||||
}
|
||||
|
||||
void StreamWindow::closeEvent(QCloseEvent *)
|
||||
void StreamWindow::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
if(session)
|
||||
{
|
||||
if(session->IsConnected())
|
||||
{
|
||||
bool sleep = false;
|
||||
switch(connect_info.settings->GetDisconnectAction())
|
||||
{
|
||||
case DisconnectAction::Ask: {
|
||||
auto res = QMessageBox::question(this, tr("Disconnect Session"), tr("Do you want the PS4 to go into sleep mode?"),
|
||||
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
|
||||
switch(res)
|
||||
{
|
||||
case QMessageBox::Yes:
|
||||
sleep = true;
|
||||
break;
|
||||
case QMessageBox::Cancel:
|
||||
event->ignore();
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DisconnectAction::AlwaysSleep:
|
||||
sleep = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(sleep)
|
||||
session->GoToBed();
|
||||
}
|
||||
session->Stop();
|
||||
}
|
||||
}
|
||||
|
||||
void StreamWindow::SessionQuit(ChiakiQuitReason reason, const QString &reason_str)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue