diff --git a/moonlight-common/.gitignore b/moonlight-common/.gitignore index 6b468b62..ec995b00 100644 --- a/moonlight-common/.gitignore +++ b/moonlight-common/.gitignore @@ -1 +1,2 @@ *.class +/bin diff --git a/moonlight-common/src/com/limelight/nvstream/NvConnection.java b/moonlight-common/src/com/limelight/nvstream/NvConnection.java index 1dd5d4c6..2ff978bb 100644 --- a/moonlight-common/src/com/limelight/nvstream/NvConnection.java +++ b/moonlight-common/src/com/limelight/nvstream/NvConnection.java @@ -160,7 +160,7 @@ public class NvConnection { } } - private boolean startSteamBigPicture() throws XmlPullParserException, IOException + private boolean startApp() throws XmlPullParserException, IOException { NvHTTP h = new NvHTTP(hostAddr, getMacAddressString(), localDeviceName, cryptoProvider); @@ -173,19 +173,22 @@ public class NvConnection { listener.displayMessage("Device not paired with computer"); return false; } - - NvApp app = h.getSteamApp(); + + NvApp app = h.getApp(config.getApp()); if (app == null) { - listener.displayMessage("Steam not found in GFE app list"); + listener.displayMessage("The app " + config.getApp() + " is not in GFE app list"); return false; } // If there's a game running, resume it if (h.getCurrentGame() != 0) { try { - if (!h.resumeApp(riKey)) { + if (h.getCurrentGame() == app.getAppId() && !h.resumeApp(riKey)) { listener.displayMessage("Failed to resume existing session"); return false; + } else if (h.getCurrentGame() != app.getAppId()) { + listener.displayMessage("Another app was running. Quitting it"); + return quitAndLaunch(h, app); } } catch (GfeHttpResponseException e) { if (e.getErrorCode() == 470) { @@ -196,22 +199,43 @@ public class NvConnection { "device or the PC itself and try again. (Error code: "+e.getErrorCode()+")"); return false; } - else { + else if (e.getErrorCode() == 525) { + listener.displayMessage("The application is minimized. Trying to quit it"); + return quitAndLaunch(h, app); + } else { throw e; } } + LimeLog.info("Resumed existing game session"); + return true; } else { - // Launch the app since it's not running - int gameSessionId = h.launchApp(app.getAppId(), config.getWidth(), - config.getHeight(), config.getRefreshRate(), riKey); - if (gameSessionId == 0) { - listener.displayMessage("Failed to launch application"); - return false; - } - LimeLog.info("Launched new game session"); + return launchNotRunningApp(h, app); } + } + + protected boolean quitAndLaunch(NvHTTP h, NvApp app) throws IOException, + XmlPullParserException { + if (!h.quitApp()) { + listener.displayMessage("Failed to quit previous session! You must quit it manually"); + return false; + } else { + return launchNotRunningApp(h, app); + } + } + + private boolean launchNotRunningApp(NvHTTP h, NvApp app) + throws IOException, XmlPullParserException { + // Launch the app since it's not running + int gameSessionId = h.launchApp(app.getAppId(), config.getWidth(), + config.getHeight(), config.getRefreshRate(), riKey); + if (gameSessionId == 0) { + listener.displayMessage("Failed to launch application"); + return false; + } + + LimeLog.info("Launched new game session"); return true; } @@ -265,7 +289,7 @@ public class NvConnection { switch (currentStage) { case LAUNCH_APP: - success = startSteamBigPicture(); + success = startApp(); break; case RTSP_HANDSHAKE: diff --git a/moonlight-common/src/com/limelight/nvstream/StreamConfiguration.java b/moonlight-common/src/com/limelight/nvstream/StreamConfiguration.java index 33159953..807e4eca 100644 --- a/moonlight-common/src/com/limelight/nvstream/StreamConfiguration.java +++ b/moonlight-common/src/com/limelight/nvstream/StreamConfiguration.java @@ -1,12 +1,14 @@ package com.limelight.nvstream; public class StreamConfiguration { + private String app; private int width, height; private int refreshRate; private int bitrate; private int maxPacketSize; - public StreamConfiguration(int width, int height, int refreshRate, int bitrate) { + public StreamConfiguration(String app, int width, int height, int refreshRate, int bitrate) { + this.app = app; this.width = width; this.height = height; this.refreshRate = refreshRate; @@ -14,7 +16,8 @@ public class StreamConfiguration { this.maxPacketSize = 1024; } - public StreamConfiguration(int width, int height, int refreshRate, int bitrate, int maxPacketSize) { + public StreamConfiguration(String app, int width, int height, int refreshRate, int bitrate, int maxPacketSize) { + this.app = app; this.width = width; this.height = height; this.refreshRate = refreshRate; @@ -41,4 +44,8 @@ public class StreamConfiguration { public int getMaxPacketSize() { return maxPacketSize; } + + public String getApp() { + return app; + } } diff --git a/moonlight-common/src/com/limelight/nvstream/http/NvHTTP.java b/moonlight-common/src/com/limelight/nvstream/http/NvHTTP.java index 82a0192b..765281c0 100644 --- a/moonlight-common/src/com/limelight/nvstream/http/NvHTTP.java +++ b/moonlight-common/src/com/limelight/nvstream/http/NvHTTP.java @@ -140,12 +140,12 @@ public class NvHTTP { return Integer.parseInt(game); } - public NvApp getSteamApp() throws IOException, + public NvApp getApp(String app) throws IOException, XmlPullParserException { LinkedList appList = getAppList(); - for (NvApp app : appList) { - if (app.getAppName().equals("Steam")) { - return app; + for (NvApp appFromList : appList) { + if (appFromList.getAppName().equals(app)) { + return appFromList; } } return null;