瀏覽代碼

PlaybackSpeedView: move code into own class

Carola Nitz 6 年之前
父節點
當前提交
c7147d20d2

+ 159 - 0
Resources/PlaybackSpeedView.xib

@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="PlaybackSpeedView" customModule="VLC" customModuleProvider="target">
+            <connections>
+                <outlet property="audioDelayIndicator" destination="7Ll-yU-MYC" id="oU6-5S-mFZ"/>
+                <outlet property="audioDelayLabel" destination="hdg-PF-74y" id="eed-3i-thi"/>
+                <outlet property="audioDelaySlider" destination="hjh-be-2Cl" id="TZX-6Y-jZD"/>
+                <outlet property="playbackSpeedIndicator" destination="Eii-kE-m3f" id="moH-XM-G5e"/>
+                <outlet property="playbackSpeedLabel" destination="kWD-cm-oD6" id="Okv-Hx-cbT"/>
+                <outlet property="playbackSpeedSlider" destination="j8Y-sC-HfA" id="7gJ-lC-weR"/>
+                <outlet property="sleepTimerButton" destination="80P-10-eTo" id="QA0-Ie-vVE"/>
+                <outlet property="spuDelayIndicator" destination="sc2-l1-qRC" id="q4Y-ec-oqM"/>
+                <outlet property="spuDelayLabel" destination="gIj-zk-5bi" id="Gr6-Jy-3sL"/>
+                <outlet property="spuDelaySlider" destination="VDI-ql-vCO" id="3Hm-Qg-DNZ"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="ori-Bs-ouD" userLabel="playbackSpeedView" customClass="PlaybackSpeedView" customModule="VLC" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+            <subviews>
+                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="TAe-Ad-Ihk">
+                    <rect key="frame" x="10" y="30" width="355" height="627"/>
+                    <subviews>
+                        <stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jwI-2J-crS">
+                            <rect key="frame" x="0.0" y="0.0" width="355" height="89.5"/>
+                            <subviews>
+                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Audio delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hdg-PF-74y">
+                                    <rect key="frame" x="0.0" y="0.0" width="325" height="89.5"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="0 ms" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7Ll-yU-MYC">
+                                    <rect key="frame" x="325" y="0.0" width="30" height="89.5"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </stackView>
+                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-5000" maxValue="5000" translatesAutoresizingMaskIntoConstraints="NO" id="hjh-be-2Cl" customClass="VLCResettingSlider">
+                            <rect key="frame" x="-2" y="89.5" width="359" height="90.5"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
+                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
+                                    <real key="value" value="0.0"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="playbackSliderActionWithSender:" destination="-1" eventType="valueChanged" id="eii-4j-Xu5"/>
+                            </connections>
+                        </slider>
+                        <stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2jk-tN-sXB">
+                            <rect key="frame" x="0.0" y="179" width="355" height="89.5"/>
+                            <subviews>
+                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Subtitles delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gIj-zk-5bi">
+                                    <rect key="frame" x="0.0" y="0.0" width="325" height="89.5"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="0 ms" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sc2-l1-qRC">
+                                    <rect key="frame" x="325" y="0.0" width="30" height="89.5"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                        </stackView>
+                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-5000" maxValue="5000" translatesAutoresizingMaskIntoConstraints="NO" id="VDI-ql-vCO" customClass="VLCResettingSlider">
+                            <rect key="frame" x="-2" y="268.5" width="359" height="91"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
+                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
+                                    <real key="value" value="0.0"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="playbackSliderActionWithSender:" destination="-1" eventType="valueChanged" id="2ys-wq-QSh"/>
+                            </connections>
+                        </slider>
+                        <stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TKK-I2-86j">
+                            <rect key="frame" x="0.0" y="358.5" width="355" height="89.5"/>
+                            <subviews>
+                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Playback speed" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kWD-cm-oD6">
+                                    <rect key="frame" x="0.0" y="0.0" width="323" height="89.5"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="1.00x" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Eii-kE-m3f">
+                                    <rect key="frame" x="323" y="0.0" width="32" height="89.5"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                        </stackView>
+                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-2" maxValue="2" translatesAutoresizingMaskIntoConstraints="NO" id="j8Y-sC-HfA" customClass="VLCResettingSlider">
+                            <rect key="frame" x="-2" y="448" width="359" height="90.5"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
+                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
+                                    <real key="value" value="0.0"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="playbackSliderActionWithSender:" destination="-1" eventType="valueChanged" id="j8M-vR-uJg"/>
+                            </connections>
+                        </slider>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="80P-10-eTo">
+                            <rect key="frame" x="0.0" y="537.5" width="355" height="89.5"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                            <state key="normal" title="Sleep Timer">
+                                <color key="titleColor" red="1" green="1" blue="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
+                                <color key="titleShadowColor" red="0.43529411759999997" green="0.4431372549" blue="0.47450980390000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            </state>
+                            <connections>
+                                <action selector="sleepTimerWithSender:" destination="-1" eventType="touchUpInside" id="de9-vr-VCB"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                </stackView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="TAe-Ad-Ihk" firstAttribute="trailing" secondItem="N7w-nS-oNM" secondAttribute="trailing" constant="-10" id="3Op-p5-JWb"/>
+                <constraint firstItem="N7w-nS-oNM" firstAttribute="bottom" secondItem="TAe-Ad-Ihk" secondAttribute="bottom" constant="10" id="9IK-VO-ZmF"/>
+                <constraint firstItem="TAe-Ad-Ihk" firstAttribute="top" secondItem="N7w-nS-oNM" secondAttribute="top" constant="10" id="WEc-CL-mXb"/>
+                <constraint firstItem="TAe-Ad-Ihk" firstAttribute="leading" secondItem="N7w-nS-oNM" secondAttribute="leading" constant="10" id="oVb-8b-1Vu"/>
+            </constraints>
+            <viewLayoutGuide key="safeArea" id="N7w-nS-oNM"/>
+            <connections>
+                <outlet property="audioDelayIndicator" destination="7Ll-yU-MYC" id="TUg-du-Ktv"/>
+                <outlet property="audioDelayLabel" destination="hdg-PF-74y" id="PUu-UB-u9u"/>
+                <outlet property="audioDelaySlider" destination="hjh-be-2Cl" id="ZLg-nb-d4X"/>
+                <outlet property="playbackSpeedIndicator" destination="Eii-kE-m3f" id="fJW-7H-MmK"/>
+                <outlet property="playbackSpeedLabel" destination="kWD-cm-oD6" id="oLM-sD-QWU"/>
+                <outlet property="playbackSpeedSlider" destination="j8Y-sC-HfA" id="LIO-kU-QgG"/>
+                <outlet property="sleepTimerButton" destination="80P-10-eTo" id="47c-uI-2yI"/>
+                <outlet property="spuDelayIndicator" destination="sc2-l1-qRC" id="mNW-LB-O5n"/>
+                <outlet property="spuDelayLabel" destination="gIj-zk-5bi" id="BtB-Nm-NBj"/>
+                <outlet property="spuDelaySlider" destination="VDI-ql-vCO" id="usr-lC-Vdz"/>
+            </connections>
+            <point key="canvasLocation" x="70" y="49"/>
+        </view>
+    </objects>
+</document>

