mirror of
https://github.com/moonlight-stream/moonlight-qt
synced 2024-12-14 21:32:27 +00:00
138 lines
3.6 KiB
C++
138 lines
3.6 KiB
C++
#include "streaming.h"
|
|
#include <Limelight.h>
|
|
#include <SDL.h>
|
|
|
|
#include <QMessageBox>
|
|
|
|
bool g_StreamActive;
|
|
QMessageBox* g_ProgressBox;
|
|
|
|
static
|
|
void
|
|
ClStageStarting(int stage)
|
|
{
|
|
char buffer[512];
|
|
sprintf(buffer, "Starting %s...", LiGetStageName(stage));
|
|
g_ProgressBox->setText(buffer);
|
|
}
|
|
|
|
static
|
|
void
|
|
ClStageFailed(int stage, long errorCode)
|
|
{
|
|
char buffer[512];
|
|
sprintf(buffer, "Failed %s with error: %ld",
|
|
LiGetStageName(stage), errorCode);
|
|
g_ProgressBox->setText(buffer);
|
|
}
|
|
|
|
static
|
|
void
|
|
ClConnectionTerminated(long errorCode)
|
|
{
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
|
"Connection terminated: %ld",
|
|
errorCode);
|
|
|
|
// Push a quit event to the main loop
|
|
SDL_Event event;
|
|
event.type = SDL_QUIT;
|
|
event.quit.timestamp = SDL_GetTicks();
|
|
SDL_PushEvent(&event);
|
|
}
|
|
|
|
static
|
|
void
|
|
ClLogMessage(const char* format, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, format);
|
|
SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION,
|
|
SDL_LOG_PRIORITY_INFO,
|
|
format,
|
|
ap);
|
|
va_end(ap);
|
|
}
|
|
|
|
int
|
|
StartConnection(PSERVER_INFORMATION serverInfo, PSTREAM_CONFIGURATION streamConfig, QMessageBox* progressBox)
|
|
{
|
|
CONNECTION_LISTENER_CALLBACKS listener;
|
|
|
|
// Hold onto this for our callbacks
|
|
g_ProgressBox = progressBox;
|
|
|
|
if (streamConfig->audioConfiguration < 0) {
|
|
// This signals to us that we should auto-detect
|
|
streamConfig->audioConfiguration = SdlDetermineAudioConfiguration();
|
|
}
|
|
|
|
LiInitializeConnectionCallbacks(&listener);
|
|
listener.stageStarting = ClStageStarting;
|
|
listener.stageFailed = ClStageFailed;
|
|
listener.connectionTerminated = ClConnectionTerminated;
|
|
listener.logMessage = ClLogMessage;
|
|
|
|
int err = LiStartConnection(serverInfo, streamConfig, &listener,
|
|
&k_VideoCallbacks, &k_AudioCallbacks,
|
|
NULL, 0, NULL, 0);
|
|
if (err != 0) {
|
|
SDL_Quit();
|
|
return err;
|
|
}
|
|
|
|
// Before we get into our loop, close the message box used to
|
|
// display progress
|
|
Q_ASSERT(g_ProgressBox == progressBox);
|
|
progressBox->close();
|
|
delete progressBox;
|
|
g_ProgressBox = nullptr;
|
|
|
|
// Hijack this thread to be the SDL main thread. We have to do this
|
|
// because we want to suspend all Qt processing until the stream is over.
|
|
SDL_Event event;
|
|
while (SDL_WaitEvent(&event)) {
|
|
switch (event.type) {
|
|
case SDL_QUIT:
|
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
|
"Quit event received");
|
|
goto Exit;
|
|
case SDL_KEYUP:
|
|
case SDL_KEYDOWN:
|
|
SdlHandleKeyEvent(&event.key);
|
|
break;
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
case SDL_MOUSEBUTTONUP:
|
|
SdlHandleMouseButtonEvent(&event.button);
|
|
break;
|
|
case SDL_MOUSEMOTION:
|
|
SdlHandleMouseMotionEvent(&event.motion);
|
|
break;
|
|
case SDL_MOUSEWHEEL:
|
|
SdlHandleMouseWheelEvent(&event.wheel);
|
|
break;
|
|
case SDL_CONTROLLERAXISMOTION:
|
|
SdlHandleControllerAxisEvent(&event.caxis);
|
|
break;
|
|
case SDL_CONTROLLERBUTTONDOWN:
|
|
case SDL_CONTROLLERBUTTONUP:
|
|
SdlHandleControllerButtonEvent(&event.cbutton);
|
|
break;
|
|
case SDL_CONTROLLERDEVICEADDED:
|
|
case SDL_CONTROLLERDEVICEREMOVED:
|
|
SdlHandleControllerDeviceEvent(&event.cdevice);
|
|
break;
|
|
}
|
|
}
|
|
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
|
"SDL_WaitEvent() failed: %s",
|
|
SDL_GetError());
|
|
|
|
Exit:
|
|
g_StreamActive = false;
|
|
LiStopConnection();
|
|
|
|
return 0;
|
|
}
|