From e2663f06bace3b503ba837d24b01db285afbb86f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 13 Jul 2014 21:44:19 -0700 Subject: [PATCH 1/7] Bump version to 2.5.0.5 --- AndroidManifest.xml | 4 ++-- libs/limelight-common.jar | Bin 410672 -> 410672 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index eed7b299..c6c451b1 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@  + android:versionCode="25" + android:versionName="2.5.0.5" > taA{Y47+SNXZl-hHulXzj^E)Tn;l)|LpWbDG^Rh$ zX5*PYPlt_dv#h(b2*~2evKt}7lk4I+HqVbxh_6{5hSwtVnQZZYPz8^ zqsHdc6h|;`^U8D&i2Rp~T@aCtIi_Hd$q%M$Prj2QyjeZ(C|Cw8aK3|kvucqcM1|vj zjmdmvQq%Jd*f=&XE_Q%8RCc5G^!)~GvYYkFRM|mxLp2I+o>c3LY?9z+xyF^K0&K0b zAp-Z7X>UH?QN#h(58~ucJOr`y!F1crg_CnwKr)*jOuq?JZ#G@Pn2l}nkJ;9YVVh0n z^fEJlNW8Q8$ox`P#5*Esl#?9OhzRxF*iPfQU{|G~Qcw5NzJ$FB#gC<0rFC z?>1rM+8Jq0p^dlNzi>7X8)R^3VPI~$qGd7;h4^K3+f=t_-e(o(qhk*{G z#^(Bq+j&94(?Pt+4<3q4m$zVJ-&}Lw5=qg6hc@64Kq$HoQk3-cA;dLnc^P%58(6Z* zZJzji3q&6%t!^%Obq<_>Haq?=2CLko3RkAVEbBL#!XCurL*6Y<{e1x)RG z3z*yY7O-sJTfmyIgSmF?+vy6LY&9Sy)8}ilxq%rkG})rT3^y&dFfe02jPV1;2-Jp3 zt%5O_b)X_KI&2|eU7K~-lE4fJUA7o7qgIw`hP(k=3RtAg0BZ7U1E?AwLnvb{jKOCFwKNyTIAa7=qif6-#{r6ZP$ru` z*_bUHZ0cKMs16?!s9P4BKrQ4lg<6ZTO?Sj$rft+BU@-lINL!LFSTQf0;^%NXG;V#(qN2J_E0rC4p4JC V9H8!b3ls5lggActa!0mKCIHW-scQfL delta 1670 zcmdncA-SPLk~hGcnMH(wgM))XZPuHOybBDNKgGS-yuqN63B;Jbw}4S&x||l9taA{Y47+SNXZl-hHulXzj^E)Tn;l)|LpWbDG^Rh$ zX5*PYPlt_dv#h(b2*~2evKt}7lk4I+HqVbxh_6{ky$zW&E|^)lO`x4)5{*tkanfb?zH=8%+m@-kS9W zs!?$Bq*`BQ6al%$m8b%2t+OEl_m*jIKHpKq0ridc=KP6=7{Qze(``2wPR?NgaW+4g zeiP!hd&|tG3mCJpP5v?4nlWm#$(&wh<^p58%}3^!vNC#Zwp!ZFDCu8WA$^#Of#I4s z0|O#DLD6_`*+CZO+!=2sf636E96y+RVM4A1tz2 zcB2^|$N|&W@-l+u1UC2WUkP>~IDjYjpA*|$ad0^}>cAq?^Uc^~H>V%b06To@c1DfK z{pX~ozcFLu+5GTCGb_ln&FSafLUb7DFlubBzqp+jBs?9&oBZIR$aHxNHulXm_brhW zJ$PsX4grLs`yfS0Pai^DvzC`pce;Tko80D!&$mGIfzs;cf>-Cj323w9|6;Jpt=k!Y zf#pF-YVw1JtkdYB*pHX9aj4hk^c5W?3 zC5Wj8I*j+htjQ0iYizgDXIule7Zj*^)9dZn#JB62FkS+CVLP)KqX7qVMB|(7W_FC+ zY#`QjGdo6y?JX{h7g)etQ1YMVz$UwWjwfRv8}s#sH`_n>GjcIAdp5q={x^ux0&LQB zkW02FgfKo61UVRzy%RzhS+|#^F}iSp#M<{3Ft+b4U~1o6z}&vKfMxsM0@j2b%xbgV zOjpoks{tvQK3|i~4a|6<$rcS}xM{J4ff@5*j2|#Ypf*%$6^y~G0~LwUVG9B4+N{Ht z1ZGI+vc-V%_4IOGwotIhd0n=6FvC!fEg6)hr%%^o3jyWi>F@N|a=?sOeYQBTntdRK z$ILg=X80IF8Eat-J|ngmu=ZRSl+mbB>tV_uXYG9ug)b`I-P(KA( zvju_GEVqVg=eJ=C28*QHK;3iP2C7)imMs!2)np5`{gEv+B%JM_ikI54MS+tXlRaA^ un2`o!oU&(&2PM7fIu2}+pp-Yg!vX4^w;+*Eac`!3Izk-3eYqoBCldg7%)KZ8 From d428f342f7d009c26e65815bc1a179170ee615e5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 15 Jul 2014 20:46:12 -0700 Subject: [PATCH 2/7] Fix dialog rundown issues causing spurious crashes --- src/com/limelight/utils/Dialog.java | 31 +++++++++++++--------- src/com/limelight/utils/SpinnerDialog.java | 27 +++++++++++++------ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/com/limelight/utils/Dialog.java b/src/com/limelight/utils/Dialog.java index c4bb6e6b..d95dcfb3 100644 --- a/src/com/limelight/utils/Dialog.java +++ b/src/com/limelight/utils/Dialog.java @@ -11,7 +11,7 @@ public class Dialog implements Runnable { private Activity activity; private boolean endAfterDismiss; - AlertDialog alert; + private AlertDialog alert; private static ArrayList rundownDialogs = new ArrayList(); @@ -25,13 +25,15 @@ public class Dialog implements Runnable { public static void closeDialogs() { - for (Dialog d : rundownDialogs) { - if (d.alert.isShowing()) { - d.alert.dismiss(); + synchronized (rundownDialogs) { + for (Dialog d : rundownDialogs) { + if (d.alert.isShowing()) { + d.alert.dismiss(); + } } + + rundownDialogs.clear(); } - - rundownDialogs.clear(); } public static void displayDialog(Activity activity, String title, String message, boolean endAfterDismiss) @@ -54,16 +56,21 @@ public class Dialog implements Runnable { alert.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - alert.dismiss(); - rundownDialogs.remove(this); + synchronized (rundownDialogs) { + rundownDialogs.remove(this); + alert.dismiss(); + } - if (endAfterDismiss) + if (endAfterDismiss) { activity.finish(); + } } - }); + }); - rundownDialogs.add(this); - alert.show(); + synchronized (rundownDialogs) { + rundownDialogs.add(this); + alert.show(); + } } } diff --git a/src/com/limelight/utils/SpinnerDialog.java b/src/com/limelight/utils/SpinnerDialog.java index a5ec6991..29a35bb2 100644 --- a/src/com/limelight/utils/SpinnerDialog.java +++ b/src/com/limelight/utils/SpinnerDialog.java @@ -33,13 +33,15 @@ public class SpinnerDialog implements Runnable,OnCancelListener { public static void closeDialogs() { - for (SpinnerDialog d : rundownDialogs) { - if (d.progress.isShowing()) { - d.progress.dismiss(); + synchronized (rundownDialogs) { + for (SpinnerDialog d : rundownDialogs) { + if (d.progress.isShowing()) { + d.progress.dismiss(); + } } + + rundownDialogs.clear(); } - - rundownDialogs.clear(); } public void dismiss() @@ -85,18 +87,27 @@ public class SpinnerDialog implements Runnable,OnCancelListener { progress.setCancelable(false); } - progress.show(); + synchronized (rundownDialogs) { + rundownDialogs.add(this); + progress.show(); + } } else { - if (progress.isShowing()) { - progress.dismiss(); + synchronized (rundownDialogs) { + if (rundownDialogs.remove(this) && progress.isShowing()) { + progress.dismiss(); + } } } } @Override public void onCancel(DialogInterface dialog) { + synchronized (rundownDialogs) { + rundownDialogs.remove(this); + } + // This will only be called if finish was true, so we don't need to check again activity.finish(); } From 92143df65caa5a7048f97af47e9631d2b172f2b5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 19 Jul 2014 03:35:17 -0700 Subject: [PATCH 3/7] Don't destroy dialogs until we're really finishing --- src/com/limelight/AppView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/limelight/AppView.java b/src/com/limelight/AppView.java index 622b2cbe..bce04f30 100644 --- a/src/com/limelight/AppView.java +++ b/src/com/limelight/AppView.java @@ -94,8 +94,8 @@ public class AppView extends Activity { } @Override - protected void onStop() { - super.onStop(); + protected void onDestroy() { + super.onDestroy(); Dialog.closeDialogs(); SpinnerDialog.closeDialogs(); From f5ec665115389e834b1d62d961f8929a8b9d0608 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 19 Jul 2014 03:49:44 -0700 Subject: [PATCH 4/7] Park for a bit if there's nothing to do --- .../limelight/binding/video/AndroidCpuDecoderRenderer.java | 2 ++ .../limelight/binding/video/MediaCodecDecoderRenderer.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java index 611c3555..7521ad0c 100644 --- a/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java +++ b/src/com/limelight/binding/video/AndroidCpuDecoderRenderer.java @@ -5,6 +5,7 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.concurrent.locks.LockSupport; import android.graphics.PixelFormat; import android.os.Build; @@ -169,6 +170,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer { long diff = nextFrameTime - System.currentTimeMillis(); if (diff > WAIT_CEILING_MS) { + LockSupport.parkNanos(1); continue; } diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index d91c5509..8a180362 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -3,6 +3,7 @@ package com.limelight.binding.video; import java.nio.ByteBuffer; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.locks.LockSupport; import com.limelight.LimeLog; import com.limelight.nvstream.av.ByteBufferDescriptor; @@ -203,6 +204,9 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } } else { switch (outIndex) { + case MediaCodec.INFO_TRY_AGAIN_LATER: + LockSupport.parkNanos(1); + break; case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: LimeLog.info("Output buffers changed"); break; From 428d37afd440bab45cc689925142f9a42183e5e1 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 19 Jul 2014 03:50:37 -0700 Subject: [PATCH 5/7] Improve input device detection --- src/com/limelight/Game.java | 54 ++++++++++++------ .../binding/input/ControllerHandler.java | 57 ++++++++++++++++++- 2 files changed, 93 insertions(+), 18 deletions(-) diff --git a/src/com/limelight/Game.java b/src/com/limelight/Game.java index 5c7e7cf4..10b00d96 100644 --- a/src/com/limelight/Game.java +++ b/src/com/limelight/Game.java @@ -270,10 +270,27 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM return modifier; } + private static boolean isSourceFlagSet(int sourcesFlags, int flag) { + return (sourcesFlags & flag) == flag; + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - if (event.getDevice() != null && - (event.getDevice().getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC)) { + InputDevice dev = event.getDevice(); + if (dev == null) { + return super.onKeyDown(keyCode, event); + } + + int source = dev.getSources(); + boolean handled = false; + if (isSourceFlagSet(source, InputDevice.SOURCE_DPAD) || + isSourceFlagSet(source, InputDevice.SOURCE_GAMEPAD) || + isSourceFlagSet(source, InputDevice.SOURCE_JOYSTICK)) + { + handled = controllerHandler.handleButtonDown(keyCode, event); + } + + if (!handled) { short translated = keybTranslator.translate(event.getKeyCode()); if (translated == 0) { return super.onKeyDown(keyCode, event); @@ -282,12 +299,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM keybTranslator.sendKeyDown(translated, getModifierState(event)); } - else { - if (!controllerHandler.handleButtonDown(keyCode, event)) { - return super.onKeyDown(keyCode, event); - } - } - + return true; } @@ -302,22 +314,30 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM h.postDelayed(hideSystemUi, 2000); } } - - if (event.getDevice() != null && - (event.getDevice().getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC)) { + + InputDevice dev = event.getDevice(); + if (dev == null) { + return super.onKeyUp(keyCode, event); + } + + int source = dev.getSources(); + boolean handled = false; + if (isSourceFlagSet(source, InputDevice.SOURCE_DPAD) || + isSourceFlagSet(source, InputDevice.SOURCE_GAMEPAD) || + isSourceFlagSet(source, InputDevice.SOURCE_JOYSTICK)) + { + handled = controllerHandler.handleButtonUp(keyCode, event); + } + + if (!handled) { short translated = keybTranslator.translate(event.getKeyCode()); if (translated == 0) { return super.onKeyUp(keyCode, event); } - + keybTranslator.sendKeyUp(translated, getModifierState(event)); } - else { - if (!controllerHandler.handleButtonUp(keyCode, event)) { - return super.onKeyUp(keyCode, event); - } - } return true; } diff --git a/src/com/limelight/binding/input/ControllerHandler.java b/src/com/limelight/binding/input/ControllerHandler.java index 789fe7be..3a85af60 100644 --- a/src/com/limelight/binding/input/ControllerHandler.java +++ b/src/com/limelight/binding/input/ControllerHandler.java @@ -148,6 +148,10 @@ public class ControllerHandler { } } + mapping.isDpad = (dev.getSources() & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD; + mapping.isGamepad = (dev.getSources() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD || + (dev.getSources() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK; + return mapping; } @@ -177,7 +181,48 @@ public class ControllerHandler { leftStickX, leftStickY, rightStickX, rightStickY); } - private int handleRemapping(ControllerMapping mapping, int keyCode) { + private static boolean isEventExpected(ControllerMapping mapping, int keyCode) { + if (mapping.isDpad) { + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_RIGHT: + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_DOWN: + return true; + } + } + + if (mapping.isGamepad) { + switch (keyCode) { + case KeyEvent.KEYCODE_BUTTON_MODE: + case KeyEvent.KEYCODE_BUTTON_START: + case KeyEvent.KEYCODE_MENU: + case KeyEvent.KEYCODE_BACK: + case KeyEvent.KEYCODE_BUTTON_SELECT: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_RIGHT: + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_BUTTON_B: + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_BUTTON_A: + case KeyEvent.KEYCODE_BUTTON_X: + case KeyEvent.KEYCODE_BUTTON_Y: + case KeyEvent.KEYCODE_BUTTON_L1: + case KeyEvent.KEYCODE_BUTTON_R1: + case KeyEvent.KEYCODE_BUTTON_THUMBL: + case KeyEvent.KEYCODE_BUTTON_THUMBR: + case KeyEvent.KEYCODE_BUTTON_L2: + case KeyEvent.KEYCODE_BUTTON_R2: + return true; + } + } + + return false; + } + + private static int handleRemapping(ControllerMapping mapping, int keyCode) { if (mapping.isDualShock4) { switch (keyCode) { case KeyEvent.KEYCODE_BUTTON_Y: @@ -317,6 +362,10 @@ public class ControllerHandler { return true; } + if (!isEventExpected(mapping, keyCode)) { + return false; + } + // If the button hasn't been down long enough, sleep for a bit before sending the up event // This allows "instant" button presses (like OUYA's virtual menu button) to work. This // path should not be triggered during normal usage. @@ -440,6 +489,10 @@ public class ControllerHandler { return true; } + if (!isEventExpected(mapping, keyCode)) { + return false; + } + switch (keyCode) { case KeyEvent.KEYCODE_BUTTON_MODE: inputMap |= ControllerPacket.SPECIAL_BUTTON_FLAG; @@ -549,5 +602,7 @@ public class ControllerHandler { public float hatYDeadzone; public boolean isDualShock4; + public boolean isDpad; + public boolean isGamepad; } } From b9f01b63cc0ab4ada13614e6c726a89eeed82d5a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 19 Jul 2014 22:15:23 -0700 Subject: [PATCH 6/7] Add an option to stretch the video to fill the screen and make preserve aspect ratio the default --- gen/com/limelight/R.java | 5 ++- libs/limelight-common.jar | Bin 410672 -> 410609 bytes res/layout/activity_game.xml | 5 ++- res/layout/activity_stream_settings.xml | 10 ++++- src/com/limelight/Game.java | 54 ++++++++++++++++++++---- src/com/limelight/StreamSettings.java | 12 ++++++ 6 files changed, 72 insertions(+), 14 deletions(-) diff --git a/gen/com/limelight/R.java b/gen/com/limelight/R.java index 1baa8d20..889f9c8d 100644 --- a/gen/com/limelight/R.java +++ b/gen/com/limelight/R.java @@ -52,12 +52,13 @@ or to a theme attribute in the form "?[package:][type:]na public static final int discoveryText=0x7f08000b; public static final int hardwareDec=0x7f080005; public static final int hostTextView=0x7f080000; - public static final int manuallyAddPc=0x7f080013; + public static final int manuallyAddPc=0x7f080014; public static final int pcListView=0x7f080008; - public static final int rowTextView=0x7f080014; + public static final int rowTextView=0x7f080015; public static final int settingsButton=0x7f08000c; public static final int softwareDec=0x7f080003; public static final int streamConfigGroup=0x7f08000d; + public static final int stretchToFill=0x7f080013; public static final int surfaceView=0x7f08000a; } public static final class layout { diff --git a/libs/limelight-common.jar b/libs/limelight-common.jar index 11380301abc953056ed11ae4c10ffea9f792426f..3eef702c133846d3757d55f194e392c058e8b4d9 100644 GIT binary patch delta 23869 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 delta 23942 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 + android:layout_height="match_parent" + android:layout_gravity="center" /> diff --git a/res/layout/activity_stream_settings.xml b/res/layout/activity_stream_settings.xml index 8847b66a..0f69e4f9 100644 --- a/res/layout/activity_stream_settings.xml +++ b/res/layout/activity_stream_settings.xml @@ -54,7 +54,7 @@ android:id="@+id/advancedSettingsButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_below="@+id/streamConfigGroup" + android:layout_below="@+id/stretchToFill" android:layout_centerHorizontal="true" android:layout_marginTop="15dp" android:text="Advanced Settings" /> @@ -67,6 +67,14 @@ android:layout_centerHorizontal="true" android:text="Add PC Manually" /> + + diff --git a/src/com/limelight/Game.java b/src/com/limelight/Game.java index 10b00d96..1fc7c9b1 100644 --- a/src/com/limelight/Game.java +++ b/src/com/limelight/Game.java @@ -32,6 +32,7 @@ import android.view.SurfaceView; import android.view.View; import android.view.View.OnGenericMotionListener; import android.view.View.OnTouchListener; +import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; @@ -58,6 +59,8 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM private boolean connecting = false; private boolean connected = false; + private boolean stretchToFit; + private ConfigurableDecoderRenderer decoderRenderer; private WifiManager.WifiLock wifiLock; @@ -76,6 +79,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM public static final String REFRESH_RATE_PREF_STRING = "FPS"; public static final String DECODER_PREF_STRING = "Decoder"; public static final String BITRATE_PREF_STRING = "Bitrate"; + public static final String STRETCH_PREF_STRING = "Stretch"; public static final int BITRATE_DEFAULT_720_30 = 5; public static final int BITRATE_DEFAULT_720_60 = 10; @@ -87,6 +91,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM public static final int DEFAULT_REFRESH_RATE = 60; public static final int DEFAULT_DECODER = 0; public static final int DEFAULT_BITRATE = BITRATE_DEFAULT_720_60; + public static final boolean DEFAULT_STRETCH = false; public static final int FORCE_HARDWARE_DECODER = -1; public static final int AUTOSELECT_DECODER = 0; @@ -121,13 +126,6 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM // Inflate the content setContentView(R.layout.activity_game); - // Listen for events on the game surface - SurfaceView sv = (SurfaceView) findViewById(R.id.surfaceView); - sv.setOnGenericMotionListener(this); - sv.setOnTouchListener(this); - - SurfaceHolder sh = sv.getHolder(); - // Start the spinner spinner = SpinnerDialog.displayDialog(this, "Establishing Connection", "Starting connection", true); @@ -143,16 +141,32 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM drFlags |= VideoDecoderRenderer.FLAG_FORCE_HARDWARE_DECODING; break; } + + stretchToFit = prefs.getBoolean(STRETCH_PREF_STRING, DEFAULT_STRETCH); + if (stretchToFit) { + drFlags |= VideoDecoderRenderer.FLAG_FILL_SCREEN; + } int refreshRate, bitrate; width = prefs.getInt(WIDTH_PREF_STRING, DEFAULT_WIDTH); height = prefs.getInt(HEIGHT_PREF_STRING, DEFAULT_HEIGHT); refreshRate = prefs.getInt(REFRESH_RATE_PREF_STRING, DEFAULT_REFRESH_RATE); bitrate = prefs.getInt(BITRATE_PREF_STRING, DEFAULT_BITRATE); - sh.setFixedSize(width, height); Display display = getWindowManager().getDefaultDisplay(); display.getSize(screenSize); + + // Listen for events on the game surface + SurfaceView sv = (SurfaceView) findViewById(R.id.surfaceView); + sv.setOnGenericMotionListener(this); + sv.setOnTouchListener(this); + + SurfaceHolder sh = sv.getHolder(); + + if (stretchToFit) { + // Set the surface to the size of the video + sh.setFixedSize(width, height); + } // Warn the user if they're on a metered connection checkDataConnection(); @@ -181,6 +195,21 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM sh.addCallback(this); } + private void resizeSurfaceWithAspectRatio(SurfaceView sv, double vidWidth, double vidHeight) + { + // Get the visible width of the activity + double visibleWidth = getWindow().getDecorView().getWidth(); + + ViewGroup.LayoutParams lp = sv.getLayoutParams(); + + // Calculate the new size of the SurfaceView + lp.width = (int) visibleWidth; + lp.height = (int) ((vidHeight / vidWidth) * visibleWidth); + + // Apply the size change + sv.setLayoutParams(lp); + } + private void checkDataConnection() { ConnectivityManager mgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); @@ -233,7 +262,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM int averageDecoderLat = decoderRenderer.getAverageDecoderLatency(); String message = null; if (averageEndToEndLat > 0) { - message = "Average total frame latency: "+averageEndToEndLat+" ms"; + message = "Average client-side frame latency: "+averageEndToEndLat+" ms"; if (averageDecoderLat > 0) { message += " (hardware decoder latency: "+averageDecoderLat+" ms)"; } @@ -582,6 +611,13 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM public void surfaceCreated(SurfaceHolder holder) { if (!connected && !connecting) { connecting = true; + + // Resize the surface to match the aspect ratio of the video + // This must be done after the surface is created. + if (!stretchToFit) { + resizeSurfaceWithAspectRatio((SurfaceView) findViewById(R.id.surfaceView), width, height); + } + conn.start(PlatformBinding.getDeviceName(), holder, drFlags, PlatformBinding.getAudioRenderer(), decoderRenderer); } diff --git a/src/com/limelight/StreamSettings.java b/src/com/limelight/StreamSettings.java index 4ff25255..fb31b6b0 100644 --- a/src/com/limelight/StreamSettings.java +++ b/src/com/limelight/StreamSettings.java @@ -6,6 +6,7 @@ import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; +import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.RadioButton; @@ -18,6 +19,7 @@ public class StreamSettings extends Activity { private Button advancedSettingsButton, addComputerButton; private SharedPreferences prefs; private RadioButton rbutton720p30, rbutton720p60, rbutton1080p30, rbutton1080p60; + private CheckBox stretchToFill; @Override protected void onStop() { @@ -32,6 +34,7 @@ public class StreamSettings extends Activity { setContentView(R.layout.activity_stream_settings); + this.stretchToFill = (CheckBox) findViewById(R.id.stretchToFill); this.advancedSettingsButton = (Button) findViewById(R.id.advancedSettingsButton); this.addComputerButton = (Button) findViewById(R.id.manuallyAddPc); this.rbutton720p30 = (RadioButton) findViewById(R.id.config720p30Selected); @@ -44,6 +47,8 @@ public class StreamSettings extends Activity { boolean res720p = prefs.getInt(Game.HEIGHT_PREF_STRING, Game.DEFAULT_HEIGHT) == 720; boolean fps30 = prefs.getInt(Game.REFRESH_RATE_PREF_STRING, Game.DEFAULT_REFRESH_RATE) == 30; + stretchToFill.setChecked(prefs.getBoolean(Game.STRETCH_PREF_STRING, Game.DEFAULT_STRETCH)); + rbutton720p30.setChecked(false); rbutton720p60.setChecked(false); rbutton1080p30.setChecked(false); @@ -119,5 +124,12 @@ public class StreamSettings extends Activity { startActivity(i); } }); + stretchToFill.setOnCheckedChangeListener(new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, + boolean isChecked) { + prefs.edit().putBoolean(Game.STRETCH_PREF_STRING, isChecked).commit(); + } + }); } } From 48ab233d0fd7666278ac23fce80e0b8d2a5d099c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 19 Jul 2014 22:50:14 -0700 Subject: [PATCH 7/7] Update common and bump version --- AndroidManifest.xml | 4 ++-- libs/limelight-common.jar | Bin 410609 -> 410676 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c6c451b1..5099010a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@  + android:versionCode="26" + android:versionName="2.5.1" > ue-A7xTCbO!lUQ85G?KGMCRMaPe$z>{ z+nJkvFBvc8NjINuwovzJ#=;$*+e&Zynx$;#%sgsvbM6*rbL+%1vs?!UmnR_(fi?jj z8??Hd6geaI*w#IBx+Sa?(XSUsmxMvcQxyT4GpC@tvp z(yKcrnO9#8ylcREH6^xtZKwRPb9a+fjm3HQaEjeq{QO{I;hmycbF#J_{UCfYg~xRM z@n1~b$^Ki+r@h#+F!ztbh7#9vn@TTCym9gDgSomqvVOM@ygpg6sNO*G^}W3Orl-5= z7oAK=$u8MoEY;7$lh;|YL};&1Am{g_mq87@^3sy6>vM!dUVHU?tqHr&e(<|h^2GLY z-U}vIRjtor%5R+}yyZmPg%S?qD1)~*4kRs&(>U36)#cz9z3U$(&KL#koPZ=Q^`U8I-@yRu{QPMw$A| z$;VBNG9eTWiZ#MW)I)I9t#D{b!2kmYP{rxo-7+lbE+mFIrb6xi%qb6@f8X!87RR2sewMte z&x+Yh8y>T(R9VM9QoqA39dEyy;jV{#8vp-}shQ72wr>8V@qEwEH7hF&SF_i@NG{nt z-!87_v5dy88uVPzy{P_T@*KC#C#<+`7iMZa+wuO(+zUOEmXpQbPkK>NUFfvPb5^}m)Pba!=g~=-8MoiWRQ}#8RNMJ@ftMjq z>YT@~?99$hXU(0lxNwqZAKRTX&d%@7#*`_@AD%9*J~`jxi?4Rdr5(L%f4{mdG}mu7 z^Ox9P`{wU6U%PMX`-IMS>0ME}>8siTB}^;d^Q-<6Jpb$5)vYp{e{OV1zmR7CH{`-8 zq4tQ0ZuMt(NXoV^=Gyr1kJF;~OU*mJe4aCLr^Ci9j`$N^bDQL*y%78*dPi-s`b@Ua zSI;g;^R2w^@nyyI?A`P0x_9UJ#aw55VOTY%_gl+?t;Hr$#qqp<<+k=3Yp;l9=*|GTT#KT4Ci)?@QXEq={0>7rM4#*rS&3w!y*H=SF zyry$cNj!A>Vp?`;L9ElX`d7*#=8J-a>;hYhd{3sF63N{E*vxeCx@@hF??QY_uJn{z z+*Vh}ayg)%wfv|@k<8NT9V*W_Z4$(+SjDW1rcXOt)YV79JSR<%nPhu4;Qeox}| zx=62B=4QgB*tPs*b%IHx1BE6B|CDiPB?Dj z+Bd5@gt=noX^kfr4=gF27ojul7wf$e-QxNc6{;J1lv6z2PWLam=Pl`_xBehg?19y9 z!ftBMQmHt0+MtrtZhuM8u6ZqGH~6$wtvcT-aG&BaxYlE}Y-woZ>C*v*zZJ3t7CiNc zo(f*m69&a<`TmO7fmiMhZ)_X$J;!M|OCHKu%3|LdUF~;q#J+Bdadu-5w z<*znhtN(mOP3KzKR~h4{lTEusosZ8uFpI;pMEJOSVbR(JrNw7r4EJSseW`GrZ+rcW z`EmA=k1M`5m7V*!!g3F9_wzX#8GmC!lkSHm&2`b=IG=S=f#RNE)7NLsbMv*8oo018 z1}$cGJM&q&Y~J!XmsI1o`xY&pP_6xOtYtH`^fZYtL;1yM;M>t{KO*>kF;BdjG)( z`;(a;E4D=0Y+WO!ueQ40)iq^nx`l4skq6iFzFL1cx?AG!(FdDawU2c3-}=M|MBs79AJUgd=Ms4_(uHRmO3?x$)3lwcMNL5uPjSBD zUO#Wa=0m!|TQ(mlu#6DA@S|Zp-wmn8bV-4=EK+t3+iqTrev!j{apE+&)~of&XTui! z4|}j~f#aE<23E(JiVXMkl)Ew{aVQuGFKK(PcGcW-_fA`vYW557*6{mWJaMQ^TP@S% z%;(7|ei!PNSN~&)4dE-5mMOK4(dSc$HE=R_P}f;8sdfSL)~5MZ#tEthhpn;?Fp6*W zxn!;OlIxw{rD`vB-3=*zj~0mRscAo2U$fEo*{g+(>z03S%4MByWZZYN&F=kr{_Q>& zfAe4LW!Aa)PxIFW+0hN>lHIfAci0SZY*HhBs+HROu8s z@=2gR$+-8&DFwH-hpTtnT3E}@5!&-l`%CBpp%??pydS0RXKxo4+;2Zoo_^!_zjVp3 zuh~zCyMK?qztHuL&!zG=&)Cl$V*Un3=MK#^I90Rbxsb+#3YK@AUxatO5$jsG^ z!;WuGEjmq}$McwffA(--wRkPD;+SK(9n&wThJE!MSEe`olQp}%{U@=ZHhbbG$?CAn9}&#(Voxo%QA-^FC+89(o`)ONeBt}mK2Z&PXwU-tRWx8|$8 zV4Sw@-}!G+M{3rkw1@qWyEyg3#MOdRuRHW)Cw9LUEM#Z+Z`@EXt@A;E=|SR;7s_%! ztYf|(Pfln1qgx-q_dZMK*Fl^6j$M&)AFfYIzxD6GM$x_G6TkYac9`$FBR{wGcWR&i zJUO0w;l=!a_r91qbsB$FeKTWTmqOFQ1+RPLB+B;Kb6WU6e6ZZGj_u`(NR@B)6*3=7 z*e@}uysnSxi#S;RoTuPDyM_F%;AU^z2fMCcDT-K=xuiZacdfZcea*q8*)cJHpLV{` zxA-K_@Qq35vr^vD=?PP(>n0@rRxqFBzx01ZImh>Z-EpiM(J$&5PH+FHop)u;_C*~l zv}`=rPkUPPQSVddY1?Hhv}QGF2emuOr>*_}w844ls(0KxA!e#~PS{BRS`Tg<)vVxzXp*6L&RjvVKISHBbd=VoYMvwcNy-VX^~PX0T(V!zJK6yQD_ zF;k$FeZ|e0w>wX+nw@DGF!!p0)H~7c0%`XDXQQ(>8s6EGqWrqdMk~t=>O5@&8=n|7R3Cw@KU)6szB% z%#b&c_uUDh9m=N)b=%53@9@OTU!eBU)5`0P)9NE@<#-guolhJUC^D3B<+qYBvwpeJ z>W+yc`)S?Jk*kEZSK92k^)yPiZ`%&8!XEAOGYib@cJqC@@K$@4(Y`a5!X?#~m-R0& zeRSo&Vl_Q;uEn*+DD}SN6$hmXZEOvd8~Tdt_ZEAt(b~9vo7#E3FlB{2u|)RUALA_Z z^_ORUys)L?DxdF535h3tMw3kCCYdfO6`K@dc~Vktl3C#)o{eFa{~l~Vvv-@!llgay zRy(cPUgs|&eL;>_tbgL)%6pmmt%-h4)ylUfcmCrK@Mh;QHak*xl$U`)UXFnQ-i2)b zbFcl+J;wGw_n6xM++%M4bB|^FpL?v2Jeg#+ZhxS`wv~tJ^Oot;P1zDa^iL=qZN`=b z;vY9-%i;UH<+BUI?CFl?Yz0ha_ooYnFiK7~_|H07_rBP4341ny>EF%Sq?oooM3&*7 z?qI=Y$RzU=Rd4}F(D^xv;517%OD5M>$YOlc(=FKynC$+;1eKV*Ivw1MZ3qUyB zHf&~0hRV|w?bzg}*W0qOPS;ar6q;UX!=}Ylss<8PnqHvBC^&tm8JocL7dC8COlLGf z!t&FPXu^bDY}urk40IsE^|oyGOhWn)&V5@p2gaAv73|m&nV8KWV!urpg&>|dV#g-M zWM&6)iRAS6L5xDv^X=K#raRa%vV($Ci^;_WRnD9#+!IxVb$Ws)BirEJ7e02S+y6>G~mzLeqacuxT+lq``%qnYI)_IP)CYoEbf) zKXPO>CSTlX5Gn)zHnd#@8*<{&7HQ5*#7yus9$vFT3 delta 4218 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%0A$dtWK@(T)9*l-le6n`Acny*sD+Ku*y@ z{`Tu;Y1;>Ex)o*myawa#hvpDRpa z8~KZre^&ijU)t{R{{M~D%BkZ2<|jNg`!`eCw0eyOla$iuik)iDS8qR1zx>`SLs#dc zB0&?ac-$SH>cr)t-oG9m-=JvpZA;Ya-MM~idka$iw$5=}Zd^WPGH-vfap2uc z%Wl~%y!O$I?_YmT?z3Ya$EUGw-PxsI@6;0T-le;WVfK|~j+N~NGpoeQR=01Aw{5cf zns?+%^~8YppC8B%tp^ptj#n(gRb{XlQk(XI1twN~}) zuxsG^YM~b>f5hyoB7fV4ZpAlA9J?j-4o;Wl`91f`4T+aC4)2UQJ;$-R>d@ndy?WQ( zN>|n&4PALUrZR8Y=94#dr?97QFG;DrdHY$xwrMYqZ*ZIY)giZV=C&25Wmo9F;%b!2 z2?~EC?alOp>$j_w+xz4r)*JJu z&-s=o^(<;z|E5~e55)oA>>RnN2TGcF85kDGPIi1Q(;RTWJ>WiLd%%6B_JI4$?E&{$ zwg=p2z39p0ux`7uCfin?=>j%vEYt6pvc*AIc4jcv0yDM@h!~GKTNaqbg)n`3i#b~X z)8~7WFFw?rTz{W^dbI%?)G#XxHYui}hm$WpG@0II!KTG@^9e}R^v4!#hD;34LF~yr z&-tgnuwoOKo@B`;#l-Y#a^fqa=^HHBw3vSXn|$%1-1J|TZ0^j342)ARGTKiU2dSKF z#U{m^#|#qDoqpGf&6L@W4aCuz?r6Cdd$JQ!uB z>)Wt}GQU$|oXlt@F+IVSjct04GNbtPJvMAw%tmTR!W+~WML@y=)3t5cq?kK3;c|}5 zZ?)kZw&~eAjG_>Q&p`^$>mkYc>NAQ#`M@Ml}b>4`3k2Gc|A*$kN(UBEo^>HF>3w3tOa!94xx(hh6}%xnF@JjLnx4r~_8 zyMn+xt?5@lysyC!!*fFz#i!djvS~5@O@)Y*rZGxRp92ypEMS~|v4GKV`Y%T|Ek@Sq zs!nWXOef2x$2zf@G47r|#fi<7am(~mPHc{hdDD5E+3XmLr+YiIIWq2?-s{Zf$7nhI Wjx(DHW9M{17dBb8OB!qp3=9B%{ox1z