diff --git a/gen/com/limelight/R.java b/gen/com/limelight/R.java index 0f98dead..8a61712a 100644 --- a/gen/com/limelight/R.java +++ b/gen/com/limelight/R.java @@ -35,18 +35,21 @@ or to a theme attribute in the form "?[package:][type:]na public static final int ic_launcher=0x7f020000; } public static final class id { - public static final int autoDec=0x7f080005; - public static final int config1080p30Selected=0x7f080009; - public static final int config1080p60Selected=0x7f08000a; - public static final int config720p30Selected=0x7f080007; - public static final int config720p60Selected=0x7f080008; - public static final int hardwareDec=0x7f080006; + public static final int autoDec=0x7f080006; + public static final int bitrateLabel=0x7f08000c; + public static final int bitrateSeekBar=0x7f08000d; + public static final int config1080p30Selected=0x7f08000a; + public static final int config1080p60Selected=0x7f08000b; + public static final int config720p30Selected=0x7f080008; + public static final int config720p60Selected=0x7f080009; + public static final int decoderConfigGroup=0x7f080003; + public static final int hardwareDec=0x7f080007; public static final int hostTextView=0x7f080000; public static final int pairButton=0x7f080002; - public static final int softwareDec=0x7f080004; + public static final int softwareDec=0x7f080005; public static final int statusButton=0x7f080001; - public static final int streamConfigGroup=0x7f080003; - public static final int surfaceView=0x7f08000b; + public static final int streamConfigGroup=0x7f080004; + public static final int surfaceView=0x7f08000e; } public static final class layout { public static final int activity_connection=0x7f030000; diff --git a/libs/limelight-common.jar b/libs/limelight-common.jar index 4dad3c62..ae7f3b41 100644 Binary files a/libs/limelight-common.jar and b/libs/limelight-common.jar differ diff --git a/res/layout/activity_connection.xml b/res/layout/activity_connection.xml index d8eabccc..580f562d 100644 --- a/res/layout/activity_connection.xml +++ b/res/layout/activity_connection.xml @@ -45,12 +45,13 @@ android:text="Pair with PC" /> + + + + diff --git a/src/com/limelight/Connection.java b/src/com/limelight/Connection.java index 57288c36..e2fbab37 100644 --- a/src/com/limelight/Connection.java +++ b/src/com/limelight/Connection.java @@ -20,6 +20,8 @@ import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.RadioButton; +import android.widget.SeekBar; +import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import android.app.Activity; @@ -33,6 +35,8 @@ public class Connection extends Activity { private SharedPreferences prefs; private RadioButton rbutton720p30, rbutton720p60, rbutton1080p30, rbutton1080p60; private RadioButton forceSoftDec, autoDec, forceHardDec; + private SeekBar bitrateSlider; + private TextView bitrateLabel; private static final String DEFAULT_HOST = ""; public static final String HOST_KEY = "hostText"; @@ -42,6 +46,7 @@ public class Connection extends Activity { SharedPreferences.Editor editor = prefs.edit(); editor.putString(Connection.HOST_KEY, this.hostText.getText().toString()); + editor.putInt(Game.BITRATE_PREF_STRING, bitrateSlider.getProgress()); editor.apply(); super.onPause(); @@ -66,12 +71,18 @@ public class Connection extends Activity { this.forceSoftDec = (RadioButton) findViewById(R.id.softwareDec); this.autoDec = (RadioButton) findViewById(R.id.autoDec); this.forceHardDec = (RadioButton) findViewById(R.id.hardwareDec); + this.bitrateLabel = (TextView) findViewById(R.id.bitrateLabel); + this.bitrateSlider = (SeekBar) findViewById(R.id.bitrateSeekBar); prefs = getSharedPreferences(Game.PREFS_FILE_NAME, Context.MODE_MULTI_PROCESS); this.hostText.setText(prefs.getString(Connection.HOST_KEY, Connection.DEFAULT_HOST)); 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; + + bitrateSlider.setMax(Game.BITRATE_CEILING); + bitrateSlider.setProgress(prefs.getInt(Game.BITRATE_PREF_STRING, Game.DEFAULT_BITRATE)); + updateBitrateLabel(); rbutton720p30.setChecked(false); rbutton720p60.setChecked(false); @@ -124,22 +135,30 @@ public class Connection extends Activity { if (buttonView == rbutton720p30) { prefs.edit().putInt(Game.WIDTH_PREF_STRING, 1280). putInt(Game.HEIGHT_PREF_STRING, 720). - putInt(Game.REFRESH_RATE_PREF_STRING, 30).commit(); + putInt(Game.REFRESH_RATE_PREF_STRING, 30). + putInt(Game.BITRATE_PREF_STRING, Game.BITRATE_DEFAULT_720_30).commit(); + bitrateSlider.setProgress(Game.BITRATE_DEFAULT_720_30); } else if (buttonView == rbutton720p60) { prefs.edit().putInt(Game.WIDTH_PREF_STRING, 1280). putInt(Game.HEIGHT_PREF_STRING, 720). - putInt(Game.REFRESH_RATE_PREF_STRING, 60).commit(); + putInt(Game.REFRESH_RATE_PREF_STRING, 60). + putInt(Game.BITRATE_PREF_STRING, Game.BITRATE_DEFAULT_720_60).commit(); + bitrateSlider.setProgress(Game.BITRATE_DEFAULT_720_60); } else if (buttonView == rbutton1080p30) { prefs.edit().putInt(Game.WIDTH_PREF_STRING, 1920). putInt(Game.HEIGHT_PREF_STRING, 1080). - putInt(Game.REFRESH_RATE_PREF_STRING, 30).commit(); + putInt(Game.REFRESH_RATE_PREF_STRING, 30). + putInt(Game.BITRATE_PREF_STRING, Game.BITRATE_DEFAULT_1080_30).commit(); + bitrateSlider.setProgress(Game.BITRATE_DEFAULT_1080_30); } else if (buttonView == rbutton1080p60) { prefs.edit().putInt(Game.WIDTH_PREF_STRING, 1920). putInt(Game.HEIGHT_PREF_STRING, 1080). - putInt(Game.REFRESH_RATE_PREF_STRING, 60).commit(); + putInt(Game.REFRESH_RATE_PREF_STRING, 60). + putInt(Game.BITRATE_PREF_STRING, Game.BITRATE_DEFAULT_1080_60).commit(); + bitrateSlider.setProgress(Game.BITRATE_DEFAULT_1080_60); } else if (buttonView == forceSoftDec) { prefs.edit().putInt(Game.DECODER_PREF_STRING, Game.FORCE_SOFTWARE_DECODER).commit(); @@ -160,6 +179,45 @@ public class Connection extends Activity { forceHardDec.setOnCheckedChangeListener(occl); autoDec.setOnCheckedChangeListener(occl); + this.bitrateSlider.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, + boolean fromUser) { + + // Verify the user's selection + if (fromUser) { + int floor; + if (rbutton720p30.isChecked()) { + floor = Game.BITRATE_FLOOR_720_30; + } + else if (rbutton720p60.isChecked()){ + floor = Game.BITRATE_FLOOR_720_60; + } + else if (rbutton1080p30.isChecked()){ + floor = Game.BITRATE_FLOOR_1080_30; + } + else /*if (rbutton1080p60.isChecked())*/ { + floor = Game.BITRATE_FLOOR_1080_60; + } + + if (progress < floor) { + seekBar.setProgress(floor); + return; + } + } + + updateBitrateLabel(); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + }); + this.statusButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { @@ -240,4 +298,7 @@ public class Connection extends Activity { } + private void updateBitrateLabel() { + bitrateLabel.setText(bitrateSlider.getProgress()+" Mbps"); + } } diff --git a/src/com/limelight/Game.java b/src/com/limelight/Game.java index b151e810..fbf2f269 100644 --- a/src/com/limelight/Game.java +++ b/src/com/limelight/Game.java @@ -63,11 +63,25 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM public static final String HEIGHT_PREF_STRING = "ResV"; 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 int BITRATE_FLOOR_720_30 = 4; + public static final int BITRATE_FLOOR_720_60 = 8; + public static final int BITRATE_FLOOR_1080_30 = 10; + public static final int BITRATE_FLOOR_1080_60 = 20; + + public static final int BITRATE_DEFAULT_720_30 = 7; + public static final int BITRATE_DEFAULT_720_60 = 10; + public static final int BITRATE_DEFAULT_1080_30 = 16; + public static final int BITRATE_DEFAULT_1080_60 = 30; + + public static final int BITRATE_CEILING = 50; public static final int DEFAULT_WIDTH = 1280; public static final int DEFAULT_HEIGHT = 720; 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 int FORCE_HARDWARE_DECODER = -1; public static final int AUTOSELECT_DECODER = 0; @@ -116,10 +130,11 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM break; } - int refreshRate; + 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(); @@ -130,7 +145,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM // Start the connection conn = new NvConnection(Game.this.getIntent().getStringExtra("host"), Game.this, - new StreamConfiguration(width, height, refreshRate)); + new StreamConfiguration(width, height, refreshRate, bitrate * 1000)); keybTranslator = new KeyboardTranslator(conn); controllerHandler = new ControllerHandler(conn);