From d6d30f021de3b538c4e970a2ee7341bf6aaa0211 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Sun, 28 Dec 2014 21:42:18 -0500 Subject: [PATCH] started implementing on-screen controls - directional pad works - a,b,x,y work --- Limelight.xcodeproj/project.pbxproj | 6 + .../AButton.imageset/Contents.json | 23 +++ .../AButton.imageset/a_button-1.png | Bin 0 -> 1057 bytes .../AButton.imageset/a_button-2.png | Bin 0 -> 1057 bytes .../AButton.imageset/a_button.png | Bin 0 -> 1057 bytes .../BButton.imageset/Contents.json | 23 +++ .../BButton.imageset/b_button-1.png | Bin 0 -> 1053 bytes .../BButton.imageset/b_button-2.png | Bin 0 -> 1053 bytes .../BButton.imageset/b_button.png | Bin 0 -> 1053 bytes .../DownButton.imageset/Contents.json | 23 +++ .../DownButton.imageset/down-1.png | Bin 0 -> 455 bytes .../DownButton.imageset/down-2.png | Bin 0 -> 455 bytes .../DownButton.imageset/down.png | Bin 0 -> 455 bytes .../LeftButton.imageset/Contents.json | 23 +++ .../LeftButton.imageset/left-1.png | Bin 0 -> 525 bytes .../LeftButton.imageset/left-2.png | Bin 0 -> 525 bytes .../LeftButton.imageset/left.png | Bin 0 -> 525 bytes .../RightButton.imageset/Contents.json | 23 +++ .../RightButton.imageset/right-1.png | Bin 0 -> 549 bytes .../RightButton.imageset/right-2.png | Bin 0 -> 549 bytes .../RightButton.imageset/right.png | Bin 0 -> 549 bytes .../UpButton.imageset/Contents.json | 23 +++ .../UpButton.imageset/up-1.png | Bin 0 -> 452 bytes .../UpButton.imageset/up-2.png | Bin 0 -> 452 bytes .../Images.xcassets/UpButton.imageset/up.png | Bin 0 -> 452 bytes .../XButton.imageset/Contents.json | 23 +++ .../XButton.imageset/x_button-1.png | Bin 0 -> 1078 bytes .../XButton.imageset/x_button-2.png | Bin 0 -> 1078 bytes .../XButton.imageset/x_button.png | Bin 0 -> 1078 bytes .../YButton.imageset/Contents.json | 23 +++ .../YButton.imageset/y_button-1.png | Bin 0 -> 969 bytes .../YButton.imageset/y_button-2.png | Bin 0 -> 969 bytes .../YButton.imageset/y_button.png | Bin 0 -> 969 bytes Limelight/Input/OnScreenControls.h | 16 ++ Limelight/Input/OnScreenControls.m | 193 ++++++++++++++++++ Limelight/Input/StreamView.h | 2 + Limelight/Input/StreamView.m | 11 +- Limelight/Stream/StreamManager.m | 1 + .../StreamFrameViewController.m | 2 + 39 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 Limelight/Images.xcassets/AButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/AButton.imageset/a_button-1.png create mode 100644 Limelight/Images.xcassets/AButton.imageset/a_button-2.png create mode 100644 Limelight/Images.xcassets/AButton.imageset/a_button.png create mode 100644 Limelight/Images.xcassets/BButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/BButton.imageset/b_button-1.png create mode 100644 Limelight/Images.xcassets/BButton.imageset/b_button-2.png create mode 100644 Limelight/Images.xcassets/BButton.imageset/b_button.png create mode 100644 Limelight/Images.xcassets/DownButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/DownButton.imageset/down-1.png create mode 100644 Limelight/Images.xcassets/DownButton.imageset/down-2.png create mode 100644 Limelight/Images.xcassets/DownButton.imageset/down.png create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/left-1.png create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/left-2.png create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/left.png create mode 100644 Limelight/Images.xcassets/RightButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/RightButton.imageset/right-1.png create mode 100644 Limelight/Images.xcassets/RightButton.imageset/right-2.png create mode 100644 Limelight/Images.xcassets/RightButton.imageset/right.png create mode 100644 Limelight/Images.xcassets/UpButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/UpButton.imageset/up-1.png create mode 100644 Limelight/Images.xcassets/UpButton.imageset/up-2.png create mode 100644 Limelight/Images.xcassets/UpButton.imageset/up.png create mode 100644 Limelight/Images.xcassets/XButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/XButton.imageset/x_button-1.png create mode 100644 Limelight/Images.xcassets/XButton.imageset/x_button-2.png create mode 100644 Limelight/Images.xcassets/XButton.imageset/x_button.png create mode 100644 Limelight/Images.xcassets/YButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/YButton.imageset/y_button-1.png create mode 100644 Limelight/Images.xcassets/YButton.imageset/y_button-2.png create mode 100644 Limelight/Images.xcassets/YButton.imageset/y_button.png create mode 100644 Limelight/Input/OnScreenControls.h create mode 100644 Limelight/Input/OnScreenControls.m diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index e0ebc145..e181c636 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ FB290DC419B2E98F004C83CF /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DC319B2E98F004C83CF /* libxml2.dylib */; }; FB290E7919B37D81004C83CF /* iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7819B37D81004C83CF /* iPad.storyboard */; }; FB290E7B19B38036004C83CF /* iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7A19B38036004C83CF /* iPhone.storyboard */; }; + FB4678ED1A50C40900377732 /* OnScreenControls.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678EC1A50C40900377732 /* OnScreenControls.m */; }; FB7E794419C8B71B00A15F68 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB7E794319C8B71B00A15F68 /* libiconv.dylib */; }; FB89462819F646E200339C8A /* CryptoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460619F646E200339C8A /* CryptoManager.m */; }; FB89462919F646E200339C8A /* mkcert.c in Sources */ = {isa = PBXBuildFile; fileRef = FB89460719F646E200339C8A /* mkcert.c */; }; @@ -106,6 +107,8 @@ FB290DC319B2E98F004C83CF /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; FB290E7819B37D81004C83CF /* iPad.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPad.storyboard; sourceTree = SOURCE_ROOT; }; FB290E7A19B38036004C83CF /* iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPhone.storyboard; sourceTree = SOURCE_ROOT; }; + FB4678EB1A50C40900377732 /* OnScreenControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OnScreenControls.h; sourceTree = ""; }; + FB4678EC1A50C40900377732 /* OnScreenControls.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OnScreenControls.m; sourceTree = ""; }; FB7E794319C8B71B00A15F68 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; FB89460519F646E200339C8A /* CryptoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoManager.h; sourceTree = ""; }; FB89460619F646E200339C8A /* CryptoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CryptoManager.m; sourceTree = ""; }; @@ -392,6 +395,8 @@ FB89460B19F646E200339C8A /* ControllerSupport.m */, FB89460C19F646E200339C8A /* StreamView.h */, FB89460D19F646E200339C8A /* StreamView.m */, + FB4678EB1A50C40900377732 /* OnScreenControls.h */, + FB4678EC1A50C40900377732 /* OnScreenControls.m */, ); path = Input; sourceTree = ""; @@ -768,6 +773,7 @@ FB89463619F646E200339C8A /* StreamFrameViewController.m in Sources */, FB89462819F646E200339C8A /* CryptoManager.m in Sources */, FB89462E19F646E200339C8A /* PairManager.m in Sources */, + FB4678ED1A50C40900377732 /* OnScreenControls.m in Sources */, FB290D0019B2C406004C83CF /* main.m in Sources */, FBD3494319FC9C04002D2A60 /* AppManager.m in Sources */, FB89462A19F646E200339C8A /* ControllerSupport.m in Sources */, diff --git a/Limelight/Images.xcassets/AButton.imageset/Contents.json b/Limelight/Images.xcassets/AButton.imageset/Contents.json new file mode 100644 index 00000000..429e86f4 --- /dev/null +++ b/Limelight/Images.xcassets/AButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "a_button.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "a_button-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "a_button-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/AButton.imageset/a_button-1.png b/Limelight/Images.xcassets/AButton.imageset/a_button-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b6d68d6e8e84e723a7fed9d7df4750442ed571 GIT binary patch literal 1057 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 PU|{fc^>bP0l+XkKtk2;g literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/BButton.imageset/b_button-2.png b/Limelight/Images.xcassets/BButton.imageset/b_button-2.png new file mode 100644 index 0000000000000000000000000000000000000000..18649f4660860b3bcaa2fdf5440090d2296b1941 GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0y~yUl8uT>Mmow%=Ty zZ+4Z?%vZd zQ-Jl|%ikB-R!#F;{=Smqo&Cjky1%{7Zmsk^*i`26;JApC$_lM-9md8=t#j0qH{S4_ z=XNl+F}*cij7iRzk9B{8F~dyP(8zw>)!Iz&AMErx{DGgz#@6M0h*X}+riBGb2{G*) zc@6>(Un=f;_KGF-obycK!%XK*J2nLHbMKjZz`Fh3`NsxA+5kd1DP--9=6W*@AX{7P!|Ce7<^-tPpqFgr#XUrcE#y`wc>)>y{K(Mr?k zY;E3|)+Z*`CF>50=sXb2QFwgt@{9?O-(1+pm%O7Zdk6Pt$D*Bg{>rb3ottq#GJ9*3 zzH8GDea{x&52uo}r=RY3WvH0ja%kTFHw-OmXKXt5elumdk+(hm>g%t|SFN&p|NVFV z_19n1_Mgu%*(H*c+avqkm?`5*zJ<)b>)(GKo+VJ|w4dS3^UwS&A<3#ue+AMQ&7^w! z_MOk#8pV~^`IlkC?YH~xy$@a+_L}9wGSPQmtMXeuvi{}R5VqQsbAhvcfziwwg$8zp zXibO7FEbR%v@Ub_EWiA6^{QWMZszQh;9+|| z?etS~$KH;fdA*xoAM4mKW%s#rKMfb`iqP4|B^)5Cxa54#!DBo-ZsvSj8KGk*qP4`| zQ7@RyRk_z9{PDoCPnH&X;8=3+&muqPv&5eaWe?(CL1;Ru)S=zY4{y znk{f8%5dJb37p(6;oKis);K0J^OEyZQj1ow)xTq4 PU|{fc^>bP0l+XkKtk2;g literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/BButton.imageset/b_button.png b/Limelight/Images.xcassets/BButton.imageset/b_button.png new file mode 100644 index 0000000000000000000000000000000000000000..18649f4660860b3bcaa2fdf5440090d2296b1941 GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0y~yUl8uT>Mmow%=Ty zZ+4Z?%vZd zQ-Jl|%ikB-R!#F;{=Smqo&Cjky1%{7Zmsk^*i`26;JApC$_lM-9md8=t#j0qH{S4_ z=XNl+F}*cij7iRzk9B{8F~dyP(8zw>)!Iz&AMErx{DGgz#@6M0h*X}+riBGb2{G*) zc@6>(Un=f;_KGF-obycK!%XK*J2nLHbMKjZz`Fh3`NsxA+5kd1DP--9=6W*@AX{7P!|Ce7<^-tPpqFgr#XUrcE#y`wc>)>y{K(Mr?k zY;E3|)+Z*`CF>50=sXb2QFwgt@{9?O-(1+pm%O7Zdk6Pt$D*Bg{>rb3ottq#GJ9*3 zzH8GDea{x&52uo}r=RY3WvH0ja%kTFHw-OmXKXt5elumdk+(hm>g%t|SFN&p|NVFV z_19n1_Mgu%*(H*c+avqkm?`5*zJ<)b>)(GKo+VJ|w4dS3^UwS&A<3#ue+AMQ&7^w! z_MOk#8pV~^`IlkC?YH~xy$@a+_L}9wGSPQmtMXeuvi{}R5VqQsbAhvcfziwwg$8zp zXibO7FEbR%v@Ub_EWiA6^{QWMZszQh;9+|| z?etS~$KH;fdA*xoAM4mKW%s#rKMfb`iqP4|B^)5Cxa54#!DBo-ZsvSj8KGk*qP4`| zQ7@RyRk_z9{PDoCPnH&X;8=3+&muqPv&5eaWe?(CL1;Ru)S=zY4{y znk{f8%5dJb37p(6;oKis);K0J^OEyZQj1ow)xTq4 PU|{fc^>bP0l+XkKtk2;g literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/DownButton.imageset/Contents.json b/Limelight/Images.xcassets/DownButton.imageset/Contents.json new file mode 100644 index 00000000..e57d1fe7 --- /dev/null +++ b/Limelight/Images.xcassets/DownButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "down.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "down-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "down-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/DownButton.imageset/down-1.png b/Limelight/Images.xcassets/DownButton.imageset/down-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0557ceec9a9a84d8d805e02d80ba588c9bc0dfee GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0y~yV6bIiVDRQ(V_;x7EZJ|$z`z*l>EaktaqI0JL%t>l z0oH)NgqM;lJUAMS11edpqrAPX`yV7)Fz~AGb>FZhH0^mLGWaU|E9chn)!@KP*ky_@Vyb zqX*fIM-Ni636toPKy~L+`^|2PPM+eGs^#>;u1z$Omy7m4f*W%)BNSun}dO z*1gWYUdlgt$*oN~=O114y?n>#V(#sGp?gX~L&XoxXjmC`cK*Dk-AvZ`Dai%X6Q;eh zZQ0GXxp$4+ImTmi*rYNRG(w13+;gA*R8%pjTx{Z7uDI~z@3>8qQg0fv7+BhSr#`Z{ zw@>f;sf*P`lfHAR+1)y*6c821z`&qe;u=vBoS#-wo>-L1kW{Icl#`#Il2WOcTvS<5 plCPJUo0y)e7vSe^Wa65aoS%|fw1Tbv9RmXcgQu&X%Q~loCIABuz@7jA literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/DownButton.imageset/down-2.png b/Limelight/Images.xcassets/DownButton.imageset/down-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0557ceec9a9a84d8d805e02d80ba588c9bc0dfee GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0y~yV6bIiVDRQ(V_;x7EZJ|$z`z*l>EaktaqI0JL%t>l z0oH)NgqM;lJUAMS11edpqrAPX`yV7)Fz~AGb>FZhH0^mLGWaU|E9chn)!@KP*ky_@Vyb zqX*fIM-Ni636toPKy~L+`^|2PPM+eGs^#>;u1z$Omy7m4f*W%)BNSun}dO z*1gWYUdlgt$*oN~=O114y?n>#V(#sGp?gX~L&XoxXjmC`cK*Dk-AvZ`Dai%X6Q;eh zZQ0GXxp$4+ImTmi*rYNRG(w13+;gA*R8%pjTx{Z7uDI~z@3>8qQg0fv7+BhSr#`Z{ zw@>f;sf*P`lfHAR+1)y*6c821z`&qe;u=vBoS#-wo>-L1kW{Icl#`#Il2WOcTvS<5 plCPJUo0y)e7vSe^Wa65aoS%|fw1Tbv9RmXcgQu&X%Q~loCIABuz@7jA literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/DownButton.imageset/down.png b/Limelight/Images.xcassets/DownButton.imageset/down.png new file mode 100644 index 0000000000000000000000000000000000000000..0557ceec9a9a84d8d805e02d80ba588c9bc0dfee GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0y~yV6bIiVDRQ(V_;x7EZJ|$z`z*l>EaktaqI0JL%t>l z0oH)NgqM;lJUAMS11edpqrAPX`yV7)Fz~AGb>FZhH0^mLGWaU|E9chn)!@KP*ky_@Vyb zqX*fIM-Ni636toPKy~L+`^|2PPM+eGs^#>;u1z$Omy7m4f*W%)BNSun}dO z*1gWYUdlgt$*oN~=O114y?n>#V(#sGp?gX~L&XoxXjmC`cK*Dk-AvZ`Dai%X6Q;eh zZQ0GXxp$4+ImTmi*rYNRG(w13+;gA*R8%pjTx{Z7uDI~z@3>8qQg0fv7+BhSr#`Z{ zw@>f;sf*P`lfHAR+1)y*6c821z`&qe;u=vBoS#-wo>-L1kW{Icl#`#Il2WOcTvS<5 plCPJUo0y)e7vSe^Wa65aoS%|fw1Tbv9RmXcgQu&X%Q~loCIABuz@7jA literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/LeftButton.imageset/Contents.json b/Limelight/Images.xcassets/LeftButton.imageset/Contents.json new file mode 100644 index 00000000..b5b34f59 --- /dev/null +++ b/Limelight/Images.xcassets/LeftButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "left.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "left-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "left-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/LeftButton.imageset/left-1.png b/Limelight/Images.xcassets/LeftButton.imageset/left-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab41503b3f3fc957dceadbc47b4bd76be89932b GIT binary patch literal 525 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 literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/RightButton.imageset/right-2.png b/Limelight/Images.xcassets/RightButton.imageset/right-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c717a8dcbc939499c07c0ce4984ac0367cfa249d GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0y~yVDM&OV6f$2V_;x-YC6S?fq`+er;B4q#jUq@*5(~H z5Mcjc+)&2lhUcPCqVtmuy3Vu^@bbQ!2k&XR3M{_ifl5guHawH`yur~p<_v=eyzuz-CtF0~O)IV$4%iBi`c;-(@ zm@xldlPfQqrQ6?Qi&&av&iqdbY*hW6-EWp1dnoF_p6al9&;5lq94q{zB)NIQfpv~s zbAP*;NiS+Bbcl^fR|HY92aod|WBmGlf8v=0woa*6&(<;D(mA!n=JcCfEc z=v!`m>EN96ysFJ>ttL+6+Gcg#QE5iFSg(n}`#(CK2`V$|gASZ1@=|S>n5MnBdE)bf z%FP=?A{I1ly!uX|X=7OH!p4o)rIi|4SEjf!a)&ARGKg*YWtX;L)hfS(?@K#G&upol zEbW}ceEZF@2^q7`iQ?-&>u7(8A5T-G@yGywq08t9$? literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/RightButton.imageset/right.png b/Limelight/Images.xcassets/RightButton.imageset/right.png new file mode 100644 index 0000000000000000000000000000000000000000..c717a8dcbc939499c07c0ce4984ac0367cfa249d GIT binary patch literal 549 zcmeAS@N?(olHy`uVBq!ia0y~yVDM&OV6f$2V_;x-YC6S?fq`+er;B4q#jUq@*5(~H z5Mcjc+)&2lhUcPCqVtmuy3Vu^@bbQ!2k&XR3M{_ifl5guHawH`yur~p<_v=eyzuz-CtF0~O)IV$4%iBi`c;-(@ zm@xldlPfQqrQ6?Qi&&av&iqdbY*hW6-EWp1dnoF_p6al9&;5lq94q{zB)NIQfpv~s zbAP*;NiS+Bbcl^fR|HY92aod|WBmGlf8v=0woa*6&(<;D(mA!n=JcCfEc z=v!`m>EN96ysFJ>ttL+6+Gcg#QE5iFSg(n}`#(CK2`V$|gASZ1@=|S>n5MnBdE)bf z%FP=?A{I1ly!uX|X=7OH!p4o)rIi|4SEjf!a)&ARGKg*YWtX;L)hfS(?@K#G&upol zEbW}ceEZF@2^q7`iQ?-&>u7(8A5T-G@yGywq08t9$? literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/UpButton.imageset/Contents.json b/Limelight/Images.xcassets/UpButton.imageset/Contents.json new file mode 100644 index 00000000..523b6d71 --- /dev/null +++ b/Limelight/Images.xcassets/UpButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "up-1.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "up.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "up-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/UpButton.imageset/up-1.png b/Limelight/Images.xcassets/UpButton.imageset/up-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b194ede9056d6d1af9d5daaf42d9c1658e1463 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0y~yV6bIiVDRB!V_;yoC$qnofq^l|)5S5Q;?~<+)>%gk z1dbKTCiW-&VUSnc;Wg9fxW`OA^`fVz_If*?no`{|rSrH;;!XBC&si5=NdGuo@~EB5 z)F^G1&S}5OdG=RJ|NgqZdr_M3&l8zCJ65eSPra~vVsYE_)Sr`>Zn(uw7P`S^a>0R_ z7fP&LFnih0jN9KPFN(FDHKF$Y{Nsgx7H07Cn$Jnl+wqXC_&_g9K}Ll@$@S8B?+4yH zxV{+h+|Rx^<^Anr)-WRwhCx|t#bZT|7JDUpIyXNlxbc7U+l==64OGvhR3xMBmBk@XGP%u*%7t;Z0{QK6vxs!iPx* z7Cv}%VBf=}gZmylI=JrP#fI2}i<#wH-MQ~^_si`OUB|XZY#rYomT>MmmT>-kZR*V1 zCi@;P{ibg_L#5M7-&l}=fkC&#HKHUqKdq!Zu_%=xsZuW~CqF+WrBW}ssIs6WUoSH^ kF+Ei;z|Y;t#5FHDKP9zj1zY_)1_lNOPgg&ebxsLQ0Dv66?f?J) literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/UpButton.imageset/up-2.png b/Limelight/Images.xcassets/UpButton.imageset/up-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b194ede9056d6d1af9d5daaf42d9c1658e1463 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0y~yV6bIiVDRB!V_;yoC$qnofq^l|)5S5Q;?~<+)>%gk z1dbKTCiW-&VUSnc;Wg9fxW`OA^`fVz_If*?no`{|rSrH;;!XBC&si5=NdGuo@~EB5 z)F^G1&S}5OdG=RJ|NgqZdr_M3&l8zCJ65eSPra~vVsYE_)Sr`>Zn(uw7P`S^a>0R_ z7fP&LFnih0jN9KPFN(FDHKF$Y{Nsgx7H07Cn$Jnl+wqXC_&_g9K}Ll@$@S8B?+4yH zxV{+h+|Rx^<^Anr)-WRwhCx|t#bZT|7JDUpIyXNlxbc7U+l==64OGvhR3xMBmBk@XGP%u*%7t;Z0{QK6vxs!iPx* z7Cv}%VBf=}gZmylI=JrP#fI2}i<#wH-MQ~^_si`OUB|XZY#rYomT>MmmT>-kZR*V1 zCi@;P{ibg_L#5M7-&l}=fkC&#HKHUqKdq!Zu_%=xsZuW~CqF+WrBW}ssIs6WUoSH^ kF+Ei;z|Y;t#5FHDKP9zj1zY_)1_lNOPgg&ebxsLQ0Dv66?f?J) literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/UpButton.imageset/up.png b/Limelight/Images.xcassets/UpButton.imageset/up.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b194ede9056d6d1af9d5daaf42d9c1658e1463 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0y~yV6bIiVDRB!V_;yoC$qnofq^l|)5S5Q;?~<+)>%gk z1dbKTCiW-&VUSnc;Wg9fxW`OA^`fVz_If*?no`{|rSrH;;!XBC&si5=NdGuo@~EB5 z)F^G1&S}5OdG=RJ|NgqZdr_M3&l8zCJ65eSPra~vVsYE_)Sr`>Zn(uw7P`S^a>0R_ z7fP&LFnih0jN9KPFN(FDHKF$Y{Nsgx7H07Cn$Jnl+wqXC_&_g9K}Ll@$@S8B?+4yH zxV{+h+|Rx^<^Anr)-WRwhCx|t#bZT|7JDUpIyXNlxbc7U+l==64OGvhR3xMBmBk@XGP%u*%7t;Z0{QK6vxs!iPx* z7Cv}%VBf=}gZmylI=JrP#fI2}i<#wH-MQ~^_si`OUB|XZY#rYomT>MmmT>-kZR*V1 zCi@;P{ibg_L#5M7-&l}=fkC&#HKHUqKdq!Zu_%=xsZuW~CqF+WrBW}ssIs6WUoSH^ kF+Ei;z|Y;t#5FHDKP9zj1zY_)1_lNOPgg&ebxsLQ0Dv66?f?J) literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/XButton.imageset/Contents.json b/Limelight/Images.xcassets/XButton.imageset/Contents.json new file mode 100644 index 00000000..82e66ef9 --- /dev/null +++ b/Limelight/Images.xcassets/XButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "x_button-1.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "x_button.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "x_button-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/XButton.imageset/x_button-1.png b/Limelight/Images.xcassets/XButton.imageset/x_button-1.png new file mode 100644 index 0000000000000000000000000000000000000000..125ce38ef01f1a282ea8f9721efac9840d337898 GIT binary patch literal 1078 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 g{M?O9T=SCiQ&Njou+_g~U|?YIboFyt=akR{0Hz + +@interface OnScreenControls : NSObject + +- (id) initWithView:(UIView*)view; +- (void) handleTouchDownEvent:(UIEvent*)event; +- (void) handleTouchUpEvent:(UIEvent*) event; +@end diff --git a/Limelight/Input/OnScreenControls.m b/Limelight/Input/OnScreenControls.m new file mode 100644 index 00000000..8104d1b2 --- /dev/null +++ b/Limelight/Input/OnScreenControls.m @@ -0,0 +1,193 @@ +// +// OnScreenControls.m +// Limelight +// +// Created by Diego Waxemberg on 12/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "OnScreenControls.h" +#include "Limelight.h" + +#define UPDATE_BUTTON(x, y) (buttonFlags = \ +(y) ? (buttonFlags | (x)) : (buttonFlags & ~(x))) + +@implementation OnScreenControls { + UIView* _view; + BOOL shouldDrawControls; + CALayer* _aButton; + CALayer* _bButton; + CALayer* _xButton; + CALayer* _yButton; + CALayer* _upButton; + CALayer* _downButton; + CALayer* _leftButton; + CALayer* _rightButton; + + short buttonFlags; + short leftStickX, leftStickY; + short rightStickX, rightStickY; + char leftTrigger, rightTrigger; +} + +static const float BUTTON_SIZE = 50; +static const float BUTTON_DIST = 20; +static float BUTTON_CENTER_X; +static float BUTTON_CENTER_Y; + +static const float D_PAD_SHORT = 50; +static const float D_PAD_LONG = 65; +static const float D_PAD_DIST = 15; +static float D_PAD_CENTER_X; +static float D_PAD_CENTER_Y; + +- (id) initWithView:(UIView*)view { + self = [self init]; + _view = view; + shouldDrawControls = YES; + + D_PAD_CENTER_X = _view.frame.size.width * .15; + D_PAD_CENTER_Y = _view.frame.size.height * .75; + BUTTON_CENTER_X = _view.frame.size.width * .85; + BUTTON_CENTER_Y = _view.frame.size.height * .75; + + [self drawButtons]; + return self; +} + +- (void) drawButtons { + // create A button + _aButton = [CALayer layer]; + _aButton.frame = CGRectMake(BUTTON_CENTER_X - BUTTON_SIZE / 2, BUTTON_CENTER_Y + BUTTON_DIST, BUTTON_SIZE, BUTTON_SIZE); + _aButton.contents = (id) [UIImage imageNamed:@"AButton"].CGImage; + [_view.layer addSublayer:_aButton]; + + // create B button + _bButton = [CALayer layer]; + _bButton.frame = CGRectMake(BUTTON_CENTER_X + BUTTON_DIST, BUTTON_CENTER_Y - BUTTON_SIZE / 2, BUTTON_SIZE, BUTTON_SIZE); + _bButton.contents = (id) [UIImage imageNamed:@"BButton"].CGImage; + [_view.layer addSublayer:_bButton]; + + // create X Button + _xButton = [CALayer layer]; + _xButton.frame = CGRectMake(BUTTON_CENTER_X - BUTTON_DIST - BUTTON_SIZE, BUTTON_CENTER_Y - BUTTON_SIZE / 2, BUTTON_SIZE, BUTTON_SIZE); + _xButton.contents = (id) [UIImage imageNamed:@"XButton"].CGImage; + [_view.layer addSublayer:_xButton]; + + // create Y Button + _yButton = [CALayer layer]; + _yButton.frame = CGRectMake(BUTTON_CENTER_X - BUTTON_SIZE / 2, BUTTON_CENTER_Y - BUTTON_DIST - BUTTON_SIZE, BUTTON_SIZE, BUTTON_SIZE); + _yButton.contents = (id) [UIImage imageNamed:@"YButton"].CGImage; + [_view.layer addSublayer:_yButton]; + + // create Down button + _downButton = [CALayer layer]; + _downButton.frame = CGRectMake(D_PAD_CENTER_X - D_PAD_SHORT / 2, D_PAD_CENTER_Y + D_PAD_DIST, D_PAD_SHORT, D_PAD_LONG); + _downButton.contents = (id) [UIImage imageNamed:@"DownButton"].CGImage; + [_view.layer addSublayer:_downButton]; + + // create Right button + _rightButton = [CALayer layer]; + _rightButton.frame = CGRectMake(D_PAD_CENTER_X + D_PAD_DIST, D_PAD_CENTER_Y - D_PAD_SHORT / 2, D_PAD_LONG, D_PAD_SHORT); + _rightButton.contents = (id) [UIImage imageNamed:@"RightButton"].CGImage; + [_view.layer addSublayer:_rightButton]; + + // create Up button + _upButton = [CALayer layer]; + _upButton.frame = CGRectMake(D_PAD_CENTER_X - D_PAD_SHORT / 2, D_PAD_CENTER_Y - D_PAD_DIST - D_PAD_LONG, D_PAD_SHORT, D_PAD_LONG); + _upButton.contents = (id) [UIImage imageNamed:@"UpButton"].CGImage; + [_view.layer addSublayer:_upButton]; + + // create Left button + _leftButton = [CALayer layer]; + _leftButton.frame = CGRectMake(D_PAD_CENTER_X - D_PAD_DIST - D_PAD_LONG, D_PAD_CENTER_Y - D_PAD_SHORT / 2, D_PAD_LONG, D_PAD_SHORT); + _leftButton.contents = (id) [UIImage imageNamed:@"LeftButton"].CGImage; + [_view.layer addSublayer:_leftButton]; +} + +- (void)handleTouchDownEvent:(UIEvent*)event { + for (UITouch* touch in [event allTouches]) { + CGPoint touchLocation = [touch locationInView:_view]; + + if ([_aButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(A_FLAG, 1); + } else if ([_bButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(B_FLAG, 1); + } else if ([_xButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(X_FLAG, 1); + } else if ([_yButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(Y_FLAG, 1); + } else if ([_upButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(UP_FLAG, 1); + } else if ([_downButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(DOWN_FLAG, 1); + } else if ([_leftButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(LEFT_FLAG, 1); + } else if ([_rightButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(RIGHT_FLAG, 1); + } + /* + + UPDATE_BUTTON(LB_FLAG, gamepad.leftShoulder.pressed); + UPDATE_BUTTON(RB_FLAG, gamepad.rightShoulder.pressed); + + leftStickX = gamepad.leftThumbstick.xAxis.value * 0x7FFE; + leftStickY = gamepad.leftThumbstick.yAxis.value * 0x7FFE; + + rightStickX = gamepad.rightThumbstick.xAxis.value * 0x7FFE; + rightStickY = gamepad.rightThumbstick.yAxis.value * 0x7FFE; + + leftTrigger = gamepad.leftTrigger.value * 0xFF; + rightTrigger = gamepad.rightTrigger.value * 0xFF; + */ + // We call LiSendControllerEvent while holding a lock to prevent + // multiple simultaneous calls since this function isn't thread safe. + } + LiSendControllerEvent(buttonFlags, leftTrigger, rightTrigger, + leftStickX, leftStickY, rightStickX, rightStickY); +} + +- (void)handleTouchUpEvent:(UIEvent*)event { + + for (UITouch* touch in [event allTouches]) { + CGPoint touchLocation = [touch locationInView:_view]; + + if ([_aButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(A_FLAG, 0); + } else if ([_bButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(B_FLAG, 0); + } else if ([_xButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(X_FLAG, 0); + } else if ([_yButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(Y_FLAG, 0); + } else if ([_upButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(UP_FLAG, 0); + } else if ([_downButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(DOWN_FLAG, 0); + } else if ([_leftButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(LEFT_FLAG, 0); + } else if ([_rightButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(RIGHT_FLAG, 0); + } + /* + UPDATE_BUTTON(LB_FLAG, gamepad.leftShoulder.pressed); + UPDATE_BUTTON(RB_FLAG, gamepad.rightShoulder.pressed); + + leftStickX = gamepad.leftThumbstick.xAxis.value * 0x7FFE; + leftStickY = gamepad.leftThumbstick.yAxis.value * 0x7FFE; + + rightStickX = gamepad.rightThumbstick.xAxis.value * 0x7FFE; + rightStickY = gamepad.rightThumbstick.yAxis.value * 0x7FFE; + + leftTrigger = gamepad.leftTrigger.value * 0xFF; + rightTrigger = gamepad.rightTrigger.value * 0xFF; + */ + // We call LiSendControllerEvent while holding a lock to prevent + // multiple simultaneous calls since this function isn't thread safe. + } + LiSendControllerEvent(buttonFlags, leftTrigger, rightTrigger, + leftStickX, leftStickY, rightStickX, rightStickY); +} + + +@end diff --git a/Limelight/Input/StreamView.h b/Limelight/Input/StreamView.h index b722ed91..a7aa4e5f 100644 --- a/Limelight/Input/StreamView.h +++ b/Limelight/Input/StreamView.h @@ -10,4 +10,6 @@ @interface StreamView : UIView +- (void) setupOnScreenControls; + @end diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index 905d84d3..748ed989 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -8,17 +8,23 @@ #import "StreamView.h" #include +#import "OnScreenControls.h" @implementation StreamView { CGPoint touchLocation; BOOL touchMoved; + OnScreenControls* onScreenControls; +} + +- (void) setupOnScreenControls { + onScreenControls = [[OnScreenControls alloc] initWithView:self]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; touchLocation = [touch locationInView:self]; touchMoved = false; - + [onScreenControls handleTouchDownEvent:event]; NSLog(@"Touch down"); } @@ -53,8 +59,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Touch up"); - - + [onScreenControls handleTouchUpEvent:event]; if (!touchMoved) { if ([[event allTouches] count] == 2) { NSLog(@"Sending right mouse button press"); diff --git a/Limelight/Stream/StreamManager.m b/Limelight/Stream/StreamManager.m index bc648009..8ccc07c5 100644 --- a/Limelight/Stream/StreamManager.m +++ b/Limelight/Stream/StreamManager.m @@ -10,6 +10,7 @@ #import "CryptoManager.h" #import "HttpManager.h" #import "Utils.h" +#import "OnScreenControls.h" @implementation StreamManager { StreamConfiguration* _config; diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index 30c315ad..20b9ebe6 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -11,6 +11,7 @@ #import "VideoDecoderRenderer.h" #import "StreamManager.h" #import "ControllerSupport.h" +#import "StreamView.h" #include #include @@ -63,6 +64,7 @@ [self.stageLabel setText:@"Waiting for first frame..."]; [self.stageLabel sizeToFit]; }); + [(StreamView*)self.view setupOnScreenControls]; } - (void)connectionTerminated:(long)errorCode {