Plumb common->JNI functions

This commit is contained in:
Cameron Gutman 2017-05-14 18:19:39 -07:00
parent a3d5e955aa
commit c62986e7b1
5 changed files with 66 additions and 71 deletions

View File

@ -7,32 +7,15 @@ import javax.crypto.SecretKey;
import com.limelight.nvstream.av.video.VideoDecoderRenderer;
public class ConnectionContext {
// Gen 3 servers are 2.1.1 - 2.2.1
public static final int SERVER_GENERATION_3 = 3;
// Gen 4 servers are 2.2.2+
public static final int SERVER_GENERATION_4 = 4;
// Gen 5 servers are 2.10.2+
public static final int SERVER_GENERATION_5 = 5;
// Gen 6 servers haven't been seen in the wild
public static final int SERVER_GENERATION_6 = 6;
// Gen 7 servers are GFE 2.11.2.46+
public static final int SERVER_GENERATION_7 = 7;
public InetAddress serverAddress;
public StreamConfiguration streamConfig;
public VideoDecoderRenderer videoDecoderRenderer;
public NvConnectionListener connListener;
public SecretKey riKey;
public int riKeyId;
public int serverGeneration;
// This is the version quad from the appversion tag of /serverinfo
public int[] serverAppVersion;
public String serverAppVersion;
public String serverGfeVersion;
public int negotiatedVideoFormat;
public int negotiatedWidth, negotiatedHeight;

View File

@ -19,6 +19,8 @@ import com.limelight.nvstream.http.LimelightCryptoProvider;
import com.limelight.nvstream.http.NvApp;
import com.limelight.nvstream.http.NvHTTP;
import com.limelight.nvstream.http.PairingManager;
import com.limelight.nvstream.input.MouseButtonPacket;
import com.limelight.nvstream.jni.MoonBridge;
public class NvConnection {
// Context parameters
@ -27,14 +29,13 @@ public class NvConnection {
private String uniqueId;
private ConnectionContext context;
public NvConnection(String host, String uniqueId, NvConnectionListener listener, StreamConfiguration config, LimelightCryptoProvider cryptoProvider)
public NvConnection(String host, String uniqueId, StreamConfiguration config, LimelightCryptoProvider cryptoProvider)
{
this.host = host;
this.cryptoProvider = cryptoProvider;
this.uniqueId = uniqueId;
this.context = new ConnectionContext();
this.context.connListener = listener;
this.context.streamConfig = config;
try {
// This is unique per connection
@ -62,9 +63,9 @@ public class NvConnection {
return new SecureRandom().nextInt();
}
public void stop()
{
public void stop() {
MoonBridge.stopConnection();
MoonBridge.cleanupBridge();
}
private boolean startApp() throws XmlPullParserException, IOException
@ -73,47 +74,17 @@ public class NvConnection {
String serverInfo = h.getServerInfo();
context.serverAppVersion = h.getServerAppVersionQuad(serverInfo);
context.serverAppVersion = h.getServerVersion(serverInfo);
if (context.serverAppVersion == null) {
context.connListener.displayMessage("Server version malformed");
return false;
}
int majorVersion = context.serverAppVersion[0];
LimeLog.info("Server major version: "+majorVersion);
if (majorVersion == 0) {
context.connListener.displayMessage("Server version malformed");
context.serverGfeVersion = h.getGfeVersion(serverInfo);
if (context.serverGfeVersion == null) {
context.connListener.displayMessage("Server GFE version malformed");
return false;
}
else if (majorVersion < 3) {
// Even though we support major version 3 (2.1.x), GFE 2.2.2 is preferred.
context.connListener.displayMessage("This app requires GeForce Experience 2.2.2 or later. Please upgrade GFE on your PC and try again.");
return false;
}
else if (majorVersion > 7) {
// Warn the user but allow them to continue
context.connListener.displayTransientMessage("This version of GFE is not currently supported. You may experience issues until this app is updated.");
}
switch (majorVersion) {
case 3:
context.serverGeneration = ConnectionContext.SERVER_GENERATION_3;
break;
case 4:
context.serverGeneration = ConnectionContext.SERVER_GENERATION_4;
break;
case 5:
context.serverGeneration = ConnectionContext.SERVER_GENERATION_5;
break;
case 6:
context.serverGeneration = ConnectionContext.SERVER_GENERATION_6;
break;
case 7:
default:
context.serverGeneration = ConnectionContext.SERVER_GENERATION_7;
break;
}
if (h.getPairState(serverInfo) != PairingManager.PairState.PAIRED) {
context.connListener.displayMessage("Device not paired with computer");
@ -251,12 +222,14 @@ public class NvConnection {
context.connListener.stageFailed(appName, 0);
return;
}
MoonBridge.startConnection(context.serverAddress.getHostAddress(),
context.serverAppVersion, context.serverGfeVersion);
}
public void start(AudioRenderer audioRenderer, VideoDecoderRenderer videoDecoderRenderer)
public void start(AudioRenderer audioRenderer, VideoDecoderRenderer videoDecoderRenderer, NvConnectionListener connectionListener)
{
this.context.videoDecoderRenderer = videoDecoderRenderer;
MoonBridge.setupBridge(videoDecoderRenderer, audioRenderer, connectionListener);
new Thread(new Runnable() {
public void run() {
try {
@ -273,17 +246,17 @@ public class NvConnection {
public void sendMouseMove(final short deltaX, final short deltaY)
{
MoonBridge.sendMouseMove(deltaX, deltaY);
}
public void sendMouseButtonDown(final byte mouseButton)
{
MoonBridge.sendMouseButton(MouseButtonPacket.PRESS_EVENT, mouseButton);
}
public void sendMouseButtonUp(final byte mouseButton)
{
MoonBridge.sendMouseButton(MouseButtonPacket.RELEASE_EVENT, mouseButton);
}
public void sendControllerInput(final short controllerNumber,
@ -292,7 +265,7 @@ public class NvConnection {
final short leftStickX, final short leftStickY,
final short rightStickX, final short rightStickY)
{
MoonBridge.sendMultiControllerInput(controllerNumber, activeGamepadMask, buttonFlags, leftTrigger, rightTrigger, leftStickX, leftStickY, rightStickX, rightStickY);
}
public void sendControllerInput(final short buttonFlags,
@ -300,15 +273,15 @@ public class NvConnection {
final short leftStickX, final short leftStickY,
final short rightStickX, final short rightStickY)
{
MoonBridge.sendControllerInput(buttonFlags, leftTrigger, rightTrigger, leftStickX, leftStickY, rightStickX, rightStickY);
}
public void sendKeyboardInput(final short keyMap, final byte keyDirection, final byte modifier) {
MoonBridge.sendKeyboardInput(keyMap, keyDirection, modifier);
}
public void sendMouseScroll(final byte scrollClicks) {
MoonBridge.sendMouseScroll(scrollClicks);
}
public int getActiveVideoFormat() {

View File

@ -378,6 +378,10 @@ public class NvHTTP {
return getXmlString(serverInfo, "gputype");
}
public String getGfeVersion(String serverInfo) throws XmlPullParserException, IOException {
return getXmlString(serverInfo, "GfeVersion");
}
public boolean supports4K(String serverInfo) throws XmlPullParserException, IOException {
// serverinfo returns supported resolutions in descending order, so getting the first
// height will give us whether we support 4K. If this is not present, we don't support

View File

@ -1,8 +1,8 @@
package com.limelight.nvstream.input;
public class MouseButtonPacket {
private static final byte PRESS_EVENT = 0x07;
private static final byte RELEASE_EVENT = 0x08;
public static final byte PRESS_EVENT = 0x07;
public static final byte RELEASE_EVENT = 0x08;
public static final byte BUTTON_LEFT = 0x01;
public static final byte BUTTON_MIDDLE = 0x02;

View File

@ -106,5 +106,40 @@ public class MoonBridge {
}
}
public static void setupBridge(VideoDecoderRenderer videoRenderer, AudioRenderer audioRenderer, NvConnectionListener connectionListener) {
MoonBridge.videoRenderer = videoRenderer;
MoonBridge.audioRenderer = audioRenderer;
MoonBridge.connectionListener = connectionListener;
}
public static void cleanupBridge() {
MoonBridge.videoRenderer = null;
MoonBridge.audioRenderer = null;
MoonBridge.connectionListener = null;
}
public static native void startConnection(String address, String serverInfoAppVersion, String serverInfoGfeVersion);
public static native void stopConnection();
public static native void sendMouseMove(short deltaX, short deltaY);
public static native void sendMouseButton(byte buttonEvent, byte mouseButton);
public static native void sendMultiControllerInput(short controllerNumber,
short activeGamepadMask, short buttonFlags,
byte leftTrigger, byte rightTrigger,
short leftStickX, short leftStickY,
short rightStickX, short rightStickY);
public static native void sendControllerInput(short buttonFlags,
byte leftTrigger, byte rightTrigger,
short leftStickX, short leftStickY,
short rightStickX, short rightStickY);
public static native void sendKeyboardInput(short keyMap, byte keyDirection, byte modifier);
public static native void sendMouseScroll(byte scrollClicks);
public static native String getStageName(int stage);
}