1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
// SPDX-License-Identifier: LicenseRef-AGPL-3.0-only-OpenSSL
#ifndef CHIAKI_STREAMSESSION_H
#define CHIAKI_STREAMSESSION_H
#include <chiaki/session.h>
#include <chiaki/opusdecoder.h>
#include <chiaki/ffmpegdecoder.h>
#if CHIAKI_LIB_ENABLE_PI_DECODER
#include <chiaki/pidecoder.h>
#endif
#if CHIAKI_GUI_ENABLE_SETSU
#include <setsu.h>
#include <chiaki/orientation.h>
#endif
#include "exception.h"
#include "sessionlog.h"
#include "controllermanager.h"
#include "settings.h"
#include "transformmode.h"
#include <QObject>
#include <QImage>
#include <QMouseEvent>
#include <QTimer>
class QAudioOutput;
class QIODevice;
class QKeyEvent;
class Settings;
class ChiakiException: public Exception
{
public:
explicit ChiakiException(const QString &msg) : Exception(msg) {};
};
struct StreamSessionConnectInfo
{
Settings *settings;
QMap<Qt::Key, int> key_map;
Decoder decoder;
QString hw_decoder;
QString audio_out_device;
uint32_t log_level_mask;
QString log_file;
ChiakiTarget target;
QString host;
QByteArray regist_key;
QByteArray morning;
ChiakiConnectVideoProfile video_profile;
unsigned int audio_buffer_size;
bool fullscreen;
TransformMode transform_mode;
bool enable_keyboard;
bool enable_dualsense;
StreamSessionConnectInfo(
Settings *settings,
ChiakiTarget target,
QString host,
QByteArray regist_key,
QByteArray morning,
bool fullscreen,
TransformMode transform_mode);
};
class StreamSession : public QObject
{
friend class StreamSessionPrivate;
Q_OBJECT
private:
SessionLog log;
ChiakiSession session;
ChiakiOpusDecoder opus_decoder;
bool connected;
QHash<int, Controller *> controllers;
#if CHIAKI_GUI_ENABLE_SETSU
Setsu *setsu;
QMap<QPair<QString, SetsuTrackingId>, uint8_t> setsu_ids;
ChiakiControllerState setsu_state;
SetsuDevice *setsu_motion_device;
ChiakiOrientationTracker orient_tracker;
bool orient_dirty;
#endif
ChiakiControllerState keyboard_state;
ChiakiFfmpegDecoder *ffmpeg_decoder;
void TriggerFfmpegFrameAvailable();
#if CHIAKI_LIB_ENABLE_PI_DECODER
ChiakiPiDecoder *pi_decoder;
#endif
QAudioDeviceInfo audio_out_device_info;
unsigned int audio_buffer_size;
QAudioOutput *audio_output;
QIODevice *audio_io;
SDL_AudioDeviceID haptics_output;
uint8_t *haptics_resampler_buf;
QMap<Qt::Key, int> key_map;
void PushAudioFrame(int16_t *buf, size_t samples_count);
void PushHapticsFrame(uint8_t *buf, size_t buf_size);
#if CHIAKI_GUI_ENABLE_SETSU
void HandleSetsuEvent(SetsuEvent *event);
#endif
private slots:
void InitAudio(unsigned int channels, unsigned int rate);
void InitHaptics();
void Event(ChiakiEvent *event);
void DisconnectHaptics();
void ConnectHaptics();
public:
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);
ChiakiLog *GetChiakiLog() { return log.GetChiakiLog(); }
QList<Controller *> GetControllers() { return controllers.values(); }
ChiakiFfmpegDecoder *GetFfmpegDecoder() { return ffmpeg_decoder; }
#if CHIAKI_LIB_ENABLE_PI_DECODER
ChiakiPiDecoder *GetPiDecoder() { return pi_decoder; }
#endif
void HandleKeyboardEvent(QKeyEvent *event);
bool HandleMouseEvent(QMouseEvent *event);
signals:
void FfmpegFrameAvailable();
void SessionQuit(ChiakiQuitReason reason, const QString &reason_str);
void LoginPINRequested(bool incorrect);
private slots:
void UpdateGamepads();
void SendFeedbackState();
};
Q_DECLARE_METATYPE(ChiakiQuitReason)
#endif // CHIAKI_STREAMSESSION_H
|