Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal
# Conflicts: # VoidLink/Base.lproj/iPad.storyboard # VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents
This commit is contained in:
commit
7691d2c0eb
16 files changed
+363
-66
No files matched your search
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="EVd-wq-ego">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="EVd-wq-ego">
|
||||||
<device id="ipad11_0rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
|
<device id="ipad11_0rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
|
||||||
<capability name="Image references" minToolsVersion="12.0"/>
|
<capability name="Image references" minToolsVersion="12.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
@@ -989,6 +989,30 @@
|
|||||||
<constraint firstAttribute="width" constant="380" id="dB2-bt-l6n"/>
|
<constraint firstAttribute="width" constant="380" id="dB2-bt-l6n"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</stackView>
|
</stackView>
|
||||||
|
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="LGh-Lc-Odp" userLabel="emulatedControllerTypeStack">
|
||||||
|
<rect key="frame" x="420" y="973" width="380" height="56.5"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Emulated Controller Type" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JTl-un-QJJ" userLabel="emulatedControllerTypeLabel">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="380" height="20.5"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
|
<color key="textColor" red="0.93902439019999995" green="0.9625305918" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="JaY-XA-1V6" userLabel="emulatedControllerTypeSelector">
|
||||||
|
<rect key="frame" x="0.0" y="25.5" width="380" height="32"/>
|
||||||
|
<segments>
|
||||||
|
<segment title="Xbox 360"/>
|
||||||
|
<segment title="DS4"/>
|
||||||
|
<segment title="Both"/>
|
||||||
|
</segments>
|
||||||
|
<color key="tintColor" red="0.6716768742" green="0.61711704730000005" blue="0.99902987480000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<color key="selectedSegmentTintColor" systemColor="linkColor"/>
|
||||||
|
</segmentedControl>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="380" id="G6i-GX-IiT"/>
|
||||||
|
</constraints>
|
||||||
|
</stackView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
</view>
|
</view>
|
||||||
@@ -1011,6 +1035,8 @@
|
|||||||
<outlet property="customResolutionSwitch" destination="E5w-kK-dOo" id="hrt-v2-8dY"/>
|
<outlet property="customResolutionSwitch" destination="E5w-kK-dOo" id="hrt-v2-8dY"/>
|
||||||
<outlet property="enableGraphsLabel" destination="ccm-n2-PXi" id="oZu-xY-lT6"/>
|
<outlet property="enableGraphsLabel" destination="ccm-n2-PXi" id="oZu-xY-lT6"/>
|
||||||
<outlet property="enableGraphsSwitch" destination="3Z9-RB-w4i" id="uHV-kg-9g3"/>
|
<outlet property="enableGraphsSwitch" destination="3Z9-RB-w4i" id="uHV-kg-9g3"/>
|
||||||
|
<outlet property="emulatedControllerTypeSelector" destination="JaY-XA-1V6" id="aU2-ps-esq"/>
|
||||||
|
<outlet property="emulatedControllerTypeStack" destination="LGh-Lc-Odp" id="Fny-rC-9zP"/>
|
||||||
<outlet property="enableOswForNativeTouchSwitch" destination="Zmq-Kv-Nmp" id="f6j-0V-ldT"/>
|
<outlet property="enableOswForNativeTouchSwitch" destination="Zmq-Kv-Nmp" id="f6j-0V-ldT"/>
|
||||||
<outlet property="enableOswSwitchStack" destination="SkS-ft-peB" id="n3M-EK-U74"/>
|
<outlet property="enableOswSwitchStack" destination="SkS-ft-peB" id="n3M-EK-U74"/>
|
||||||
<outlet property="externalDisplayModeSelector" destination="VWB-YB-Ptj" id="0ak-pc-evb"/>
|
<outlet property="externalDisplayModeSelector" destination="VWB-YB-Ptj" id="0ak-pc-evb"/>
|
||||||
|
|||||||
@@ -1560,6 +1560,30 @@
|
|||||||
<constraint firstAttribute="width" constant="380" id="fjm-Ch-JrJ"/>
|
<constraint firstAttribute="width" constant="380" id="fjm-Ch-JrJ"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</stackView>
|
</stackView>
|
||||||
|
<stackView verifyAmbiguity="off" opaque="NO" contentMode="scaleToFill" ambiguous="YES" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="XoT-d0-QUQ" userLabel="emulatedControllerTypeStack">
|
||||||
|
<rect key="frame" x="437" y="1471" width="380" height="56.5"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Emulated Controller Type" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dUM-r9-0Bo" userLabel="emulatedControllerTypeLabel">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="380" height="20.5"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
|
<color key="textColor" red="0.93902439019999995" green="0.9625305918" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="q6v-Jb-ysy" userLabel="emulatedControllerTypeSelector">
|
||||||
|
<rect key="frame" x="0.0" y="25.5" width="380" height="32"/>
|
||||||
|
<segments>
|
||||||
|
<segment title="Xbox 360"/>
|
||||||
|
<segment title="DS4"/>
|
||||||
|
<segment title="Both"/>
|
||||||
|
</segments>
|
||||||
|
<color key="tintColor" red="0.6716768742" green="0.61711704730000005" blue="0.99902987480000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<color key="selectedSegmentTintColor" systemColor="linkColor"/>
|
||||||
|
</segmentedControl>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="380" id="Hwq-t1-6V0"/>
|
||||||
|
</constraints>
|
||||||
|
</stackView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
</view>
|
</view>
|
||||||
@@ -1580,6 +1604,8 @@
|
|||||||
<outlet property="codecSelector" destination="5Y7-To-ca2" id="Kmt-sp-eXj"/>
|
<outlet property="codecSelector" destination="5Y7-To-ca2" id="Kmt-sp-eXj"/>
|
||||||
<outlet property="codecStack" destination="cVe-Uk-gXv" id="826-Tv-rMl"/>
|
<outlet property="codecStack" destination="cVe-Uk-gXv" id="826-Tv-rMl"/>
|
||||||
<outlet property="customResolutionSwitch" destination="kRO-HO-zKO" id="ZUP-Yd-QDY"/>
|
<outlet property="customResolutionSwitch" destination="kRO-HO-zKO" id="ZUP-Yd-QDY"/>
|
||||||
|
<outlet property="emulatedControllerTypeSelector" destination="q6v-Jb-ysy" id="o1B-2n-vOR"/>
|
||||||
|
<outlet property="emulatedControllerTypeStack" destination="XoT-d0-QUQ" id="dGV-0G-xF9"/>
|
||||||
<outlet property="enableOswForNativeTouchSwitch" destination="MaZ-Wu-LNS" id="sYj-e8-eKn"/>
|
<outlet property="enableOswForNativeTouchSwitch" destination="MaZ-Wu-LNS" id="sYj-e8-eKn"/>
|
||||||
<outlet property="enableOswSwitchStack" destination="ULn-2e-7se" id="0BI-1o-JMp"/>
|
<outlet property="enableOswSwitchStack" destination="ULn-2e-7se" id="0BI-1o-JMp"/>
|
||||||
<outlet property="externalDisplayModeSelector" destination="Tue-Qh-8zP" id="YCO-TO-Dda"/>
|
<outlet property="externalDisplayModeSelector" destination="Tue-Qh-8zP" id="YCO-TO-Dda"/>
|
||||||
@@ -1662,16 +1688,16 @@
|
|||||||
<image name="trash.fill" catalog="system" width="117" height="128"/>
|
<image name="trash.fill" catalog="system" width="117" height="128"/>
|
||||||
<image name="tray.full.fill" catalog="system" width="128" height="88"/>
|
<image name="tray.full.fill" catalog="system" width="128" height="88"/>
|
||||||
<systemColor name="linkColor">
|
<systemColor name="linkColor">
|
||||||
<color red="0.0" green="0.47843137254901963" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
<systemColor name="systemBrownColor">
|
<systemColor name="systemBrownColor">
|
||||||
<color red="0.63529411764705879" green="0.51764705882352946" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="0.63529411759999999" green="0.51764705879999995" blue="0.36862745099999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
<systemColor name="systemGray2Color">
|
<systemColor name="systemGray2Color">
|
||||||
<color red="0.68235294117647061" green="0.68235294117647061" blue="0.69803921568627447" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="0.68235294120000001" green="0.68235294120000001" blue="0.69803921570000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
<systemColor name="systemTealColor">
|
<systemColor name="systemTealColor">
|
||||||
<color red="0.18823529411764706" green="0.69019607843137254" blue="0.7803921568627451" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="0.18823529410000001" green="0.69019607839999997" blue="0.78039215689999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
@@ -55,7 +55,8 @@ typedef NS_ENUM(NSInteger, SettingsMenuMode) {
|
|||||||
width:(NSInteger)width
|
width:(NSInteger)width
|
||||||
audioConfig:(NSInteger)audioConfig
|
audioConfig:(NSInteger)audioConfig
|
||||||
onscreenControls:(NSInteger)onscreenControls
|
onscreenControls:(NSInteger)onscreenControls
|
||||||
gyroMode:(NSInteger)gyroMode
|
gyroMode:(NSInteger)gyroMode
|
||||||
|
emulatedControllerType:(NSInteger)emulatedControllerType
|
||||||
keyboardToggleFingers:(NSInteger)keyboardToggleFingers
|
keyboardToggleFingers:(NSInteger)keyboardToggleFingers
|
||||||
oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers
|
oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers
|
||||||
slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge
|
slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge
|
||||||
|
|||||||
@@ -61,7 +61,8 @@
|
|||||||
width:(NSInteger)width
|
width:(NSInteger)width
|
||||||
audioConfig:(NSInteger)audioConfig
|
audioConfig:(NSInteger)audioConfig
|
||||||
onscreenControls:(NSInteger)onscreenControls
|
onscreenControls:(NSInteger)onscreenControls
|
||||||
gyroMode:(NSInteger)gyroMode
|
gyroMode:(NSInteger)gyroMode
|
||||||
|
emulatedControllerType:(NSInteger)emulatedControllerType
|
||||||
keyboardToggleFingers:(NSInteger)keyboardToggleFingers
|
keyboardToggleFingers:(NSInteger)keyboardToggleFingers
|
||||||
oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers
|
oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers
|
||||||
slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge
|
slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge
|
||||||
@@ -108,6 +109,7 @@
|
|||||||
settingsToSave.audioConfig = [NSNumber numberWithInteger:audioConfig];
|
settingsToSave.audioConfig = [NSNumber numberWithInteger:audioConfig];
|
||||||
settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls];
|
settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls];
|
||||||
settingsToSave.gyroMode = [NSNumber numberWithInteger:gyroMode];
|
settingsToSave.gyroMode = [NSNumber numberWithInteger:gyroMode];
|
||||||
|
settingsToSave.emulatedControllerType = [NSNumber numberWithInteger:emulatedControllerType];
|
||||||
settingsToSave.keyboardToggleFingers = [NSNumber numberWithInteger:(uint16_t)keyboardToggleFingers];
|
settingsToSave.keyboardToggleFingers = [NSNumber numberWithInteger:(uint16_t)keyboardToggleFingers];
|
||||||
settingsToSave.oscLayoutToolFingers = [NSNumber numberWithInteger:(uint16_t)oscLayoutToolFingers];
|
settingsToSave.oscLayoutToolFingers = [NSNumber numberWithInteger:(uint16_t)oscLayoutToolFingers];
|
||||||
settingsToSave.slideToSettingsScreenEdge = [NSNumber numberWithInteger:(uint32_t)slideToSettingsScreenEdge];
|
settingsToSave.slideToSettingsScreenEdge = [NSNumber numberWithInteger:(uint32_t)slideToSettingsScreenEdge];
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
@property (nonatomic, retain) NSNumber * touchMoveEventInterval;
|
@property (nonatomic, retain) NSNumber * touchMoveEventInterval;
|
||||||
@property (nonatomic, retain) NSNumber * touchPointerVelocityFactor;
|
@property (nonatomic, retain) NSNumber * touchPointerVelocityFactor;
|
||||||
@property (nonatomic, retain) NSNumber * gyroSensitivity;
|
@property (nonatomic, retain) NSNumber * gyroSensitivity;
|
||||||
|
@property (nonatomic, retain) NSNumber * emulatedControllerType;
|
||||||
@property (nonatomic, retain) NSNumber * mousePointerVelocityFactor;
|
@property (nonatomic, retain) NSNumber * mousePointerVelocityFactor;
|
||||||
@property (nonatomic, retain) NSNumber * pointerVelocityModeDivider;
|
@property (nonatomic, retain) NSNumber * pointerVelocityModeDivider;
|
||||||
@property (nonatomic, retain) NSString * uniqueId;
|
@property (nonatomic, retain) NSString * uniqueId;
|
||||||
|
|||||||
@@ -95,6 +95,7 @@
|
|||||||
self.swapABXYButtons = settings.swapABXYButtons;
|
self.swapABXYButtons = settings.swapABXYButtons;
|
||||||
self.onscreenControls = settings.onscreenControls;
|
self.onscreenControls = settings.onscreenControls;
|
||||||
self.gyroMode = settings.gyroMode;
|
self.gyroMode = settings.gyroMode;
|
||||||
|
self.emulatedControllerType = settings.emulatedControllerType;
|
||||||
self.reverseMouseWheelDirection = settings.reverseMouseWheelDirection;
|
self.reverseMouseWheelDirection = settings.reverseMouseWheelDirection;
|
||||||
self.asyncNativeTouchPriority = settings.asyncNativeTouchPriority;
|
self.asyncNativeTouchPriority = settings.asyncNativeTouchPriority;
|
||||||
self.btMouseSupport = settings.btMouseSupport;
|
self.btMouseSupport = settings.btMouseSupport;
|
||||||
|
|||||||
@@ -507,8 +507,6 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
rightStickY = MAX_MAGNITUDE(rightStickY, controller.mergedWithController.lastRightStickY);
|
rightStickY = MAX_MAGNITUDE(rightStickY, controller.mergedWithController.lastRightStickY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//NSLog(@"gamepadMask: %@", [self binaryRepresentationOfInteger:buttonFlags]); // we got the pressed OSC buttons here.
|
//NSLog(@"gamepadMask: %@", [self binaryRepresentationOfInteger:buttonFlags]); // we got the pressed OSC buttons here.
|
||||||
|
|
||||||
// Player 1 is always present for OSC
|
// Player 1 is always present for OSC
|
||||||
@@ -733,19 +731,33 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
capabilities |= LI_CCAP_TOUCHPAD;
|
capabilities |= LI_CCAP_TOUCHPAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([controller.extendedGamepad isKindOfClass:[GCXboxGamepad class]]) {
|
|
||||||
type = LI_CTYPE_XBOX;
|
// LI_CTYPE_UNKNOWN for option "Both"
|
||||||
}
|
if(voidController.playerIndex == 0){
|
||||||
else if ([controller.extendedGamepad isKindOfClass:[GCDualShockGamepad class]]) {
|
type = _streamConfig.emulatedControllerType == LI_CTYPE_UNKNOWN ? LI_CTYPE_PS : _streamConfig.emulatedControllerType;
|
||||||
type = LI_CTYPE_PS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (@available(iOS 14.5, tvOS 14.5, *)) {
|
if(voidController.playerIndex == 1 && _streamConfig.emulatedControllerType == LI_CTYPE_UNKNOWN){
|
||||||
if ([controller.extendedGamepad isKindOfClass:[GCDualSenseGamepad class]]) {
|
type = LI_CTYPE_XBOX;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(voidController.playerIndex >= 1 && _streamConfig.emulatedControllerType != LI_CTYPE_UNKNOWN){
|
||||||
|
if ([controller.extendedGamepad isKindOfClass:[GCXboxGamepad class]]) {
|
||||||
|
type = LI_CTYPE_XBOX;
|
||||||
|
}
|
||||||
|
if ([controller.extendedGamepad isKindOfClass:[GCDualShockGamepad class]]) {
|
||||||
type = LI_CTYPE_PS;
|
type = LI_CTYPE_PS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (@available(iOS 14.5, tvOS 14.5, *)) {
|
||||||
|
if ([controller.extendedGamepad isKindOfClass:[GCDualSenseGamepad class]]) {
|
||||||
|
type = LI_CTYPE_PS;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Detect supported haptics localities
|
// Detect supported haptics localities
|
||||||
if (controller.haptics) {
|
if (controller.haptics) {
|
||||||
if ([controller.haptics.supportedLocalities containsObject:GCHapticsLocalityHandles]) {
|
if ([controller.haptics.supportedLocalities containsObject:GCHapticsLocalityHandles]) {
|
||||||
@@ -765,6 +777,8 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
capabilities |= LI_CCAP_GYRO;
|
capabilities |= LI_CCAP_GYRO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Detect RGB LED support
|
// Detect RGB LED support
|
||||||
if (controller.light) {
|
if (controller.light) {
|
||||||
@@ -777,7 +791,7 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool controllerLacksGyro = (capabilities & LI_CCAP_GYRO) == 0;
|
bool controllerLacksGyro = (capabilities & LI_CCAP_GYRO) == 0;
|
||||||
if ((_gyroMode == AlwaysDevice) || (_gyroMode == GyroModeAuto && controllerLacksGyro))
|
if(_streamConfig.emulatedControllerType == LI_CTYPE_PS && (_gyroMode == AlwaysDevice || (_gyroMode == GyroModeAuto && controllerLacksGyro)))
|
||||||
{
|
{
|
||||||
type = LI_CTYPE_PS;
|
type = LI_CTYPE_PS;
|
||||||
capabilities |= LI_CCAP_GYRO | LI_CCAP_ACCEL;
|
capabilities |= LI_CCAP_GYRO | LI_CCAP_ACCEL;
|
||||||
@@ -786,7 +800,10 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// This is a virtual controller corresponding to our OSC
|
// This is a virtual controller corresponding to our OSC
|
||||||
|
// set osc to PS to utilize built-in gyro when "both" is selected
|
||||||
|
type = _streamConfig.emulatedControllerType == LI_CTYPE_UNKNOWN ? LI_CTYPE_PS : _streamConfig.emulatedControllerType;
|
||||||
|
|
||||||
|
/*
|
||||||
if (_streamConfig.gyroMode != GyroModeOff) {
|
if (_streamConfig.gyroMode != GyroModeOff) {
|
||||||
type = LI_CTYPE_PS;
|
type = LI_CTYPE_PS;
|
||||||
capabilities = LI_CCAP_GYRO | LI_CCAP_ACCEL;
|
capabilities = LI_CCAP_GYRO | LI_CCAP_ACCEL;
|
||||||
@@ -795,6 +812,8 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
type = LI_CTYPE_XBOX;
|
type = LI_CTYPE_XBOX;
|
||||||
capabilities = 0;
|
capabilities = 0;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
// Set the standard supported buttons for the virtual controller.
|
// Set the standard supported buttons for the virtual controller.
|
||||||
supportedButtonFlags =
|
supportedButtonFlags =
|
||||||
@@ -1172,7 +1191,7 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
|
|
||||||
|
|
||||||
- (void)updateVoidController:(VoidController* )voidController withGCController:(GCController* )controller{
|
- (void)updateVoidController:(VoidController* )voidController withGCController:(GCController* )controller{
|
||||||
voidController.playerIndex = controller.playerIndex == -1 ? 0 : (uint8_t) controller.playerIndex;
|
//voidController.playerIndex = controller.playerIndex == -1 ? 0 : (uint8_t) controller.playerIndex;
|
||||||
voidController.motionTypes = [[NSMutableSet alloc] init];
|
voidController.motionTypes = [[NSMutableSet alloc] init];
|
||||||
voidController.supportedEmulationFlags = EMULATING_SPECIAL | EMULATING_SELECT;
|
voidController.supportedEmulationFlags = EMULATING_SPECIAL | EMULATING_SELECT;
|
||||||
voidController.gamepad = controller;
|
voidController.gamepad = controller;
|
||||||
@@ -1232,8 +1251,10 @@ static const double MOUSE_SPEED_DIVISOR = 1.25;
|
|||||||
return voidController;
|
return voidController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extenal controller start from playerIndex 1 for option "Both"
|
||||||
|
int startPlayIndex = _streamConfig.emulatedControllerType == LI_CTYPE_UNKNOWN ? 1 : 0;
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = startPlayIndex; i < 4; i++) {
|
||||||
if (!(_controllerNumbers & (1 << i))) {
|
if (!(_controllerNumbers & (1 << i))) {
|
||||||
_controllerNumbers |= (1 << i);
|
_controllerNumbers |= (1 << i);
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@
|
|||||||
[self removePointerId:touch]; //then remove pointerId
|
[self removePointerId:touch]; //then remove pointerId
|
||||||
if(self->activateCoordSelector) [self removePointerObjFromDict:touch];
|
if(self->activateCoordSelector) [self removePointerObjFromDict:touch];
|
||||||
}
|
}
|
||||||
if(self->touchPointSpawnedAtUpperScreenEdge && [[event allTouches] count] == [touches count]) self->touchPointSpawnedAtUpperScreenEdge = false;
|
if(self->touchPointSpawnedAtUpperScreenEdge && [[event allTouches] count] == [touches count]) self->touchPointSpawnedAtUpperScreenEdge = false; //bugbugbugbugbugbugbugbug
|
||||||
});
|
});
|
||||||
else{
|
else{
|
||||||
for (UITouch* touch in touches){
|
for (UITouch* touch in touches){
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<attribute name="backroundSessionTimer" optional="YES" attributeType="Integer 32" defaultValueString="32767" usesScalarValueType="NO" syncable="YES"/>
|
<attribute name="backroundSessionTimer" optional="YES" attributeType="Integer 32" defaultValueString="32767" usesScalarValueType="NO" syncable="YES"/>
|
||||||
<attribute name="bitrate" attributeType="Integer 32" defaultValueString="10000" usesScalarValueType="NO" syncable="YES"/>
|
<attribute name="bitrate" attributeType="Integer 32" defaultValueString="10000" usesScalarValueType="NO" syncable="YES"/>
|
||||||
<attribute name="btMouseSupport" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
<attribute name="btMouseSupport" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||||
|
<attribute name="emulatedControllerType" optional="YES" attributeType="Integer 16" defaultValueString="2" usesScalarValueType="NO" syncable="YES"/>
|
||||||
<attribute name="deviceGyroMode" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
|
<attribute name="deviceGyroMode" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="NO" syncable="YES"/>
|
||||||
<attribute name="enableGraphs" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
<attribute name="enableGraphs" optional="YES" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||||
<attribute name="enableHdr" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
<attribute name="enableHdr" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES" syncable="YES"/>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
@property BOOL swapABXYButtons;
|
@property BOOL swapABXYButtons;
|
||||||
@property BOOL asyncNativeTouchPriority;
|
@property BOOL asyncNativeTouchPriority;
|
||||||
@property int gyroMode;
|
@property int gyroMode;
|
||||||
|
@property int emulatedControllerType;
|
||||||
@property int audioConfiguration;
|
@property int audioConfiguration;
|
||||||
@property int supportedVideoFormats;
|
@property int supportedVideoFormats;
|
||||||
@property BOOL multiController;
|
@property BOOL multiController;
|
||||||
|
|||||||
@@ -9,5 +9,5 @@
|
|||||||
#import "StreamConfiguration.h"
|
#import "StreamConfiguration.h"
|
||||||
|
|
||||||
@implementation StreamConfiguration
|
@implementation StreamConfiguration
|
||||||
@synthesize host, httpsPort, appID, width, height, frameRate, bitRate, riKeyId, riKey, gamepadMask, appName, optimizeGameSettings, playAudioOnPC, swapABXYButtons, gyroMode, audioConfiguration, supportedVideoFormats, multiController, serverCert, rtspSessionUrl, serverCodecModeSupport, enableYUV444, enablePIP;
|
@synthesize host, httpsPort, appID, width, height, frameRate, bitRate, riKeyId, riKey, gamepadMask, appName, optimizeGameSettings, playAudioOnPC, swapABXYButtons, gyroMode, emulatedControllerType, audioConfiguration, supportedVideoFormats, multiController, serverCert, rtspSessionUrl, serverCodecModeSupport, enableYUV444, enablePIP;
|
||||||
@end
|
@end
|
||||||
@@ -816,6 +816,7 @@ static NSMutableSet* hostList;
|
|||||||
_streamConfig.swapABXYButtons = streamSettings.swapABXYButtons;
|
_streamConfig.swapABXYButtons = streamSettings.swapABXYButtons;
|
||||||
_streamConfig.asyncNativeTouchPriority = streamSettings.asyncNativeTouchPriority; // new streamConfig segment
|
_streamConfig.asyncNativeTouchPriority = streamSettings.asyncNativeTouchPriority; // new streamConfig segment
|
||||||
_streamConfig.gyroMode = [streamSettings.gyroMode intValue];
|
_streamConfig.gyroMode = [streamSettings.gyroMode intValue];
|
||||||
|
_streamConfig.emulatedControllerType = streamSettings.emulatedControllerType.intValue;
|
||||||
//NSLog(@"gyroMode from settings: %ld", _streamConfig.gyroMode);
|
//NSLog(@"gyroMode from settings: %ld", _streamConfig.gyroMode);
|
||||||
|
|
||||||
// multiController must be set before calling getConnectedGamepadMask
|
// multiController must be set before calling getConnectedGamepadMask
|
||||||
@@ -1126,9 +1127,11 @@ static NSMutableSet* hostList;
|
|||||||
// enable / disable widgets acoordingly: in streamview, disable, outside of streamview, enable.
|
// enable / disable widgets acoordingly: in streamview, disable, outside of streamview, enable.
|
||||||
if(self.settingsExpandedInStreamView) [revealController buttonsInStreaming];
|
if(self.settingsExpandedInStreamView) [revealController buttonsInStreaming];
|
||||||
else [revealController buttonsNotInStreaming];
|
else [revealController buttonsNotInStreaming];
|
||||||
|
|
||||||
|
DataManager* dataMan = [[DataManager alloc] init];
|
||||||
|
TemporarySettings* currentSettings = [dataMan getSettings];
|
||||||
|
|
||||||
[streamFrameViewController setUserInteractionEnabledForStreamView:!_settingsExpandedInStreamView || position == FrontViewPositionLeft];
|
[streamFrameViewController setUserInteractionEnabledForStreamView:!_settingsExpandedInStreamView || position == FrontViewPositionLeft];
|
||||||
|
|
||||||
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.resolutionStack];
|
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.resolutionStack];
|
||||||
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.fpsStack];
|
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.fpsStack];
|
||||||
[settingsViewController widget:settingsViewController.bitrateSlider setEnabled:!self.settingsExpandedInStreamView];
|
[settingsViewController widget:settingsViewController.bitrateSlider setEnabled:!self.settingsExpandedInStreamView];
|
||||||
@@ -1138,6 +1141,7 @@ static NSMutableSet* hostList;
|
|||||||
[settingsViewController.yuv444Switch setEnabled:!_settingsExpandedInStreamView];
|
[settingsViewController.yuv444Switch setEnabled:!_settingsExpandedInStreamView];
|
||||||
[settingsViewController.hdrSwitch setEnabled:!_settingsExpandedInStreamView];
|
[settingsViewController.hdrSwitch setEnabled:!_settingsExpandedInStreamView];
|
||||||
[settingsViewController.gyroModeSelector setEnabled:!_settingsExpandedInStreamView || ![streamFrameViewController shallDisableGyroHotSwitch]];
|
[settingsViewController.gyroModeSelector setEnabled:!_settingsExpandedInStreamView || ![streamFrameViewController shallDisableGyroHotSwitch]];
|
||||||
|
[settingsViewController.emulatedControllerTypeSelector setEnabled:!_settingsExpandedInStreamView];
|
||||||
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.framepacingStack];
|
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.framepacingStack];
|
||||||
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.citrixX1MouseStack];
|
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.citrixX1MouseStack];
|
||||||
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.externalDisplayModeStack];
|
[settingsViewController setHidden:_settingsExpandedInStreamView forStack:settingsViewController.externalDisplayModeStack];
|
||||||
@@ -1753,7 +1757,7 @@ static NSMutableSet* hostList;
|
|||||||
object: nil];
|
object: nil];
|
||||||
//[self simulateSettingsButtonPress]; //force reload resolution table in the setting
|
//[self simulateSettingsButtonPress]; //force reload resolution table in the setting
|
||||||
//[self simulateSettingsButtonPress];
|
//[self simulateSettingsButtonPress];
|
||||||
//[self updateResolutionAccordingly];
|
[self updateResolutionAccordingly];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,8 @@
|
|||||||
@property (strong, nonatomic) IBOutlet UIStackView *backgroundSessionTimerStack;
|
@property (strong, nonatomic) IBOutlet UIStackView *backgroundSessionTimerStack;
|
||||||
@property (strong, nonatomic) IBOutlet UISlider *backgroundSessionTimerSlider;
|
@property (strong, nonatomic) IBOutlet UISlider *backgroundSessionTimerSlider;
|
||||||
|
|
||||||
|
@property (strong, nonatomic) IBOutlet UIStackView *emulatedControllerTypeStack;
|
||||||
|
@property (strong, nonatomic) IBOutlet UISegmentedControl *emulatedControllerTypeSelector;
|
||||||
|
|
||||||
|
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
CADisplayLink *_autoScrollDisplayLink;
|
CADisplayLink *_autoScrollDisplayLink;
|
||||||
CGFloat _scrollSpeed;
|
CGFloat _scrollSpeed;
|
||||||
CGFloat _currentRefreshRate;
|
CGFloat _currentRefreshRate;
|
||||||
MenuSectionView *touchControlSection;
|
MenuSectionView *touchAndControlSection;
|
||||||
NSMutableSet* hiddenStacks;
|
NSMutableSet* hiddenStacks;
|
||||||
NSInteger _frameQueueSize;
|
NSInteger _frameQueueSize;
|
||||||
NSInteger _graphOpacity;
|
NSInteger _graphOpacity;
|
||||||
@@ -153,6 +153,38 @@ const int RESOLUTION_TABLE_SIZE = 6;
|
|||||||
const int RESOLUTION_TABLE_CUSTOM_INDEX = RESOLUTION_TABLE_SIZE - 1;
|
const int RESOLUTION_TABLE_CUSTOM_INDEX = RESOLUTION_TABLE_SIZE - 1;
|
||||||
CGSize resolutionTable[RESOLUTION_TABLE_SIZE];
|
CGSize resolutionTable[RESOLUTION_TABLE_SIZE];
|
||||||
|
|
||||||
|
-(uint16_t)controllerTypeToSegmentIndex:(uint16_t)type{
|
||||||
|
uint16_t index;
|
||||||
|
switch (type) {
|
||||||
|
case LI_CTYPE_XBOX:
|
||||||
|
index = 0;
|
||||||
|
break;
|
||||||
|
case LI_CTYPE_PS:
|
||||||
|
index = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
index = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
-(uint16_t)segmentIndexToControllerType:(uint16_t)index{
|
||||||
|
uint16_t type;
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
type = LI_CTYPE_XBOX;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
type = LI_CTYPE_PS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
type = LI_CTYPE_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
-(int)getSliderValueForBitrate:(NSInteger)bitrate {
|
-(int)getSliderValueForBitrate:(NSInteger)bitrate {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -226,7 +258,7 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < RESOLUTION_TABLE_CUSTOM_INDEX; i++) {
|
for (int i = 0; i < RESOLUTION_TABLE_CUSTOM_INDEX; i++) {
|
||||||
|
NSLog(@"customRes: %f, %f, isrl: %f, %f", res.width, res.height, resolutionTable[i].width, resolutionTable[i].height);
|
||||||
if ((res.width == resolutionTable[i].width && res.height == resolutionTable[i].height) || (res.height == resolutionTable[i].width && res.width == resolutionTable[i].height)) {
|
if ((res.width == resolutionTable[i].width && res.height == resolutionTable[i].height) || (res.height == resolutionTable[i].width && res.width == resolutionTable[i].height)) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
@@ -256,6 +288,8 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
|
|
||||||
- (void)updateResolutionTable{
|
- (void)updateResolutionTable{
|
||||||
UIWindow *window = self.view.window;
|
UIWindow *window = self.view.window;
|
||||||
|
NSLog(@" window %@", window);
|
||||||
|
|
||||||
CGFloat screenScale = window.screen.scale;
|
CGFloat screenScale = window.screen.scale;
|
||||||
CGFloat safeAreaWidth = (window.frame.size.width - window.safeAreaInsets.left - window.safeAreaInsets.right) * screenScale;
|
CGFloat safeAreaWidth = (window.frame.size.width - window.safeAreaInsets.left - window.safeAreaInsets.right) * screenScale;
|
||||||
CGFloat appWindowWidth = window.frame.size.width * screenScale;
|
CGFloat appWindowWidth = window.frame.size.width * screenScale;
|
||||||
@@ -266,17 +300,17 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
appWindowWidth = bounds.size.width * screenScale;
|
appWindowWidth = bounds.size.width * screenScale;
|
||||||
appWindowHeight = bounds.size.height * screenScale;
|
appWindowHeight = bounds.size.height * screenScale;
|
||||||
}
|
}
|
||||||
bool needSwapWidthAndHeight = appWindowWidth > appWindowHeight;
|
|
||||||
|
|
||||||
resolutionTable[3] = CGSizeMake(safeAreaWidth, appWindowHeight);
|
bool needSwapWidthAndHeight = appWindowWidth < appWindowHeight;
|
||||||
|
|
||||||
for(uint8_t i=0;i<RESOLUTION_TABLE_SIZE;i++){
|
for(uint8_t i=0;i<6;i++){
|
||||||
CGFloat longSideLen = resolutionTable[i].height > resolutionTable[i].width ? resolutionTable[i].height : resolutionTable[i].width;
|
CGFloat longSideLen = resolutionTable[i].height > resolutionTable[i].width ? resolutionTable[i].height : resolutionTable[i].width;
|
||||||
CGFloat shortSideLen = resolutionTable[i].height < resolutionTable[i].width ? resolutionTable[i].height : resolutionTable[i].width;
|
CGFloat shortSideLen = resolutionTable[i].height < resolutionTable[i].width ? resolutionTable[i].height : resolutionTable[i].width;
|
||||||
if(needSwapWidthAndHeight) resolutionTable[i] = CGSizeMake(longSideLen, shortSideLen);
|
if(needSwapWidthAndHeight) resolutionTable[i] = CGSizeMake(shortSideLen, longSideLen);
|
||||||
else resolutionTable[i] = CGSizeMake(shortSideLen, longSideLen);
|
else resolutionTable[i] = CGSizeMake(longSideLen, shortSideLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resolutionTable[3] = CGSizeMake(safeAreaWidth, appWindowHeight);
|
||||||
resolutionTable[4] = CGSizeMake(appWindowWidth, appWindowHeight);
|
resolutionTable[4] = CGSizeMake(appWindowWidth, appWindowHeight);
|
||||||
|
|
||||||
[self updateResolutionDisplayLabel];
|
[self updateResolutionDisplayLabel];
|
||||||
@@ -285,7 +319,7 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
// this will also be called back when device orientation changes
|
// this will also be called back when device orientation changes
|
||||||
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
|
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
|
||||||
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
|
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
|
||||||
double delayInSeconds = 0.2;
|
double delayInSeconds = 0.7;
|
||||||
// Convert the delay into a dispatch_time_t value
|
// Convert the delay into a dispatch_time_t value
|
||||||
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
|
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
|
||||||
// Perform some task after the delay
|
// Perform some task after the delay
|
||||||
@@ -295,14 +329,19 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewWillAppear:(BOOL)animated{
|
- (void)viewWillAppear:(BOOL)animated{
|
||||||
|
[super viewWillAppear:NO];
|
||||||
[self.resolutionSelector setEnabled:!self.customResolutionSwitch.isOn];
|
}
|
||||||
}
|
|
||||||
|
|
||||||
- (void)viewDidAppear:(BOOL)animated{
|
- (void)viewDidAppear:(BOOL)animated{
|
||||||
[super viewDidAppear:NO];
|
[super viewDidAppear:NO];
|
||||||
[self updateResolutionTable];
|
[self updateResolutionTable];
|
||||||
NSLog(@"Resolution table updated");
|
[self.customResolutionSwitch addTarget:self action:@selector(customResolutionSwitched:) forControlEvents:UIControlEventValueChanged];
|
||||||
|
|
||||||
|
DataManager* dataMan = [[DataManager alloc] init];
|
||||||
|
TemporarySettings *currentSettings = [dataMan getSettings];
|
||||||
|
|
||||||
|
CGSize currentResolution = CGSizeMake(currentSettings.width.intValue, currentSettings.height.intValue);
|
||||||
|
[self.customResolutionSwitch setOn: isCustomResolution(currentResolution)];
|
||||||
[self.resolutionSelector setEnabled:!self.customResolutionSwitch.isOn];
|
[self.resolutionSelector setEnabled:!self.customResolutionSwitch.isOn];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,22 +530,24 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
[videoSection addToParentStack:_parentStack];
|
[videoSection addToParentStack:_parentStack];
|
||||||
[videoSection setExpanded:YES];
|
[videoSection setExpanded:YES];
|
||||||
|
|
||||||
touchControlSection = [[MenuSectionView alloc] init];
|
touchAndControlSection = [[MenuSectionView alloc] init];
|
||||||
touchControlSection.delegate = self;
|
touchAndControlSection.delegate = self;
|
||||||
touchControlSection.sectionTitle = [LocalizationHelper localizedStringForKey:@"Touch & Control"];
|
touchAndControlSection.sectionTitle = [LocalizationHelper localizedStringForKey:@"Touch & Control"];
|
||||||
if (@available(iOS 13.0, *)) {
|
if (@available(iOS 13.0, *)) {
|
||||||
[touchControlSection setSectionWithIcon:[UIImage imageNamed:@"arcade.stick.console"] andSize:20.5];
|
[touchAndControlSection setSectionWithIcon:[UIImage imageNamed:@"arcade.stick.console"] andSize:20.5];
|
||||||
}
|
}
|
||||||
[self addSetting:self.touchModeStack ofId:@"touchModeStack" withInfoTag:YES withDynamicLabel:NO to:touchControlSection];
|
[self addSetting:self.touchModeStack ofId:@"touchModeStack" withInfoTag:YES withDynamicLabel:NO to:touchAndControlSection];
|
||||||
[self addSetting:self.pointerVelocityDividerStack ofId:@"pointerVelocityDividerStack" withInfoTag:YES withDynamicLabel:YES to:touchControlSection];
|
[self addSetting:self.pointerVelocityDividerStack ofId:@"pointerVelocityDividerStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection];
|
||||||
[self addSetting:self.pointerVelocityFactorStack ofId:@"pointerVelocityFactorStack" withInfoTag:YES withDynamicLabel:YES to:touchControlSection];
|
[self addSetting:self.pointerVelocityFactorStack ofId:@"pointerVelocityFactorStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection];
|
||||||
[self addSetting:self.mousePointerVelocityStack ofId:@"mousePointerVelocityStack" withInfoTag:NO withDynamicLabel:YES to:touchControlSection];
|
[self addSetting:self.mousePointerVelocityStack ofId:@"mousePointerVelocityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection];
|
||||||
[self addSetting:self.onScreenWidgetStack ofId:@"onScreenWidgetStack" withInfoTag:YES withDynamicLabel:YES to:touchControlSection];
|
[self addSetting:self.onScreenWidgetStack ofId:@"onScreenWidgetStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection];
|
||||||
[self addSetting:self.swapAbaxyStack ofId:@"swapAbaxyStack" withInfoTag:NO withDynamicLabel:NO to:touchControlSection];
|
[self addSetting:self.swapAbaxyStack ofId:@"swapAbaxyStack" withInfoTag:NO withDynamicLabel:NO to:touchAndControlSection];
|
||||||
[touchControlSection addToParentStack:_parentStack];
|
[self addSetting:self.emulatedControllerTypeStack ofId:@"emulatedControllerTypeStack" withInfoTag:YES withDynamicLabel:NO to:touchAndControlSection];
|
||||||
[touchControlSection setExpanded:YES];
|
[self addSetting:self.gyroModeStack ofId:@"gyroModeStack" withInfoTag:YES withDynamicLabel:YES to:touchAndControlSection];
|
||||||
|
[self addSetting:self.gyroSensitivityStack ofId:@"gyroSensitivityStack" withInfoTag:NO withDynamicLabel:YES to:touchAndControlSection];
|
||||||
|
[touchAndControlSection addToParentStack:_parentStack];
|
||||||
|
[touchAndControlSection setExpanded:YES];
|
||||||
|
|
||||||
|
|
||||||
MenuSectionView *gesturesSection = [[MenuSectionView alloc] init];
|
MenuSectionView *gesturesSection = [[MenuSectionView alloc] init];
|
||||||
gesturesSection.delegate = self;
|
gesturesSection.delegate = self;
|
||||||
gesturesSection.sectionTitle = [LocalizationHelper localizedStringForKey:@"Gestures"];
|
gesturesSection.sectionTitle = [LocalizationHelper localizedStringForKey:@"Gestures"];
|
||||||
@@ -574,8 +615,6 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
[experimentalSection setSectionWithIcon:[UIImage imageNamed:@"flask"] andSize:20];
|
[experimentalSection setSectionWithIcon:[UIImage imageNamed:@"flask"] andSize:20];
|
||||||
}
|
}
|
||||||
[self addSetting:self.touchMoveEventIntervalStack ofId:@"touchMoveEventIntervalStack" withInfoTag:YES withDynamicLabel:YES to:experimentalSection];
|
[self addSetting:self.touchMoveEventIntervalStack ofId:@"touchMoveEventIntervalStack" withInfoTag:YES withDynamicLabel:YES to:experimentalSection];
|
||||||
[self addSetting:self.gyroModeStack ofId:@"gyroModeStack" withInfoTag:YES withDynamicLabel:YES to:experimentalSection];
|
|
||||||
[self addSetting:self.gyroSensitivityStack ofId:@"gyroSensitivityStack" withInfoTag:NO withDynamicLabel:YES to:experimentalSection];
|
|
||||||
[experimentalSection addToParentStack:_parentStack];
|
[experimentalSection addToParentStack:_parentStack];
|
||||||
[experimentalSection setExpanded:YES];
|
[experimentalSection setExpanded:YES];
|
||||||
}
|
}
|
||||||
@@ -1177,13 +1216,7 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
resolutionTable[3] = CGSizeMake(safeAreaWidth, fullScreenHeight);
|
resolutionTable[3] = CGSizeMake(safeAreaWidth, fullScreenHeight);
|
||||||
resolutionTable[4] = CGSizeMake(fullScreenWidth, fullScreenHeight);
|
resolutionTable[4] = CGSizeMake(fullScreenWidth, fullScreenHeight);
|
||||||
resolutionTable[5] = CGSizeMake([currentSettings.width integerValue], [currentSettings.height integerValue]); // custom initial value
|
resolutionTable[5] = CGSizeMake([currentSettings.width integerValue], [currentSettings.height integerValue]); // custom initial value
|
||||||
[self updateResolutionTable];
|
|
||||||
|
|
||||||
// Don't populate the custom entry unless we have a custom resolution
|
|
||||||
//self.customResolutionSwitch
|
|
||||||
if (!isCustomResolution(resolutionTable[5])) {
|
|
||||||
resolutionTable[5] = CGSizeMake(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NSInteger framerate;
|
NSInteger framerate;
|
||||||
switch ([currentSettings.framerate integerValue]) {
|
switch ([currentSettings.framerate integerValue]) {
|
||||||
@@ -1279,15 +1312,16 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
[self.gyroSensitivitySlider setValue: (uint16_t)(currentSettings.gyroSensitivity.floatValue * 100) animated:YES]; // Load old setting.
|
[self.gyroSensitivitySlider setValue: (uint16_t)(currentSettings.gyroSensitivity.floatValue * 100) animated:YES]; // Load old setting.
|
||||||
[self.gyroSensitivitySlider addTarget:self action:@selector(gyroSensitivitySliderMoved:) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved.
|
[self.gyroSensitivitySlider addTarget:self action:@selector(gyroSensitivitySliderMoved:) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved.
|
||||||
[self gyroSensitivitySliderMoved:self.gyroSensitivitySlider];
|
[self gyroSensitivitySliderMoved:self.gyroSensitivitySlider];
|
||||||
|
|
||||||
|
[self.emulatedControllerTypeSelector setSelectedSegmentIndex:[self controllerTypeToSegmentIndex:currentSettings.emulatedControllerType.intValue]];
|
||||||
|
[self.emulatedControllerTypeSelector addTarget:self action:@selector(emulatedControllerTypeChanged:) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved.
|
||||||
|
[self emulatedControllerTypeChanged:self.emulatedControllerTypeSelector];
|
||||||
|
|
||||||
|
|
||||||
[self.audioOnPcSwitch setOn:currentSettings.playAudioOnPC];
|
[self.audioOnPcSwitch setOn:currentSettings.playAudioOnPC];
|
||||||
_lastSelectedResolutionIndex = resolution;
|
_lastSelectedResolutionIndex = resolution;
|
||||||
[self.resolutionSelector setSelectedSegmentIndex:resolution];
|
[self.resolutionSelector setSelectedSegmentIndex:resolution];
|
||||||
[self.resolutionSelector addTarget:self action:@selector(newResolutionChosen) forControlEvents:UIControlEventValueChanged];
|
[self.resolutionSelector addTarget:self action:@selector(newResolutionChosen) forControlEvents:UIControlEventValueChanged];
|
||||||
[self.customResolutionSwitch addTarget:self action:@selector(customResolutionSwitched:) forControlEvents:UIControlEventValueChanged];
|
|
||||||
CGSize currentResolution = CGSizeMake(currentSettings.width.intValue, currentSettings.height.intValue);
|
|
||||||
[self.customResolutionSwitch setOn: isCustomResolution(currentResolution)];
|
|
||||||
|
|
||||||
[self.framerateSelector setSelectedSegmentIndex:framerate];
|
[self.framerateSelector setSelectedSegmentIndex:framerate];
|
||||||
[self.framerateSelector addTarget:self action:@selector(updateBitrate) forControlEvents:UIControlEventValueChanged];
|
[self.framerateSelector addTarget:self action:@selector(updateBitrate) forControlEvents:UIControlEventValueChanged];
|
||||||
@@ -1638,7 +1672,13 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
[self setHidden:![self isNotNativeTouchOnly] forStack:self.swapAbaxyStack];
|
[self setHidden:![self isNotNativeTouchOnly] forStack:self.swapAbaxyStack];
|
||||||
[self handleOswGestureChange];
|
[self handleOswGestureChange];
|
||||||
|
|
||||||
[touchControlSection updateViewForFoldState];
|
[touchAndControlSection updateViewForFoldState];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)emulatedControllerTypeChanged:(UISegmentedControl* )sender{
|
||||||
|
[self setHidden:sender.selectedSegmentIndex == 0 forStack:_gyroModeStack];
|
||||||
|
[self setHidden:sender.selectedSegmentIndex == 0 forStack:_gyroSensitivityStack];
|
||||||
|
[touchAndControlSection updateViewForFoldState];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setHidden:(BOOL)hidden forStack:(UIStackView* )stack{
|
- (void)setHidden:(BOOL)hidden forStack:(UIStackView* )stack{
|
||||||
@@ -1656,10 +1696,10 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
- (void)enableOswForNativeTouchSwitchFlipped:(UISwitch *)sender{
|
- (void)enableOswForNativeTouchSwitchFlipped:(UISwitch *)sender{
|
||||||
//self.onScreenWidgetStack.hidden = !sender.isOn;
|
//self.onScreenWidgetStack.hidden = !sender.isOn;
|
||||||
[self setHidden:!sender.isOn forStack:_onScreenWidgetStack];
|
[self setHidden:!sender.isOn forStack:_onScreenWidgetStack];
|
||||||
[self setHidden:!sender.isOn forStack:_swapAbaxyStack];
|
//[self setHidden:!sender.isOn forStack:_swapAbaxyStack];
|
||||||
[self handleOswGestureChange];
|
[self handleOswGestureChange];
|
||||||
//self.swapAbaxyStack.hidden = !sender.isOn;
|
//self.swapAbaxyStack.hidden = !sender.isOn;
|
||||||
[touchControlSection updateViewForFoldState];
|
[touchAndControlSection updateViewForFoldState];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) updateBitrate {
|
- (void) updateBitrate {
|
||||||
@@ -2029,6 +2069,7 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
BOOL multiController = self.multiControllerSwitch.isOn;
|
BOOL multiController = self.multiControllerSwitch.isOn;
|
||||||
BOOL swapABXYButtons = [self.swapABXYButtonsSelector selectedSegmentIndex] == 1;
|
BOOL swapABXYButtons = [self.swapABXYButtonsSelector selectedSegmentIndex] == 1;
|
||||||
NSInteger gyroMode = self.gyroModeSelector.selectedSegmentIndex;
|
NSInteger gyroMode = self.gyroModeSelector.selectedSegmentIndex;
|
||||||
|
NSInteger emulatedControllerType = [self segmentIndexToControllerType:self.emulatedControllerTypeSelector.selectedSegmentIndex]; //self.emulatedControllerTypeSelector.selectedSegmentIndex;
|
||||||
BOOL audioOnPC = self.audioOnPcSwitch.isOn;
|
BOOL audioOnPC = self.audioOnPcSwitch.isOn;
|
||||||
uint32_t preferredCodec = [self getChosenCodecPreference];
|
uint32_t preferredCodec = [self getChosenCodecPreference];
|
||||||
BOOL enableYUV444 = self.yuv444Switch.isOn;
|
BOOL enableYUV444 = self.yuv444Switch.isOn;
|
||||||
@@ -2045,6 +2086,7 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
NSInteger externalDisplayMode = [self.externalDisplayModeSelector selectedSegmentIndex];
|
NSInteger externalDisplayMode = [self.externalDisplayModeSelector selectedSegmentIndex];
|
||||||
NSInteger localMousePointerMode = [self.localMousePointerModeSelector selectedSegmentIndex];
|
NSInteger localMousePointerMode = [self.localMousePointerModeSelector selectedSegmentIndex];
|
||||||
NSInteger backgroundSessionTimer = self.backgroundSessionTimerSlider.value == self.backgroundSessionTimerSlider.maximumValue ? (uint32_t) INT16_MAX : (uint32_t)self.backgroundSessionTimerSlider.value;
|
NSInteger backgroundSessionTimer = self.backgroundSessionTimerSlider.value == self.backgroundSessionTimerSlider.maximumValue ? (uint32_t) INT16_MAX : (uint32_t)self.backgroundSessionTimerSlider.value;
|
||||||
|
|
||||||
[dataMan saveSettingsWithBitrate:_bitrate
|
[dataMan saveSettingsWithBitrate:_bitrate
|
||||||
framerate:framerate
|
framerate:framerate
|
||||||
height:height
|
height:height
|
||||||
@@ -2052,6 +2094,7 @@ BOOL isCustomResolution(CGSize res) {
|
|||||||
audioConfig:audioConfig
|
audioConfig:audioConfig
|
||||||
onscreenControls:onscreenControls
|
onscreenControls:onscreenControls
|
||||||
gyroMode:gyroMode
|
gyroMode:gyroMode
|
||||||
|
emulatedControllerType:emulatedControllerType
|
||||||
keyboardToggleFingers:keyboardToggleFingers
|
keyboardToggleFingers:keyboardToggleFingers
|
||||||
oscLayoutToolFingers:oscLayoutToolFingers
|
oscLayoutToolFingers:oscLayoutToolFingers
|
||||||
slideToSettingsScreenEdge:slideToSettingsScreenEdge
|
slideToSettingsScreenEdge:slideToSettingsScreenEdge
|
||||||
|
|||||||
@@ -1765,6 +1765,90 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"JaY-XA-1V6.segmentTitles[0]" : {
|
||||||
|
"comment" : "Class = \"UISegmentedControl\"; JaY-XA-1V6.segmentTitles[0] = \"Xbox 360\"; ObjectID = \"JaY-XA-1V6\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "Xbox 360"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"JaY-XA-1V6.segmentTitles[1]" : {
|
||||||
|
"comment" : "Class = \"UISegmentedControl\"; JaY-XA-1V6.segmentTitles[1] = \"DS4\"; ObjectID = \"JaY-XA-1V6\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "DS4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"JaY-XA-1V6.segmentTitles[2]" : {
|
||||||
|
"comment" : "Class = \"UISegmentedControl\"; JaY-XA-1V6.segmentTitles[2] = \"Both\"; ObjectID = \"JaY-XA-1V6\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "Both"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hans" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "同时映射"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hant" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "同時映射"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-HK" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "同時映射"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"JTl-un-QJJ.text" : {
|
||||||
|
"comment" : "Class = \"UILabel\"; text = \"Emulated Controller Type\"; ObjectID = \"JTl-un-QJJ\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "Emulated Controller Type"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hans" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "手柄映射类型"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hant" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "手把映射類型"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-HK" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "手把映射類型"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"kho-5R-daP.segmentTitles[0]" : {
|
"kho-5R-daP.segmentTitles[0]" : {
|
||||||
"comment" : "Class = \"UISegmentedControl\"; kho-5R-daP.segmentTitles[0] = \"3 Finger Tap\"; ObjectID = \"kho-5R-daP\";",
|
"comment" : "Class = \"UISegmentedControl\"; kho-5R-daP.segmentTitles[0] = \"3 Finger Tap\"; ObjectID = \"kho-5R-daP\";",
|
||||||
"extractionState" : "extracted_with_value",
|
"extractionState" : "extracted_with_value",
|
||||||
|
|||||||
@@ -1255,6 +1255,36 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"dUM-r9-0Bo.text" : {
|
||||||
|
"comment" : "Class = \"UILabel\"; text = \"Emulated Controller Type\"; ObjectID = \"dUM-r9-0Bo\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "Emulated Controller Type"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hans" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "手柄映射类型"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hant" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "手把映射類型"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-HK" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "手把映射類型"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"E7F-vx-pnM.text" : {
|
"E7F-vx-pnM.text" : {
|
||||||
"comment" : "Class = \"UILabel\"; text = \"Frame Rate\"; ObjectID = \"E7F-vx-pnM\";",
|
"comment" : "Class = \"UILabel\"; text = \"Frame Rate\"; ObjectID = \"E7F-vx-pnM\";",
|
||||||
"extractionState" : "extracted_with_value",
|
"extractionState" : "extracted_with_value",
|
||||||
@@ -2305,6 +2335,60 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"q6v-Jb-ysy.segmentTitles[0]" : {
|
||||||
|
"comment" : "Class = \"UISegmentedControl\"; q6v-Jb-ysy.segmentTitles[0] = \"Xbox 360\"; ObjectID = \"q6v-Jb-ysy\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "Xbox 360"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"q6v-Jb-ysy.segmentTitles[1]" : {
|
||||||
|
"comment" : "Class = \"UISegmentedControl\"; q6v-Jb-ysy.segmentTitles[1] = \"DS4\"; ObjectID = \"q6v-Jb-ysy\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "DS4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"q6v-Jb-ysy.segmentTitles[2]" : {
|
||||||
|
"comment" : "Class = \"UISegmentedControl\"; q6v-Jb-ysy.segmentTitles[2] = \"Both\"; ObjectID = \"q6v-Jb-ysy\";",
|
||||||
|
"extractionState" : "extracted_with_value",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "new",
|
||||||
|
"value" : "Both"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hans" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "同时映射"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-Hant" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "同時映射"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zh-HK" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "同時映射"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"qeW-hW-tSL.text" : {
|
"qeW-hW-tSL.text" : {
|
||||||
"comment" : "Class = \"UILabel\"; text = \"Audio Configuration\"; ObjectID = \"qeW-hW-tSL\";",
|
"comment" : "Class = \"UILabel\"; text = \"Audio Configuration\"; ObjectID = \"qeW-hW-tSL\";",
|
||||||
"extractionState" : "extracted_with_value",
|
"extractionState" : "extracted_with_value",
|
||||||
|
|||||||
Reference in new issue
Block a user