+ 9 - 111
Resources/VLCMovieViewController~ipad.xib

@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" colorMatched="YES">
     <device id="ipad9_7" orientation="portrait">
         <adaptation id="fullscreen"/>
     </device>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -15,9 +15,6 @@
                 <outlet property="albumNameLabel" destination="305" id="308"/>
                 <outlet property="artistNameLabel" destination="303" id="306"/>
                 <outlet property="artworkImageView" destination="g3j-bZ-K3S" id="fPn-6f-Kez"/>
-                <outlet property="audioDelayIndicator" destination="FYO-Rd-Vjg" id="FVE-DI-BJ2"/>
-                <outlet property="audioDelayLabel" destination="bQc-dz-mB8" id="69P-Q3-3l3"/>
-                <outlet property="audioDelaySlider" destination="ahb-li-nqH" id="tQp-Zu-Sqd"/>
                 <outlet property="brightnessLabel" destination="148" id="165"/>
                 <outlet property="brightnessSlider" destination="147" id="163"/>
                 <outlet property="contrastLabel" destination="146" id="160"/>
@@ -28,9 +25,6 @@
                 <outlet property="hueLabel" destination="143" id="158"/>
                 <outlet property="hueSlider" destination="144" id="157"/>
                 <outlet property="movieView" destination="121" id="122"/>
-                <outlet property="playbackSpeedIndicator" destination="179" id="193"/>
-                <outlet property="playbackSpeedLabel" destination="181" id="194"/>
-                <outlet property="playbackSpeedSlider" destination="180" id="191"/>
                 <outlet property="playbackSpeedView" destination="176" id="197"/>
                 <outlet property="playingExternalView" destination="123" id="BVQ-JJ-Ckd"/>
                 <outlet property="resetVideoFilterButton" destination="142" id="175"/>
@@ -38,10 +32,6 @@
                 <outlet property="saturationSlider" destination="149" id="168"/>
                 <outlet property="scrubHelpLabel" destination="243" id="247"/>
                 <outlet property="scrubIndicatorView" destination="242" id="245"/>
-                <outlet property="sleepTimerButton" destination="aXd-S6-sb9" id="g5b-DC-APw"/>
-                <outlet property="spuDelayIndicator" destination="cTE-tb-Z89" id="Ll9-wY-xca"/>
-                <outlet property="spuDelayLabel" destination="NX8-Zc-K6Y" id="WLd-cA-fUn"/>
-                <outlet property="spuDelaySlider" destination="juX-HR-PqD" id="x4D-ki-Lwk"/>
                 <outlet property="statusLabel" destination="205" id="206"/>
                 <outlet property="trackNameLabel" destination="304" id="307"/>
                 <outlet property="videoFilterView" destination="141" id="156"/>
@@ -72,7 +62,7 @@
                         <bool key="isElement" value="YES"/>
                     </accessibility>
                 </view>
-                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" misplaced="YES" text="Track Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" id="304">
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" text="Track Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" id="304">
                     <rect key="frame" x="84" y="820" width="600" height="28"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
                     <fontDescription key="fontDescription" type="system" pointSize="23"/>
@@ -109,104 +99,12 @@
                     </subviews>
                     <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.60999999999999999" colorSpace="custom" customColorSpace="sRGB"/>
                 </view>
-                <view contentMode="scaleToFill" misplaced="YES" id="176" userLabel="Delays &amp; Speed" customClass="VLCFrostedGlasView">
-                    <rect key="frame" x="224" y="805" width="320" height="157"/>
+                <view contentMode="scaleToFill" id="176" userLabel="PlaybackspeedView" customClass="PlaybackSpeedView" customModule="VLC" customModuleProvider="target">
+                    <rect key="frame" x="224" y="705" width="320" height="157"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <subviews>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Audio delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="bQc-dz-mB8">
-                            <rect key="frame" x="20" y="7" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-5000" maxValue="5000" id="ahb-li-nqH" customClass="VLCResettingSlider">
-                            <rect key="frame" x="18" y="21" width="284" height="29"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
-                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
-                                    <real key="value" value="0.0"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                            <connections>
-                                <action selector="playbackSliderAction:" destination="-1" eventType="valueChanged" id="MB1-sB-W8m"/>
-                            </connections>
-                        </slider>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0 ms" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="FYO-Rd-Vjg">
-                            <rect key="frame" x="20" y="7" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Subtitles delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="NX8-Zc-K6Y">
-                            <rect key="frame" x="20" y="44" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-5000" maxValue="5000" id="juX-HR-PqD" customClass="VLCResettingSlider">
-                            <rect key="frame" x="18" y="58" width="284" height="29"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
-                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
-                                    <real key="value" value="0.0"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                            <connections>
-                                <action selector="playbackSliderAction:" destination="-1" eventType="valueChanged" id="acG-8w-Mgd"/>
-                            </connections>
-                        </slider>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0 ms" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="cTE-tb-Z89">
-                            <rect key="frame" x="20" y="44" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Playback speed" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="181">
-                            <rect key="frame" x="20" y="82" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-2" maxValue="2" id="180" customClass="VLCResettingSlider">
-                            <rect key="frame" x="18" y="96" width="284" height="29"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
-                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
-                                    <real key="value" value="0.0"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                            <connections>
-                                <action selector="playbackSliderAction:" destination="-1" eventType="valueChanged" id="4Xo-T4-hPJ"/>
-                            </connections>
-                        </slider>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="1.00x" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="179">
-                            <rect key="frame" x="20" y="82" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="aXd-S6-sb9">
-                            <rect key="frame" x="20" y="119" width="280" height="30"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                            <state key="normal" title="Sleep Timer">
-                                <color key="titleColor" cocoaTouchSystemColor="lightTextColor"/>
-                                <color key="titleShadowColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
-                            </state>
-                            <connections>
-                                <action selector="sleepTimer:" destination="-1" eventType="touchUpInside" id="2s3-Kx-4uh"/>
-                            </connections>
-                        </button>
-                    </subviews>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="string" keyPath="nibName" value="PlaybackSpeedView"/>
+                    </userDefinedRuntimeAttributes>
                 </view>
                 <view hidden="YES" userInteractionEnabled="NO" contentMode="scaleToFill" id="123" userLabel="Playing Externally View" customClass="PlayingExternallyView" customModule="VLC" customModuleProvider="target">
                     <rect key="frame" x="184" y="312" width="400" height="400"/>
