diff --git a/VoidLink/Base.lproj/iPad.storyboard b/VoidLink/Base.lproj/iPad.storyboard
index 7f7ef245..3281df73 100644
--- a/VoidLink/Base.lproj/iPad.storyboard
+++ b/VoidLink/Base.lproj/iPad.storyboard
@@ -406,16 +406,16 @@
-
+
-
-
+
-
-
+
+
-
+
diff --git a/VoidLink/Input/MicHandler.swift b/VoidLink/Input/MicHandler.swift
index d5f8bf77..572c25d0 100644
--- a/VoidLink/Input/MicHandler.swift
+++ b/VoidLink/Input/MicHandler.swift
@@ -190,7 +190,7 @@ public class MicHandler: NSObject {
// Optional: But defaults are fine. Only change when needed:
opus_encoder_ctl_wrapper(enc, Int32(OPUS_SET_BITRATE_REQUEST), opus_int32(64000)) // Set bitrate
opus_encoder_ctl_wrapper(enc, Int32(OPUS_SET_COMPLEXITY_REQUEST), opus_int32(5)) // Set complexity
- opus_encoder_ctl_wrapper(enc, Int32(OPUS_SET_SIGNAL_REQUEST), OPUS_SIGNAL_MUSIC) // Set signal type
+ opus_encoder_ctl_wrapper(enc, Int32(OPUS_SET_SIGNAL_REQUEST), OPUS_SIGNAL_VOICE) // Set signal type
}
@objc public func startTapping() {
@@ -248,7 +248,7 @@ public class MicHandler: NSObject {
var packet = [UInt8](repeating: 0, count: 4000)
guard let enc = self.opusEncoder else {return}
let outBytes = opus_encode(enc, chunk, 960, &packet, Int32(packet.count))
- sendMicrophoneData(packet, outBytes)
+ sendMicrophoneOpusData(packet, outBytes)
let removeCount = min(960, pcm16BufferDeque.count)
if removeCount > 0 {
pcm16BufferDeque.removeFirst(removeCount)
@@ -264,7 +264,7 @@ public class MicHandler: NSObject {
var packet = [UInt8](repeating: 0, count: 4000)
guard let enc = self.opusEncoder else {return}
let outBytes = opus_encode(enc, chunk, 960, &packet, Int32(packet.count))
- sendMicrophoneData(packet, outBytes)
+ sendMicrophoneOpusData(packet, outBytes)
let removeCount = min(960, pcm16BufferArray.count)
if removeCount > 0 {
pcm16BufferArray.removeFirst(removeCount)
diff --git a/VoidLink/Limelight-Info.plist b/VoidLink/Limelight-Info.plist
index 877978f7..4fc1f243 100644
--- a/VoidLink/Limelight-Info.plist
+++ b/VoidLink/Limelight-Info.plist
@@ -63,9 +63,9 @@
NSLocalNetworkUsageDescription
VoidLink uses the local network to connect to your gaming PC for streaming.
NSMicrophoneUsageDescription
- VoidLink需要麦克风访问权限。现阶段,麦克风重定向仅支持Sunshine基地版,且麦克风音频流【未经加密】。
+ 麦克风访问权限允许VoidLink 实现麦克风重定向。麦克风重定向仅支持Sunshine基地版。
-VoidLink uses microphone to stream your voice to gaming PC. Microphone redirection currently works with Sunshine-Foundation (a fork of Sunshine) only, and the mic audio stream is NOT ENCRYPTED at this stage.
+VoidLink uses microphone to stream your voice to PC host. Microphone redirection works with Sunshine-Foundation (a fork of Sunshine) only.
NSMotionUsageDescription
VoidLink uses the device Gyro and Acceleration data to emulate motion controls when streaming.
UIApplicationSceneManifest
diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings
index 36f30c20..fc217247 100644
--- a/VoidLink/Localization/Localizable.xcstrings
+++ b/VoidLink/Localization/Localizable.xcstrings
@@ -8082,25 +8082,25 @@
"en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "- Please grant microphone permission in your system settings, then re-enable “Redirect Mic.”\n\n- Currently, mic redirection is only supported with Sunshine-Foundation (a Sunshine fork).\nThis feature is experimental, and the microphone audio stream is NOT ENCRYPTED at this stage.\n"
+ "value" : "- Please grant microphone permission in your system settings, then re-enable “Redirect Mic.”\n\n- Mic redirection is only supported with Sunshine-Foundation (a Sunshine fork).\n\n- The mic audio will be encrypted during streaming"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
- "value" : "- 请前往系统设置授予 App 麦克风权限,再回到此菜单启用麦克风重定向。\n\n- 目前麦克风重定向仅支持 Sunshine 基地版,且为实验性功能。须注意,现阶段的 Mic 音频流 【未经加密】。"
+ "value" : "- 请前往系统设置授予 App 麦克风权限,再回到此菜单启用麦克风重定向。\n\n- 仅 Sunshine 基地版 支持麦克风重定风。\n\n- 麦克风音频在串流时将被加密传输。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
- "value" : "- 請前往系統設定授予 App 麥克風權限,再回到此選單啟用麥克風轉送。\n\n- 目前麥克風轉送僅支援 Sunshine 基地版,且為實驗性功能。須注意,現階段的 Mic 音訊流【未經加密】。"
+ "value" : "- 請前往系統設定授予 App 麥克風權限,再回到此選單啟用麥克風轉送。\n\n- 麥克風轉送僅支援 Sunshine 基地版。\n\n- 麥克風音訊在串流時將被加密傳輸。"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
- "value" : "- 請前往系統設定授予 App 麥克風權限,再回到此選單啟用麥克風轉送。\n\n- 目前麥克風轉送僅支援 Sunshine 基地版,且為實驗性功能。須注意,現階段的 Mic 音訊流【未經加密】。"
+ "value" : "- 請前往系統設定授予 App 麥克風權限,再回到此選單啟用麥克風轉送。\n\n- 麥克風轉送僅支援 Sunshine 基地版。\n\n- 麥克風音訊在串流時將被加密傳輸。"
}
}
}
@@ -10799,25 +10799,25 @@
"en" : {
"stringUnit" : {
"state" : "translated",
- "value" : "- Currently, mic redirection is only supported with Sunshine-Foundation (a Sunshine fork).\n\n- This feature is experimental, and the microphone audio stream is NOT ENCRYPTED at this stage."
+ "value" : "- Mic redirection is only supported with Sunshine-Foundation (a Sunshine fork).\n\n- Mic audio will be encrypted during streaming"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
- "value" : "目前麦克风重定向仅支持 Sunshine 基地版,且为实验性功能。 \n须注意,现阶段的 Mic 音频流 【未经加密】。"
+ "value" : "- 仅 Sunshine 基地版 支持麦克风重定风。\n\n- 麦克风音频在串流时将被加密传输。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
- "value" : "目前麥克風轉送僅支援 Sunshine 基地版,且為實驗性功能。\n須注意,現階段的 Mic 音訊流【未經加密】。"
+ "value" : "- 麥克風轉送僅支援 Sunshine 基地版。\n\n- 麥克風音訊在串流時將被加密傳輸。"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
- "value" : "目前麥克風轉送僅支援 Sunshine 基地版,且為實驗性功能。\n須注意,現階段的 Mic 音訊流【未經加密】。"
+ "value" : "- 麥克風轉送僅支援 Sunshine 基地版。\n\n- 麥克風音訊在串流時將被加密傳輸。"
}
}
}
@@ -10836,7 +10836,7 @@
},
"zh-Hans" : {
"stringUnit" : {
- "state" : "needs_review",
+ "state" : "translated",
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/fqd6l1kgt482on8a"
}
},
diff --git a/VoidLink/mul.lproj/iPad.xcstrings b/VoidLink/mul.lproj/iPad.xcstrings
index 5b18196b..bc36acb3 100644
--- a/VoidLink/mul.lproj/iPad.xcstrings
+++ b/VoidLink/mul.lproj/iPad.xcstrings
@@ -3843,31 +3843,31 @@
}
},
"jaM-yS-ldb.text" : {
- "comment" : "Class = \"UILabel\"; text = \"Redirect Mic (Experimental)\"; ObjectID = \"jaM-yS-ldb\";",
+ "comment" : "Class = \"UILabel\"; text = \"Redirect Mic\"; ObjectID = \"jaM-yS-ldb\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
- "value" : "Redirect Mic (Experimental)"
+ "value" : "Redirect Mic"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
- "value" : "麦克风重定向(实验性)"
+ "value" : "麦克风重定向"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
- "value" : "麥克風轉送(實驗性)"
+ "value" : "麥克風轉送"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
- "value" : "麥克風轉送(實驗性)"
+ "value" : "麥克風轉送"
}
}
}
diff --git a/VoidLink/mul.lproj/iPhone.xcstrings b/VoidLink/mul.lproj/iPhone.xcstrings
index 1076efd8..df78af9d 100644
--- a/VoidLink/mul.lproj/iPhone.xcstrings
+++ b/VoidLink/mul.lproj/iPhone.xcstrings
@@ -4226,31 +4226,31 @@
}
},
"nz2-5g-YSQ.text" : {
- "comment" : "Class = \"UILabel\"; text = \"Redirect Mic (Experimental)\"; ObjectID = \"nz2-5g-YSQ\";",
+ "comment" : "Class = \"UILabel\"; text = \"Redirect Mic\"; ObjectID = \"nz2-5g-YSQ\";",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
- "value" : "Redirect Mic (Experimental)"
+ "value" : "Redirect Mic"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
- "value" : "麦克风重定向(实验性)"
+ "value" : "麦克风重定向"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
- "value" : "麥克風轉送(實驗性)"
+ "value" : "麥克風轉送"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
- "value" : "麥克風轉送(實驗性)"
+ "value" : "麥克風轉送"
}
}
}
@@ -6661,13 +6661,13 @@
},
"zh-Hant" : {
"stringUnit" : {
- "state" : "needs_review",
+ "state" : "translated",
"value" : "被視窗捕獲"
}
},
"zh-HK" : {
"stringUnit" : {
- "state" : "needs_review",
+ "state" : "translated",
"value" : "被視窗捕獲"
}
}
diff --git a/moonlight-common/moonlight-common-c b/moonlight-common/moonlight-common-c
index be5a57cb..da6f00de 160000
--- a/moonlight-common/moonlight-common-c
+++ b/moonlight-common/moonlight-common-c
@@ -1 +1 @@
-Subproject commit be5a57cb5b462bd2fd26d546f129282e88f43f98
+Subproject commit da6f00de5fbee76e9bbc3b1deec931842401f7f1
diff --git a/moonlight-common/moonlight-common.xcodeproj/project.pbxproj b/moonlight-common/moonlight-common.xcodeproj/project.pbxproj
index 46b0d612..00cf6d76 100644
--- a/moonlight-common/moonlight-common.xcodeproj/project.pbxproj
+++ b/moonlight-common/moonlight-common.xcodeproj/project.pbxproj
@@ -11,9 +11,10 @@
180B87D72E65DF27007D9E22 /* RecorderCallbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = 180B87D52E65DF27007D9E22 /* RecorderCallbacks.c */; };
180B87D82E65DF27007D9E22 /* MicrophoneStream.c in Sources */ = {isa = PBXBuildFile; fileRef = 180B87D42E65DF27007D9E22 /* MicrophoneStream.c */; };
180B87D92E65DF27007D9E22 /* RecorderCallbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = 180B87D52E65DF27007D9E22 /* RecorderCallbacks.c */; };
+ 180B87DA2E65DF27007D9E22 /* rswrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 180B87DB2E65DF27007D9E22 /* rswrapper.c */; };
+ 180B87DC2E65DF27007D9E22 /* rswrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 180B87DB2E65DF27007D9E22 /* rswrapper.c */; };
983091DE24CEB69B00A0835D /* ConnectionTester.c in Sources */ = {isa = PBXBuildFile; fileRef = 983091DD24CEB69B00A0835D /* ConnectionTester.c */; };
983091DF24CEB69B00A0835D /* ConnectionTester.c in Sources */ = {isa = PBXBuildFile; fileRef = 983091DD24CEB69B00A0835D /* ConnectionTester.c */; };
- 9857AEF01EBE85E10084F99E /* rs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9857AEEE1EBE85E10084F99E /* rs.c */; };
98AB2E401CAD425A0089BB98 /* AudioStream.c in Sources */ = {isa = PBXBuildFile; fileRef = 98AB2E1A1CAD423B0089BB98 /* AudioStream.c */; };
98AB2E411CAD425A0089BB98 /* ByteBuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 98AB2E1B1CAD423B0089BB98 /* ByteBuffer.c */; };
98AB2E421CAD425A0089BB98 /* Connection.c in Sources */ = {isa = PBXBuildFile; fileRef = 98AB2E1D1CAD423B0089BB98 /* Connection.c */; };
@@ -48,7 +49,6 @@
98F145382667D847004018E3 /* RtpVideoQueue.c in Sources */ = {isa = PBXBuildFile; fileRef = 98F145342667D847004018E3 /* RtpVideoQueue.c */; };
F74BEF9F2C1A707200224667 /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = F74BEF9E2C1A707200224667 /* OpenSSL */; };
F74BEFA22C1A80D000224667 /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = F74BEFA12C1A80D000224667 /* OpenSSL */; };
- FB1A67F821324F4900507771 /* rs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9857AEEE1EBE85E10084F99E /* rs.c */; };
FB1A67FA21324F4900507771 /* AudioStream.c in Sources */ = {isa = PBXBuildFile; fileRef = 98AB2E1A1CAD423B0089BB98 /* AudioStream.c */; };
FB1A67FB21324F4900507771 /* ByteBuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 98AB2E1B1CAD423B0089BB98 /* ByteBuffer.c */; };
FB1A67FC21324F4900507771 /* Connection.c in Sources */ = {isa = PBXBuildFile; fileRef = 98AB2E1D1CAD423B0089BB98 /* Connection.c */; };
@@ -90,9 +90,9 @@
/* Begin PBXFileReference section */
180B87D42E65DF27007D9E22 /* MicrophoneStream.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = MicrophoneStream.c; sourceTree = ""; };
180B87D52E65DF27007D9E22 /* RecorderCallbacks.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = RecorderCallbacks.c; sourceTree = ""; };
+ 180B87DB2E65DF27007D9E22 /* rswrapper.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rswrapper.c; sourceTree = ""; };
+ 180B87DD2E65DF27007D9E22 /* rswrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rswrapper.h; sourceTree = ""; };
983091DD24CEB69B00A0835D /* ConnectionTester.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ConnectionTester.c; sourceTree = ""; };
- 9857AEEE1EBE85E10084F99E /* rs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rs.c; path = "moonlight-common-c/reedsolomon/rs.c"; sourceTree = ""; };
- 9857AEEF1EBE85E10084F99E /* rs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rs.h; path = "moonlight-common-c/reedsolomon/rs.h"; sourceTree = ""; };
98AB2DF01CAD422B0089BB98 /* callbacks.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = callbacks.c; sourceTree = ""; };
98AB2DF11CAD422B0089BB98 /* ChangeLog */ = {isa = PBXFileReference; lastKnownFileType = text; path = ChangeLog; sourceTree = ""; };
98AB2DF21CAD422B0089BB98 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; };
@@ -186,15 +186,6 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 9857AEED1EBE85D50084F99E /* reedsolomon */ = {
- isa = PBXGroup;
- children = (
- 9857AEEE1EBE85E10084F99E /* rs.c */,
- 9857AEEF1EBE85E10084F99E /* rs.h */,
- );
- name = reedsolomon;
- sourceTree = "";
- };
98AB2DEF1CAD422B0089BB98 /* enet */ = {
isa = PBXGroup;
children = (
@@ -277,6 +268,8 @@
children = (
180B87D42E65DF27007D9E22 /* MicrophoneStream.c */,
180B87D52E65DF27007D9E22 /* RecorderCallbacks.c */,
+ 180B87DB2E65DF27007D9E22 /* rswrapper.c */,
+ 180B87DD2E65DF27007D9E22 /* rswrapper.h */,
98F1453A2667D852004018E3 /* RtpAudioQueue.h */,
98F145392667D852004018E3 /* RtpVideoQueue.h */,
98F145332667D847004018E3 /* RtpAudioQueue.c */,
@@ -318,7 +311,6 @@
FB290E2519B37A4E004C83CF = {
isa = PBXGroup;
children = (
- 9857AEED1EBE85D50084F99E /* reedsolomon */,
98AB2E191CAD423B0089BB98 /* src */,
98AB2DEF1CAD422B0089BB98 /* enet */,
FB290E2F19B37A4E004C83CF /* Products */,
@@ -419,7 +411,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- FB1A67F821324F4900507771 /* rs.c in Sources */,
+ 180B87DC2E65DF27007D9E22 /* rswrapper.c in Sources */,
98F145362667D847004018E3 /* RtpAudioQueue.c in Sources */,
FB1A67FA21324F4900507771 /* AudioStream.c in Sources */,
FB1A67FB21324F4900507771 /* ByteBuffer.c in Sources */,
@@ -460,6 +452,7 @@
files = (
98C1FC142184124C0023FDDF /* SimpleStun.c in Sources */,
98F145352667D847004018E3 /* RtpAudioQueue.c in Sources */,
+ 180B87DA2E65DF27007D9E22 /* rswrapper.c in Sources */,
98AB2E401CAD425A0089BB98 /* AudioStream.c in Sources */,
98AB2E411CAD425A0089BB98 /* ByteBuffer.c in Sources */,
180B87D82E65DF27007D9E22 /* MicrophoneStream.c in Sources */,
@@ -487,7 +480,6 @@
98AB2E541CAD427A0089BB98 /* packet.c in Sources */,
98AB2E551CAD427A0089BB98 /* peer.c in Sources */,
98AB2E561CAD427A0089BB98 /* protocol.c in Sources */,
- 9857AEF01EBE85E10084F99E /* rs.c in Sources */,
98AB2E571CAD427A0089BB98 /* unix.c in Sources */,
98AB2E581CAD427A0089BB98 /* win32.c in Sources */,
);
@@ -512,6 +504,9 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
HEADER_SEARCH_PATHS = (
"moonlight-common-c/enet/include",
+ "moonlight-common-c/nanors",
+ "moonlight-common-c/nanors/deps",
+ "moonlight-common-c/nanors/deps/obl",
"../libs/**",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
@@ -542,6 +537,9 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
HEADER_SEARCH_PATHS = (
"moonlight-common-c/enet/include",
+ "moonlight-common-c/nanors",
+ "moonlight-common-c/nanors/deps",
+ "moonlight-common-c/nanors/deps/obl",
"../libs/**",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
@@ -688,6 +686,9 @@
EXECUTABLE_PREFIX = lib;
HEADER_SEARCH_PATHS = (
"moonlight-common-c/enet/include",
+ "moonlight-common-c/nanors",
+ "moonlight-common-c/nanors/deps",
+ "moonlight-common-c/nanors/deps/obl",
"../libs/**",
);
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
@@ -706,6 +707,9 @@
EXECUTABLE_PREFIX = lib;
HEADER_SEARCH_PATHS = (
"moonlight-common-c/enet/include",
+ "moonlight-common-c/nanors",
+ "moonlight-common-c/nanors/deps",
+ "moonlight-common-c/nanors/deps/obl",
"../libs/**",
);
IPHONEOS_DEPLOYMENT_TARGET = 12.0;