@@ -223,7 +121,7 @@
                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     <nil key="highlightedColor"/>
                 </label>
-                <activityIndicatorView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" style="whiteLarge" id="1Bq-rl-k4J">
+                <activityIndicatorView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="whiteLarge" id="1Bq-rl-k4J">
                     <rect key="frame" x="366" y="542" width="37" height="37"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                 </activityIndicatorView>

+ 25 - 127
Resources/VLCMovieViewController~iphone.xib

@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
-    <device id="retina3_5" orientation="portrait">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES">
+    <device id="retina5_5" orientation="landscape">
         <adaptation id="fullscreen"/>
     </device>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -15,9 +15,6 @@
                 <outlet property="albumNameLabel" destination="280" id="285"/>
                 <outlet property="artistNameLabel" destination="279" id="283"/>
                 <outlet property="artworkImageView" destination="yK6-Ph-SVE" id="Cm9-7F-iYZ"/>
-                <outlet property="audioDelayIndicator" destination="SDv-JW-DMi" id="Krq-0k-T6o"/>
-                <outlet property="audioDelayLabel" destination="8cb-fw-YeF" id="KWQ-n9-3mr"/>
-                <outlet property="audioDelaySlider" destination="oQe-Uu-1HY" id="6Me-OE-Dpl"/>
                 <outlet property="brightnessLabel" destination="130" id="233"/>
                 <outlet property="brightnessSlider" destination="128" id="232"/>
                 <outlet property="contrastLabel" destination="132" id="141"/>
@@ -28,9 +25,6 @@
                 <outlet property="hueLabel" destination="134" id="234"/>
                 <outlet property="hueSlider" destination="133" id="235"/>
                 <outlet property="movieView" destination="91" id="93"/>
-                <outlet property="playbackSpeedIndicator" destination="185" id="197"/>
-                <outlet property="playbackSpeedLabel" destination="167" id="198"/>
-                <outlet property="playbackSpeedSlider" destination="168" id="M6M-8F-t8T"/>
                 <outlet property="playbackSpeedView" destination="165" id="208"/>
                 <outlet property="playingExternalView" destination="108" id="xbW-U2-ESN"/>
                 <outlet property="resetVideoFilterButton" destination="162" id="163"/>
@@ -38,10 +32,6 @@
                 <outlet property="saturationSlider" destination="135" id="152"/>
                 <outlet property="scrubHelpLabel" destination="246" id="249"/>
                 <outlet property="scrubIndicatorView" destination="241" id="247"/>
-                <outlet property="sleepTimerButton" destination="ime-8n-VJ9" id="n2P-yu-8en"/>
-                <outlet property="spuDelayIndicator" destination="IzS-81-KII" id="IXf-sX-Ier"/>
-                <outlet property="spuDelayLabel" destination="KeW-Xp-9I6" id="LMS-pz-Ajj"/>
-                <outlet property="spuDelaySlider" destination="JRI-0m-C0M" id="f8j-Iq-sH3"/>
                 <outlet property="statusLabel" destination="210" id="211"/>
                 <outlet property="trackNameLabel" destination="282" id="284"/>
                 <outlet property="videoFilterView" destination="117" id="147"/>
@@ -50,15 +40,15 @@
         </placeholder>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <view contentMode="scaleToFill" id="1">
-            <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+            <rect key="frame" x="0.0" y="0.0" width="736" height="414"/>
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
             <subviews>
                 <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" id="yK6-Ph-SVE">
-                    <rect key="frame" x="40" y="120" width="240" height="240"/>
+                    <rect key="frame" x="248" y="87" width="240" height="240"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                 </imageView>
                 <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Album Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" id="280">
-                    <rect key="frame" x="31" y="281" width="258" height="28"/>
+                    <rect key="frame" x="31" y="240" width="674" height="28"/>
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                     <fontDescription key="fontDescription" type="system" pointSize="14"/>
                     <color key="textColor" red="0.72000002861022949" green="0.72000002861022949" blue="0.72000002861022949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -66,14 +56,14 @@
                     <color key="shadowColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                 </label>
                 <view contentMode="scaleToFill" id="91" userLabel="Movie view">
-                    <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+                    <rect key="frame" x="0.0" y="0.0" width="736" height="414"/>
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                     <accessibility key="accessibilityConfiguration">
                         <bool key="isElement" value="YES"/>
                     </accessibility>
                 </view>
-                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" misplaced="YES" text="Track Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" id="282">
-                    <rect key="frame" x="31" y="347" width="257" height="28"/>
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" text="Track Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" id="282">
+                    <rect key="frame" x="31" y="297" width="673" height="28"/>
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                     <fontDescription key="fontDescription" type="system" pointSize="23"/>
                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -81,7 +71,7 @@
                     <color key="shadowColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                 </label>
                 <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" text="Artist Name" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" id="279">
-                    <rect key="frame" x="31" y="224" width="257" height="28"/>
+                    <rect key="frame" x="31" y="191" width="673" height="28"/>
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                     <fontDescription key="fontDescription" type="system" pointSize="23"/>
                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -89,19 +79,19 @@
                     <color key="shadowColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                 </label>
                 <label hidden="YES" opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Status Label" textAlignment="center" lineBreakMode="tailTruncation" minimumScaleFactor="0.5" id="210" customClass="VLCStatusLabel">
-                    <rect key="frame" x="61" y="229" width="199" height="22"/>
+                    <rect key="frame" x="270" y="196" width="199" height="22"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                     <fontDescription key="fontDescription" type="system" pointSize="17"/>
                     <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     <nil key="highlightedColor"/>
                     <color key="shadowColor" red="1" green="1" blue="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                 </label>
-                <activityIndicatorView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" style="whiteLarge" id="vR5-i9-KEJ">
-                    <rect key="frame" x="142" y="222" width="37" height="37"/>
+                <activityIndicatorView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="whiteLarge" id="vR5-i9-KEJ">
+                    <rect key="frame" x="350" y="189" width="37" height="37"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                 </activityIndicatorView>
                 <view hidden="YES" userInteractionEnabled="NO" contentMode="scaleToFill" id="108" userLabel="Playing Externally View" customClass="PlayingExternallyView" customModule="VLC" customModuleProvider="target">
-                    <rect key="frame" x="0.0" y="97" width="320" height="257"/>
+                    <rect key="frame" x="208" y="68" width="320" height="257"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                     <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
                     <userDefinedRuntimeAttributes>
@@ -109,18 +99,18 @@
                     </userDefinedRuntimeAttributes>
                 </view>
                 <view hidden="YES" contentMode="scaleToFill" id="241" userLabel="scrubbing indicator view" customClass="VLCFrostedGlasView">
-                    <rect key="frame" x="0.0" y="63" width="320" height="46"/>
+                    <rect key="frame" x="0.0" y="63" width="736" height="46"/>
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                     <subviews>
                         <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="High-Speed Scrubbing" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="244">
-                            <rect key="frame" x="20" y="3" width="280" height="21"/>
+                            <rect key="frame" x="20" y="3" width="696" height="21"/>
                             <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                             <fontDescription key="fontDescription" type="system" pointSize="13"/>
                             <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                             <nil key="highlightedColor"/>
                         </label>
                         <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Slide your finger down to adjust the scrubbing rate." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" id="246">
-                            <rect key="frame" x="0.0" y="21" width="320" height="21"/>
+                            <rect key="frame" x="0.0" y="21" width="736" height="21"/>
                             <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                             <fontDescription key="fontDescription" type="system" pointSize="13"/>
                             <color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -130,8 +120,8 @@
                     <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.60999999999999999" colorSpace="custom" customColorSpace="sRGB"/>
                 </view>
                 <view hidden="YES" contentMode="scaleToFill" id="117" userLabel="video filters view" customClass="VLCFrostedGlasView">
-                    <rect key="frame" x="0.0" y="254" width="320" height="198"/>
-                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
+                    <rect key="frame" x="208" y="205" width="320" height="198"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                     <subviews>
                         <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="1" minValue="0.0" maxValue="2" id="128" customClass="VLCSlider">
                             <rect key="frame" x="18" y="19" width="284" height="29"/>
@@ -220,104 +210,12 @@
                         </button>
                     </subviews>
                 </view>
-                <view hidden="YES" contentMode="scaleToFill" misplaced="YES" id="165" userLabel="speed delay Controls panel" customClass="VLCFrostedGlasView">
-                    <rect key="frame" x="0.0" y="206" width="320" height="163"/>
-                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <subviews>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Audio delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="8cb-fw-YeF">
-                            <rect key="frame" x="20" y="7" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0 ms" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="SDv-JW-DMi">
-                            <rect key="frame" x="20" y="7" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-5000" maxValue="5000" id="oQe-Uu-1HY" customClass="VLCResettingSlider">
-                            <rect key="frame" x="18" y="20" width="284" height="29"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
-                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
-                                    <real key="value" value="0.0"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                            <connections>
-                                <action selector="playbackSliderAction:" destination="-1" eventType="valueChanged" id="MaZ-VI-xre"/>
-                            </connections>
-                        </slider>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Subtitles delay" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="KeW-Xp-9I6">
-                            <rect key="frame" x="20" y="44" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0 ms" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="IzS-81-KII">
-                            <rect key="frame" x="20" y="44" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-5000" maxValue="5000" id="JRI-0m-C0M" customClass="VLCResettingSlider">
-                            <rect key="frame" x="18" y="58" width="284" height="29"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
-                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
-                                    <real key="value" value="0.0"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                            <connections>
-                                <action selector="playbackSliderAction:" destination="-1" eventType="valueChanged" id="NUV-tI-BV8"/>
-                            </connections>
-                        </slider>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Playback speed" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="167">
-                            <rect key="frame" x="20" y="83" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="1.00x" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="185">
-                            <rect key="frame" x="20" y="83" width="280" height="21"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="13"/>
-                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            <nil key="highlightedColor"/>
-                        </label>
-                        <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-2" maxValue="2" id="168" customClass="VLCResettingSlider">
-                            <rect key="frame" x="18" y="97" width="284" height="29"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <userDefinedRuntimeAttributes>
-                                <userDefinedRuntimeAttribute type="boolean" keyPath="resetOnDoubleTap" value="YES"/>
-                                <userDefinedRuntimeAttribute type="number" keyPath="defaultValue">
-                                    <real key="value" value="0.0"/>
-                                </userDefinedRuntimeAttribute>
-                            </userDefinedRuntimeAttributes>
-                            <connections>
-                                <action selector="playbackSliderAction:" destination="-1" eventType="valueChanged" id="6n6-9i-WXd"/>
-                            </connections>
-                        </slider>
-                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="ime-8n-VJ9">
-                            <rect key="frame" x="20" y="133" width="280" height="30"/>
-                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
-                            <state key="normal" title="Sleep Timer">
-                                <color key="titleColor" red="1" green="1" blue="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
-                                <color key="titleShadowColor" red="0.43529411764705883" green="0.44313725490196076" blue="0.47450980392156861" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                            </state>
-                            <connections>
-                                <action selector="sleepTimer:" destination="-1" eventType="touchUpInside" id="3DL-TN-OVO"/>
-                            </connections>
-                        </button>
-                    </subviews>
+                <view contentMode="scaleToFill" id="165" customClass="PlaybackSpeedView" customModule="VLC" customModuleProvider="target">
+                    <rect key="frame" x="208" y="159" width="320" height="163"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="string" keyPath="nibName" value="PlaybackSpeedView"/>
+                    </userDefinedRuntimeAttributes>
                 </view>
             </subviews>
             <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>

+ 124 - 0
Sources/PlaybackSpeedView.swift

@@ -0,0 +1,124 @@
+/*****************************************************************************
+ * PlaybaclSpeedView.swift
+ *
+ * Copyright © 2018 VLC authors and VideoLAN
+ * Copyright © 2018 Videolabs
+ *
+ * Authors: Carola Nitz <caro@videolan.org>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+@objc protocol PlaybackSpeedViewDelegate: NSObjectProtocol {
+    func playbackSpeedViewShouldResetIdleTimer(_ playbackSpeedView: PlaybackSpeedView)
+    func playbackSpeedViewSleepTimerHit(_ playbackSpeedView: PlaybackSpeedView)
+}
+
+class PlaybackSpeedView: VLCFrostedGlasView {
+
+    @IBInspectable var nibName: String?
+    @IBOutlet weak var playbackSpeedSlider: UISlider!
+    @IBOutlet weak var playbackSpeedLabel: UILabel!
+    @IBOutlet weak var playbackSpeedIndicator: UILabel!
+    @IBOutlet weak var audioDelaySlider: UISlider!
+    @IBOutlet weak var audioDelayLabel: UILabel!
+    @IBOutlet weak var audioDelayIndicator: UILabel!
+    @IBOutlet weak var spuDelaySlider: UISlider!
+    @IBOutlet weak var spuDelayLabel: UILabel!
+    @IBOutlet weak var spuDelayIndicator: UILabel!
+    @IBOutlet weak var sleepTimerButton: UIButton!
+    @objc weak var delegate: PlaybackSpeedViewDelegate?
+    private var sleepCountDownTimer: Timer?
+
+    let vpc = VLCPlaybackController.sharedInstance()
+
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        xibSetup()
+        playbackSpeedLabel.text = NSLocalizedString("PLAYBACK_SPEED", comment:"")
+        playbackSpeedSlider.accessibilityLabel = playbackSpeedLabel.text
+        audioDelayLabel.text = NSLocalizedString("AUDIO_DELAY", comment:"")
+        audioDelaySlider.accessibilityLabel = audioDelayLabel.text
+        spuDelayLabel.text = NSLocalizedString("SPU_DELAY", comment:"")
+        spuDelaySlider.accessibilityLabel = spuDelayLabel.text
+        sleepTimerButton.setTitle(NSLocalizedString("BUTTON_SLEEP_TIMER", comment:""), for: .normal)
+        sleepTimerButton.accessibilityLabel = sleepTimerButton.title(for: .normal)
+    }
+
+    func xibSetup() {
+        guard let view = loadViewFromNib() else { return }
+        view.frame = bounds
+        view.autoresizingMask =
+            [.flexibleWidth, .flexibleHeight]
+        addSubview(view)
+    }
+
+    func loadViewFromNib() -> PlaybackSpeedView? {
+        guard let nibName = nibName else { return nil }
+        let bundle = Bundle(for: type(of: self))
+        let nib = UINib(nibName: nibName, bundle: bundle)
+        return nib.instantiate(
+            withOwner: self,
+            options: nil).first as? PlaybackSpeedView
+    }
+
+    @objc func prepareForMediaPlayback(controller: VLCPlaybackController) {
+        let playbackRate = controller.playbackRate
+        playbackSpeedSlider.value = log2(playbackRate)
+        playbackSpeedIndicator.text = String(format: "%.2fx", playbackRate)
+
+        let audioDelay = controller.audioDelay
+        audioDelaySlider.value = audioDelay
+        audioDelayIndicator.text = String(format: "%d ms", audioDelay)
+
+        let subtitleDelay = controller.subtitleDelay
+        spuDelaySlider.value = subtitleDelay
+        spuDelayIndicator.text = String(format: "%d ms", subtitleDelay)
+    }
+
+    @objc func updateSleepTimerButton() {
+        var title = NSLocalizedString("BUTTON_SLEEP_TIMER", comment:"")
+
+        if vpc.sleepTimer.isValid {
+            let remainSeconds = vpc.sleepTimer.fireDate.timeIntervalSinceNow
+            let hour = remainSeconds / 3600
+            let minute = (remainSeconds - hour * 3600) / 60
+            let second = remainSeconds.truncatingRemainder(dividingBy: 60)
+            title = title.appendingFormat("  %02d:%02d:%02d", hour, minute, second)
+        } else {
+            sleepCountDownTimer?.invalidate()
+        }
+
+        sleepTimerButton.setTitle(title, for: .normal)
+    }
+
+    @objc func setupSleepTimerIfNecessary() {
+        if sleepCountDownTimer == nil || !sleepCountDownTimer!.isValid {
+            sleepCountDownTimer = Timer(timeInterval: 1, target: self, selector: #selector(updateSleepTimerButton), userInfo: nil, repeats: true)
+        }
+    }
+
+    @IBAction func sleepTimer(sender: UIButton) {
+        delegate?.playbackSpeedViewSleepTimerHit(self)
+    }
+
+    @IBAction func playbackSliderAction(sender: UISlider) {
+        if sender == playbackSpeedSlider {
+            let speed = exp2(sender.value)
+            vpc.playbackRate = speed
+            playbackSpeedIndicator.text = String(format: "%.2fx", speed)
+        } else if sender == audioDelaySlider {
+            let delay = round(sender.value / 50) * 50
+            vpc.audioDelay = delay
+            sender.setValue(delay, animated: false)
+            audioDelayIndicator.text = String(format: "%.0f ms", delay)
+        } else if sender == spuDelaySlider {
+            let delay = round(sender.value / 50) * 50
+            vpc.subtitleDelay = delay
+            sender.setValue(delay, animated: false)
+            spuDelayIndicator.text = String(format: "%.0f ms", delay)
+        }
+        delegate?.playbackSpeedViewShouldResetIdleTimer(self)
+    }
+
+}

+ 0 - 15
Sources/VLCMovieViewController.h

@@ -38,7 +38,6 @@ typedef NS_ENUM(NSInteger, VLCMovieJumpState) {
 
 @property (nonatomic, strong) IBOutlet UIView *movieView;
 @property (nonatomic, strong) IBOutlet VLCTimeNavigationTitleView *timeNavigationTitleView;
-@property (nonatomic, strong) IBOutlet UIButton *sleepTimerButton;
 @property (nonatomic, strong) IBOutlet VLCStatusLabel *statusLabel;
 
 @property (nonatomic, strong) IBOutlet VLCFrostedGlasView *videoFilterView;
@@ -54,17 +53,6 @@ typedef NS_ENUM(NSInteger, VLCMovieJumpState) {
 @property (nonatomic, strong) IBOutlet UISlider *gammaSlider;
 @property (nonatomic, strong) IBOutlet UIButton *resetVideoFilterButton;
 
-@property (nonatomic, strong) IBOutlet VLCFrostedGlasView *playbackSpeedView;
-@property (nonatomic, strong) IBOutlet UISlider *playbackSpeedSlider;
-@property (nonatomic, strong) IBOutlet UILabel *playbackSpeedLabel;
-@property (nonatomic, strong) IBOutlet UILabel *playbackSpeedIndicator;
-@property (nonatomic, strong) IBOutlet UISlider *audioDelaySlider;
-@property (nonatomic, strong) IBOutlet UILabel *audioDelayLabel;
-@property (nonatomic, strong) IBOutlet UILabel *audioDelayIndicator;
-@property (nonatomic, strong) IBOutlet UISlider *spuDelaySlider;
-@property (nonatomic, strong) IBOutlet UILabel *spuDelayLabel;
-@property (nonatomic, strong) IBOutlet UILabel *spuDelayIndicator;
-
 @property (nonatomic, strong) IBOutlet VLCFrostedGlasView *scrubIndicatorView;
 @property (nonatomic, strong) IBOutlet UILabel *currentScrubSpeedLabel;
 @property (nonatomic, strong) IBOutlet UILabel *scrubHelpLabel;
@@ -89,11 +77,8 @@ typedef NS_ENUM(NSInteger, VLCMovieJumpState) {
 - (IBAction)positionSliderDrag:(id)sender;
 - (IBAction)toggleTimeDisplay:(id)sender;
 
-- (IBAction)sleepTimer:(id)sender;
-
 - (IBAction)videoFilterSliderAction:(id)sender;
 
-- (IBAction)playbackSliderAction:(id)sender;
 - (IBAction)videoDimensionAction:(id)sender;
 
 - (void)toggleRepeatMode;

+ 23 - 66
Sources/VLCMovieViewController.m

@@ -2,7 +2,7 @@
  * VLCMovieViewController.m
  * VLC for iOS
  *****************************************************************************
- * Copyright (c) 2013-2017 VideoLAN. All rights reserved.
+ * Copyright (c) 2013-2018 VideoLAN. All rights reserved.
  * $Id$
  *
  * Authors: Felix Paul Kühne <fkuehne # videolan.org>
@@ -53,7 +53,7 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
   VLCPanTypeProjection
 };
 
-@interface VLCMovieViewController () <UIGestureRecognizerDelegate, VLCMultiSelectionViewDelegate, VLCEqualizerViewUIDelegate, VLCPlaybackControllerDelegate, VLCDeviceMotionDelegate, VLCRendererDiscovererManagerDelegate>
+@interface VLCMovieViewController () <UIGestureRecognizerDelegate, VLCMultiSelectionViewDelegate, VLCEqualizerViewUIDelegate, VLCPlaybackControllerDelegate, VLCDeviceMotionDelegate, VLCRendererDiscovererManagerDelegate, PlaybackSpeedViewDelegate>
 {
     BOOL _controlsHidden;
     BOOL _videoFiltersHidden;
@@ -101,7 +101,6 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
 
     UIView *_sleepTimerContainer;
     UIDatePicker *_sleepTimeDatePicker;
-    NSTimer *_sleepCountDownTimer;
 
     NSInteger _mediaDuration;
     NSInteger _numberOfTapSeek;
@@ -118,6 +117,7 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
 @property (nonatomic, strong) VLCMovieViewControlPanelView *controllerPanel;
 @property (nonatomic, strong) VLCService *services;
 @property (nonatomic, strong) IBOutlet PlayingExternallyView *playingExternalView;
+@property (nonatomic, strong) IBOutlet PlaybackSpeedView *playbackSpeedView;
 
 @end
 
@@ -162,16 +162,8 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
     _saturationSlider.accessibilityLabel = _saturationLabel.text;
     _gammaLabel.text = NSLocalizedString(@"VFILTER_GAMMA", nil);
     _gammaSlider.accessibilityLabel = _gammaLabel.text;
-    _playbackSpeedLabel.text = NSLocalizedString(@"PLAYBACK_SPEED", nil);
-    _playbackSpeedSlider.accessibilityLabel = _playbackSpeedLabel.text;
-    _audioDelayLabel.text = NSLocalizedString(@"AUDIO_DELAY", nil);
-    _audioDelaySlider.accessibilityLabel = _audioDelayLabel.text;
-    _spuDelayLabel.text = NSLocalizedString(@"SPU_DELAY", nil);
-    _spuDelaySlider.accessibilityLabel = _spuDelayLabel.text;
 
     _resetVideoFilterButton.accessibilityLabel = NSLocalizedString(@"VIDEO_FILTER_RESET_BUTTON", nil);
-    _sleepTimerButton.accessibilityLabel = NSLocalizedString(@"BUTTON_SLEEP_TIMER", nil);
-    [_sleepTimerButton setTitle:NSLocalizedString(@"BUTTON_SLEEP_TIMER", nil) forState:UIControlStateNormal];
 
     _multiSelectionView = [[VLCMultiSelectionMenuView alloc] init];
     _multiSelectionView.delegate = self;
@@ -183,6 +175,7 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
 
     self.playbackSpeedView.hidden = YES;
     _playbackSpeedViewHidden = YES;
+    _playbackSpeedView.delegate = self;
     NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
     [center addObserver:self selector:@selector(handleExternalScreenDidConnect:)
                    name:UIScreenDidConnectNotification object:nil];
@@ -799,6 +792,9 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
     if (_controlsHidden && !_videoFiltersHidden)
         _videoFiltersHidden = YES;
 
+    if (_controlsHidden && !_playbackSpeedViewHidden)
+        _playbackSpeedViewHidden = YES;
+
     if (_isTapSeeking)
         _numberOfTapSeek = 0;
 
@@ -1021,22 +1017,6 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
     [self.timeNavigationTitleView setNeedsLayout];
 }
 
-- (void)updateSleepTimerButton
-{
-    NSMutableString *title = [NSMutableString stringWithString:NSLocalizedString(@"BUTTON_SLEEP_TIMER", nil)];
-    if (_vpc.sleepTimer != nil && _vpc.sleepTimer.valid) {
-        int remainSeconds = (int)[_vpc.sleepTimer.fireDate timeIntervalSinceNow];
-        int hour = remainSeconds / 3600;
-        int minute = (remainSeconds - hour * 3600) / 60;
-        int second = remainSeconds % 60;
-        [title appendFormat:@"  %02d:%02d:%02d", hour, minute, second];
-    } else {
-        [_sleepCountDownTimer invalidate];
-    }
-
-    [_sleepTimerButton setTitle:title forState:UIControlStateNormal];
-}
-
 #pragma mark - playback controller delegation
 
 - (void)playbackPositionUpdated:(VLCPlaybackController *)controller
@@ -1059,17 +1039,7 @@ typedef NS_ENUM(NSInteger, VLCPanType) {
     self.timeNavigationTitleView.timeDisplayButton.accessibilityLabel = @"";
     [_equalizerView reloadData];
 
-    double playbackRate = controller.playbackRate;
-    self.playbackSpeedSlider.value = log2(playbackRate);
-    self.playbackSpeedIndicator.text = [NSString stringWithFormat:@"%.2fx", playbackRate];
-
-    float audioDelay = controller.audioDelay;
-    self.audioDelaySlider.value = audioDelay;
-    self.audioDelayIndicator.text = [NSString stringWithFormat:@"%d ms", (int) audioDelay];
-
-    float subtitleDelay = controller.subtitleDelay;
-    self.spuDelaySlider.value = subtitleDelay;
-    self.spuDelayIndicator.text = [NSString stringWithFormat:@"%d ms", (int) subtitleDelay];
+    [_playbackSpeedView prepareForMediaPlaybackWithController:controller];
 
     [self _resetIdleTimer];
 }
@@ -1183,7 +1153,7 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom
     [self _resetIdleTimer];
 }
 
-- (IBAction)sleepTimer:(id)sender
+- (void)showSleepTimer
 {
     if (!_playbackSpeedViewHidden)
         self.playbackSpeedView.hidden = _playbackSpeedViewHidden = YES;
@@ -1218,13 +1188,7 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom
 {
     [_vpc scheduleSleepTimerWithInterval:_sleepTimeDatePicker.countDownDuration];
 
-    if (_sleepCountDownTimer == nil || _sleepCountDownTimer.valid == NO) {
-        _sleepCountDownTimer = [NSTimer scheduledTimerWithTimeInterval:1
-                                                                   target:self
-                                                                 selector:@selector(updateSleepTimerButton)
-                                                                 userInfo:nil
-                                                                  repeats:YES];
-    }
+    [_playbackSpeedView setupSleepTimerIfNecessary];
     [self.statusLabel showStatusMessage:NSLocalizedString(@"SLEEP_TIMER_UPDATED", nil)];
     [self setControlsHidden:YES animated:YES];
 }
@@ -1630,26 +1594,6 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom
 }
 
 #pragma mark - playback view
-- (IBAction)playbackSliderAction:(UISlider *)sender
-{
-    if (sender == _playbackSpeedSlider) {
-        double speed = exp2(sender.value);
-        _vpc.playbackRate = speed;
-        self.playbackSpeedIndicator.text = [NSString stringWithFormat:@"%.2fx", speed];
-    } else if (sender == _audioDelaySlider) {
-        int delay = ((int) round(sender.value / 50.)) * 50;
-        _vpc.audioDelay = delay;
-        [sender setValue:delay animated:NO];
-        _audioDelayIndicator.text = [NSString stringWithFormat:@"%d ms", delay];
-    } else if (sender == _spuDelaySlider) {
-        int delay = (int) (round(sender.value / 50.)) * 50;
-        _vpc.subtitleDelay = delay;
-        [sender setValue:delay animated:NO];
-        _spuDelayIndicator.text = [NSString stringWithFormat:@"%d ms", delay];
-    }
-
-    [self _resetIdleTimer];
-}
 
 - (IBAction)videoDimensionAction:(id)sender
 {
@@ -1766,4 +1710,17 @@ currentMediaHasTrackToChooseFrom:(BOOL)currentMediaHasTrackToChooseFrom
 {
     [self showOnDisplay:_movieView];
 }
+
+#pragma mark - PlaybackSpeedViewDelegate
+
+- (void)playbackSpeedViewShouldResetIdleTimer:(PlaybackSpeedView *)playbackSpeedView
+{
+    [self _resetIdleTimer];
+}
+
+- (void)playbackSpeedViewSleepTimerHit:(PlaybackSpeedView *)playbackSpeedView
+{
+    [self showSleepTimer];
+}
+
 @end

+ 9 - 1
VLC.xcodeproj/project.pbxproj

@@ -18,6 +18,8 @@
 		41273A3D1A955C4100A2EF77 /* VLCMigrationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 41273A3B1A955C4100A2EF77 /* VLCMigrationViewController.xib */; };
 		413EC987201A329D00BF412F /* SortOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413EC986201A329D00BF412F /* SortOption.swift */; };
 		413EC98B201B4F2C00BF412F /* PresentationTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413EC98A201B4F2B00BF412F /* PresentationTheme.swift */; };
+		414327A521B6E55700B061F6 /* PlaybackSpeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 414327A421B6E55700B061F6 /* PlaybackSpeedView.swift */; };
+		414327A721B6E66E00B061F6 /* PlaybackSpeedView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 414327A621B6E66E00B061F6 /* PlaybackSpeedView.xib */; };
 		414396C22023316C005E3FAF /* AppearanceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 414396C12023316C005E3FAF /* AppearanceManager.swift */; };
 		4144156A20ECD2620078EC37 /* VLCSectionTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4144156920ECD2620078EC37 /* VLCSectionTableHeaderView.swift */; };
 		4144156C20ECE6330078EC37 /* VLCFileServerSectionTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4144156B20ECE6330078EC37 /* VLCFileServerSectionTableHeaderView.swift */; };
@@ -461,8 +463,8 @@
 		3B75A76DF6589FE678357D42 /* Pods-VLC-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-iOS/Pods-VLC-iOS.debug.xcconfig"; sourceTree = "<group>"; };
 		3E95DC30A81B2AF9F7442E00 /* Pods-VLC-iOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-iOSTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-iOSTests/Pods-VLC-iOSTests.debug.xcconfig"; sourceTree = "<group>"; };
 		402E6F0E5362B530B7909338 /* libPods-VLC-iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VLC-iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
-		41251ECB1FD0C5C100099110 /* VLC-iOS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "VLC-iOS-Bridging-Header.h"; path = "vlc-ios/VLC-iOS-Bridging-Header.h"; sourceTree = SOURCE_ROOT; };
 		411453B8219C48DA002D94E1 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
+		41251ECB1FD0C5C100099110 /* VLC-iOS-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "VLC-iOS-Bridging-Header.h"; path = "vlc-ios/VLC-iOS-Bridging-Header.h"; sourceTree = SOURCE_ROOT; };
 		41251ECE1FD0CF7900099110 /* AppCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppCoordinator.swift; path = Sources/Coordinators/AppCoordinator.swift; sourceTree = SOURCE_ROOT; };
 		41273A391A955C4100A2EF77 /* VLCMigrationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMigrationViewController.h; path = Sources/VLCMigrationViewController.h; sourceTree = SOURCE_ROOT; };
 		41273A3A1A955C4100A2EF77 /* VLCMigrationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMigrationViewController.m; path = Sources/VLCMigrationViewController.m; sourceTree = SOURCE_ROOT; };
@@ -470,6 +472,8 @@
 		412BE7521FC4947400ACCC42 /* VLCMediaSubcategory+VLCDragAndDrop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "VLCMediaSubcategory+VLCDragAndDrop.swift"; path = "Sources/VLCMediaSubcategory+VLCDragAndDrop.swift"; sourceTree = SOURCE_ROOT; };
 		413EC986201A329D00BF412F /* SortOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SortOption.swift; path = Sources/Coordinators/SortOption.swift; sourceTree = SOURCE_ROOT; };
 		413EC98A201B4F2B00BF412F /* PresentationTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationTheme.swift; sourceTree = "<group>"; };
+		414327A421B6E55700B061F6 /* PlaybackSpeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = PlaybackSpeedView.swift; path = Sources/PlaybackSpeedView.swift; sourceTree = "<group>"; };
+		414327A621B6E66E00B061F6 /* PlaybackSpeedView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = PlaybackSpeedView.xib; path = Resources/PlaybackSpeedView.xib; sourceTree = "<group>"; };
 		414396C12023316C005E3FAF /* AppearanceManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppearanceManager.swift; path = Sources/AppearanceManager.swift; sourceTree = SOURCE_ROOT; };
 		4144156920ECD2620078EC37 /* VLCSectionTableHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = VLCSectionTableHeaderView.swift; path = Sources/VLCSectionTableHeaderView.swift; sourceTree = "<group>"; };
 		4144156B20ECE6330078EC37 /* VLCFileServerSectionTableHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = VLCFileServerSectionTableHeaderView.swift; path = Sources/VLCFileServerSectionTableHeaderView.swift; sourceTree = "<group>"; };
@@ -1579,6 +1583,7 @@
 				41F9BC7A1F4F20E400268461 /* VLCTrackSelectorView.h */,
 				41F9BC7B1F4F20E400268461 /* VLCTrackSelectorView.m */,
 				8D43712C2056AF1600F36458 /* VLCRendererDiscovererManager.swift */,
+				414327A421B6E55700B061F6 /* PlaybackSpeedView.swift */,
 			);
 			name = Playback;
 			sourceTree = "<group>";
@@ -1798,6 +1803,7 @@
 				7DBBF190183AB4300009A339 /* VLCMovieViewController~ipad.xib */,
 				7DBBF191183AB4300009A339 /* VLCMovieViewController~iphone.xib */,
 				418108792142894A0046A931 /* PlayingExternallyView.xib */,
+				414327A621B6E66E00B061F6 /* PlaybackSpeedView.xib */,
 			);
 			name = XIBs;
 			sourceTree = "<group>";
@@ -2798,6 +2804,7 @@
 				7D5DD5C717590ABF001421E3 /* About Contents.html in Resources */,
 				7DBBF19B183AB4300009A339 /* VLCCloudStorageTableViewCell~iphone.xib in Resources */,
 				7D92897B1877467E009108FD /* VLCFirstStepsFourthPageViewController~iphone.xib in Resources */,
+				414327A721B6E66E00B061F6 /* PlaybackSpeedView.xib in Resources */,
 				7D1516461868D7E0004B18F3 /* VLCFirstStepsSixthPageViewController~iphone.xib in Resources */,
 				41273A3D1A955C4100A2EF77 /* VLCMigrationViewController.xib in Resources */,
 				41D7DD2120C1FC2D00AD94F6 /* VLCLabelCell.xib in Resources */,
@@ -3215,6 +3222,7 @@
 				41F9BC7C1F4F20E400268461 /* VLCTrackSelectorView.m in Sources */,
 				DD8F84311B00EB3B0009138A /* VLCPlaybackController+MediaLibrary.m in Sources */,
 				418B144720179C00000447AA /* MediaCategoryViewController.swift in Sources */,
+				414327A521B6E55700B061F6 /* PlaybackSpeedView.swift in Sources */,
 				41EB91DD1F7BFF8500821AA5 /* VLCMetadata.m in Sources */,
 				41DFC6C62100BAAF00EEC9E3 /* VLCDocumentClass.swift in Sources */,
 				DD3EFF551BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserDSM.m in Sources */,