--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>NSPrivacyTracking</key>
+ <false/>
+ <key>NSPrivacyAccessedAPITypes</key>
+ <array/>
+ <key>NSPrivacyCollectedDataTypes</key>
+ <array/>
+ <key>NSPrivacyTrackingDomains</key>
+ <array/>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>NSPrivacyTracking</key>
+ <false/>
+ <key>NSPrivacyAccessedAPITypes</key>
+ <array/>
+ <key>NSPrivacyCollectedDataTypes</key>
+ <array/>
+ <key>NSPrivacyTrackingDomains</key>
+ <array/>
+</dict>
+</plist>
objects = {
/* Begin PBXBuildFile section */
- 3F469CB12F0B539600121DBD /* DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D54E0EF2F0A61E600A80EE7 /* DeepChordsSdk.framework */; };
3F8F58292EBCA2B800FFC00B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3F8F58282EBCA2B800FFC00B /* PrivacyInfo.xcprivacy */; };
- 3FD1A2952F0BCACB00A62733 /* JLAudioUnitKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3FD1A2912F0BC9D800A62733 /* JLAudioUnitKit.xcframework */; };
- 3FD1A2962F0BCACB00A62733 /* JLAudioUnitKit.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3FD1A2912F0BC9D800A62733 /* JLAudioUnitKit.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
644D1BB5EDD3EA1D77C57786 /* Pods_DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 248D8B53B5A178ACA5867275 /* Pods_DeepChordsSdk.framework */; };
F2E449CAD5874BE652A69B50 /* Pods_ShenYin.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3862D5561144E20721225B96 /* Pods_ShenYin.framework */; };
/* End PBXBuildFile section */
-/* Begin PBXContainerItemProxy section */
- 0D54E1022F0A61E600A80EE7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 3F887B942E38D8DC00C98658 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0D54E0EE2F0A61E600A80EE7;
- remoteInfo = DeepChordsSdk;
- };
-/* End PBXContainerItemProxy section */
-
/* Begin PBXCopyFilesBuildPhase section */
0D54E4462F0A62D900A80EE7 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
dstPath = "";
dstSubfolderSpec = 10;
files = (
- 3FD1A2962F0BCACB00A62733 /* JLAudioUnitKit.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
3F7602EA2EFA891200588C18 /* DeepChordsSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DeepChordsSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3F887B9C2E38D8DC00C98658 /* ShenYin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ShenYin.app; sourceTree = BUILT_PRODUCTS_DIR; };
3F8F58282EBCA2B800FFC00B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
- 3FD1A2912F0BC9D800A62733 /* JLAudioUnitKit.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = JLAudioUnitKit.xcframework; path = framework/JLAudioUnitKit.xcframework; sourceTree = "<group>"; };
5A92F7DC2CB6E6E69D2AB23E /* Pods-DeepChordsSdk.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DeepChordsSdk.debug.xcconfig"; path = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.debug.xcconfig"; sourceTree = "<group>"; };
5F5DE5910965D53C2B3405B0 /* Pods-ShenYin.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShenYin.debug.xcconfig"; path = "Target Support Files/Pods-ShenYin/Pods-ShenYin.debug.xcconfig"; sourceTree = "<group>"; };
CB933A7969ADF81D59503790 /* Pods-LingQi.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LingQi.debug.xcconfig"; path = "Target Support Files/Pods-LingQi/Pods-LingQi.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
- 3F469CAC2F0B539000121DBD /* Exceptions for "DeepChordsSdk" folder in "ShenYin" target */ = {
- isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
- membershipExceptions = (
- StarburstSdk.framework,
- );
- target = 3F887B9B2E38D8DC00C98658 /* ShenYin */;
- };
3F887BAE2E38D8DD00C98658 /* Exceptions for "ShenYin" folder in "ShenYin" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
+ Sdk/DcSdk/DcBleManager.swift,
+ Sdk/DcSdk/DcCall.swift,
+ Sdk/DcSdk/DcChatManager.swift,
+ Sdk/DcSdk/DcChinese2Enligsh.swift,
+ Sdk/DcSdk/DcSdkManager.swift,
+ Sdk/DcSdk/DcStereo.swift,
+ Sdk/DcSdk/DcTcty.swift,
+ Sdk/DcSdk/DcThly.swift,
+ Sdk/DcSdk/DcXcly.swift,
+ Sdk/DcSdk/OpusTools.swift,
+ Sdk/DcSdk/VC/DcCallingRecordVC.swift,
+ Sdk/DcSdk/VC/DcChatVC.swift,
+ Sdk/DcSdk/VC/DcChinese2EnglishVC.swift,
+ Sdk/DcSdk/VC/DcDialogTranslateVC.swift,
+ Sdk/DcSdk/VC/DcStereoCallVC.swift,
+ Sdk/DcSdk/VC/DcTctyVC.swift,
+ Sdk/DcSdk/VC/DcXclyVC.swift,
);
target = 3F887B9B2E38D8DC00C98658 /* ShenYin */;
};
StarburstSdk.framework,
);
};
- 3F469CB02F0B539500121DBD /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "ShenYin" target */ = {
- isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
- attributesByRelativePath = {
- StarburstSdk.framework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
- };
- buildPhase = 3F469CAF2F0B539400121DBD /* Embed Frameworks */;
- membershipExceptions = (
- StarburstSdk.framework,
- );
- };
3FD1D6A12F0D1AE600A62733 /* Exceptions for "ShenYin" folder in "Embed Frameworks" phase from "ShenYin" target */ = {
isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
attributesByRelativePath = {
0D54E0F02F0A61E600A80EE7 /* DeepChordsSdk */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
- 3F469CAC2F0B539000121DBD /* Exceptions for "DeepChordsSdk" folder in "ShenYin" target */,
- 3F469CB02F0B539500121DBD /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "ShenYin" target */,
0D54E4472F0A62D900A80EE7 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */,
);
path = DeepChordsSdk;
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 3F469CB12F0B539600121DBD /* DeepChordsSdk.framework in Frameworks */,
F2E449CAD5874BE652A69B50 /* Pods_ShenYin.framework in Frameworks */,
- 3FD1A2952F0BCACB00A62733 /* JLAudioUnitKit.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
676B86A4BA2639E8694D56B4 /* Frameworks */ = {
isa = PBXGroup;
children = (
- 3FD1A2912F0BC9D800A62733 /* JLAudioUnitKit.xcframework */,
3F7602EA2EFA891200588C18 /* DeepChordsSdk.framework */,
3862D5561144E20721225B96 /* Pods_ShenYin.framework */,
248D8B53B5A178ACA5867275 /* Pods_DeepChordsSdk.framework */,
buildRules = (
);
dependencies = (
- 0D54E1032F0A61E600A80EE7 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
3F887B9E2E38D8DC00C98658 /* ShenYin */,
};
/* End PBXSourcesBuildPhase section */
-/* Begin PBXTargetDependency section */
- 0D54E1032F0A61E600A80EE7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0D54E0EE2F0A61E600A80EE7 /* DeepChordsSdk */;
- targetProxy = 0D54E1022F0A61E600A80EE7 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
/* Begin XCBuildConfiguration section */
0D54E1052F0A61E600A80EE7 /* Debug */ = {
isa = XCBuildConfiguration;
"$(inherited)",
"$(PROJECT_DIR)/ShenYin/Sdk/DcSdk/opus/code_opus/lib",
);
- MARKETING_VERSION = 1.1.0;
+ MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"$(inherited)",
"$(PROJECT_DIR)/ShenYin/Sdk/DcSdk/opus/code_opus/lib",
);
- MARKETING_VERSION = 1.1.0;
+ MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
/// 日记管理
class Logger {
- static var isDebug: Bool = true
+ static var isDebug: Bool = false
fileprivate static let shared = Logger()
private var fileHandle:FileHandle?
case thai = "thai"
case Arabic = "Arabic"
case Vietnam = "Vietnam"
+
+ case Danish = "Danish"
+ case Greek = "Greek"
+ case Finnish = "Finnish"
+ case Hebrew = "Hebrew"
+ case Hindi = "Hindi"
+ case Italian = "Italian"
+ case Dutch = "Dutch"
+ case Norwegian = "Norwegian"
+ case Polish = "Polish"
+ case Swedish = "Swedish"
+ case Swahili = "Swahili"
+ case Turkish = "Turkish"
+
+
static var chinse2english:[CCAiLanguage]{
return [.chinse,.english]
}
static var all:[CCAiLanguage]{
- let list = [.chinse,.english,.japanese,.korean,.french,.spanish,.portuguese,.indonesian,.russian,.malay,German,Filipino,thai,Arabic,Vietnam]
+ let list = [.chinse,.english,.japanese,.korean,.french,.spanish,.portuguese,.indonesian,.russian,.malay,German,Filipino,thai,Arabic,Vietnam,Danish,Greek,Finnish,Hebrew,Hindi,Italian,Dutch,Norwegian,Polish,Swedish,Swahili,Turkish,]
// Logger.debug(list.map{$0.value})
return list
}
return "阿拉伯文".l10n
case .Vietnam:
return "越南文".l10n
+
+ case .Danish:
+ return "丹麦文".l10n
+ case .Greek:
+ return "希腊文".l10n
+ case .Finnish:
+ return "芬兰文".l10n
+ case .Hebrew:
+ return "希伯来文".l10n
+ case .Hindi:
+ return "印地文".l10n
+ case .Italian:
+ return "意大利文".l10n
+ case .Dutch:
+ return "荷兰文".l10n
+ case .Norwegian:
+ return "挪威文".l10n
+ case .Polish:
+ return "波兰文".l10n
+ case .Swedish:
+ return "瑞典文".l10n
+ case .Swahili:
+ return "斯瓦希里文".l10n
+ case .Turkish:
+ return "土耳其文".l10n
}
}
-// var value:String{
-// switch self {
-// case .chinse:
-// return kJoyGemAILocalizationZH
-// case .english:
-// return kJoyGemAILocalizationEN
-// case .japanese:
-// return kJoyGemAILocalizationJA
-// case .korean:
-// return kJoyGemAILocalizationKO
-// case .french:
-// return kJoyGemAILocalizationFR
-// case .spanish:
-// return kJoyGemAILocalizationES
-// case .portuguese:
-// return kJoyGemAILocalizationPT
-// case .indonesian:
-// return kJoyGemAILocalizationID
-// case .russian:
-// return kJoyGemAILocalizationRU_Target
-// case .malay:
-// return kJoyGemAILocalizationMS
-// case .German:
-// return kJoyGemAILocalizationDE
-// case .Filipino:
-// return kJoyGemAILocalizationFIL
-// case .thai:
-// return kJoyGemAILocalizationTH
-// case .Arabic:
-// return kJoyGemAILocalizationAR
-// case .Vietnam:
-// return kJoyGemAILocalizationVI
-// }
-// }
+
var value:String{
switch self {
case .chinse:
return "ar-SA"
case .Vietnam:
return "vi"
+
+ case .Danish:
+ return "da"
+ case .Greek:
+ return "el"
+ case .Finnish:
+ return "fi"
+ case .Hebrew:
+ return "he"
+ case .Hindi:
+ return "hi"
+ case .Italian:
+ return "it"
+ case .Dutch:
+ return "nl"
+ case .Norwegian:
+ return "no"
+ case .Polish:
+ return "pl"
+ case .Swedish:
+ return "sv"
+ case .Swahili:
+ return "sw"
+ case .Turkish:
+ return "tr"
}
}
}
import AVFAudio
//#if FEATURE_X
-import DeepChordsSdk
+//import DeepChordsSdk
//#endif
}
Logger.debug(peripheral)
- if let name = peripheral.name,name.hasPrefix("AI") {
- let mac = DcSdkManager.getMac(advertisementData) ?? ""
- devices.append(DCPeripheral(device: peripheral,mac: mac))
- discoverDeviceCallback?(devices)
- }
- else{
- let mac = JoySdkManager.getMac(advertisementData) ?? ""
- devices.append(DCPeripheral(device: peripheral,mac: mac))
- discoverDeviceCallback?(devices)
- }
-// if CCDevice.isJoy{
+// if let name = peripheral.name,name.hasPrefix("AI") {
+// let mac = DcSdkManager.getMac(advertisementData) ?? ""
+// devices.append(DCPeripheral(device: peripheral,mac: mac))
+// discoverDeviceCallback?(devices)
+// }
+// else{
// let mac = JoySdkManager.getMac(advertisementData) ?? ""
// devices.append(DCPeripheral(device: peripheral,mac: mac))
// discoverDeviceCallback?(devices)
// }
+ if CCDevice.isJoy{
+ let mac = JoySdkManager.getMac(advertisementData) ?? ""
+ devices.append(DCPeripheral(device: peripheral,mac: mac))
+ discoverDeviceCallback?(devices)
+ }
// else{
// let mac = DcSdkManager.getMac(advertisementData) ?? ""
// devices.append(DCPeripheral(device: peripheral,mac: mac))
peripheral.discoverServices([CBUUID(string: JoySdkManager.serviceUUID),CBUUID(string: OtaMananger.otaServiceUUId)]);
}
else{
- DCBleManager.shared.centralManager(central, didConnect: peripheral)
- peripheral.discoverServices([CBUUID(string: DCBleManager.serviceUUID),CBUUID(string: OtaMananger.otaServiceUUId)]);
+// DCBleManager.shared.centralManager(central, didConnect: peripheral)
+// peripheral.discoverServices([CBUUID(string: DCBleManager.serviceUUID),CBUUID(string: OtaMananger.otaServiceUUId)]);
}
}
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
YLprogressHUD.showAutoHiden("蓝牙已断开".l10n)
self.isConnetd = false
if CCDevice.isJoy{
- DCBleManager.shared.centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
+// DCBleManager.shared.centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
}
NotificationManager.post(type: .deviceValidChange, objtect: nil)
OtaMananger.shared.otaManager.centralManager(central, didDisconnectPeripheral: peripheral, error: error)
}
}
else{
- DCBleManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
+// DCBleManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
}
}
}
}
else{
- DCBleManager.shared.peripheral(peripheral, didUpdateValueFor: characteristic, error: error)
+// DCBleManager.shared.peripheral(peripheral, didUpdateValueFor: characteristic, error: error)
}
}
centralManager.scanForPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
}
else{
- centralManager.scanForPeripherals(withServices: [CBUUID(string: DCBleManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
+// centralManager.scanForPeripherals(withServices: [CBUUID(string: DCBleManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
}
discoverDeviceCallback?(devices)
}
// return []
}
else{
- let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: DCBleManager.serviceUUID)])
- Logger.debug("已连接设备",list)
- return list
+// let list = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: DCBleManager.serviceUUID)])
+// Logger.debug("已连接设备",list)
+// return list
+ return []
}
}
}
// Created by liangshi on 2025/12/25.
//
import JoyGemAI
-import DeepChordsSdk
+//import DeepChordsSdk
class CCDevice{
static var isJoy = true
static func initSdk(){
JoySdkManager.shared.setupSdk()
}
else{
- DcSdkManager.shared.initSdk()
+// DcSdkManager.shared.initSdk()
}
}
static func translate(text:String,from:String,to:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
}
}
else{
- DeepChordsAiSdk.shared.cancelTranslateByTextWithSplit()
- DeepChordsAiSdk.shared.translate(text: text, from: from, to: to) { result in
- finished(result)
- }
+// DeepChordsAiSdk.shared.cancelTranslateByTextWithSplit()
+// DeepChordsAiSdk.shared.translate(text: text, from: from, to: to) { result in
+// finished(result)
+// }
}
}
static func summary(text:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
}
}
else{
- DeepChordsAiSdk.shared.cancelSummaryByTextWithSplit()
- DeepChordsAiSdk.shared.sumary(text: text) { result in
- finished(result)
- }
+// DeepChordsAiSdk.shared.cancelSummaryByTextWithSplit()
+// DeepChordsAiSdk.shared.sumary(text: text) { result in
+// finished(result)
+// }
}
}
}
}
}
else{
- let value:UInt8 = mode == .cancel ? 0:1
- DCDevice.shared.findDevice(state: value) { result in
- }
+// let value:UInt8 = mode == .cancel ? 0:1
+// DCDevice.shared.findDevice(state: value) { result in
+// }
}
}
static func getEQMode(finished:@escaping (ModeEffectsType?)->Void){
// 0x03(爵士)
// 0x04(摇滚)
// 0x05(自定义)
- DCDevice.shared.getEQ { (arg0,result) in
- guard let (type,list) = arg0 else{
- finished(nil)
- return
- }
- switch type{
- case 0:
- finished(.normal)
- case 1:
- finished(.pop)
- case 2:
- finished(.classic)
- case 3:
- finished(.jazz)
- case 4:
- finished(.rock)
- case 5:
- finished(.custom)
- default:
- finished(nil)
- }
- }
+// DCDevice.shared.getEQ { (arg0,result) in
+// guard let (type,list) = arg0 else{
+// finished(nil)
+// return
+// }
+// switch type{
+// case 0:
+// finished(.normal)
+// case 1:
+// finished(.pop)
+// case 2:
+// finished(.classic)
+// case 3:
+// finished(.jazz)
+// case 4:
+// finished(.rock)
+// case 5:
+// finished(.custom)
+// default:
+// finished(nil)
+// }
+// }
}
}
static func setEQMode(_ type:ModeEffectsType){
Logger.debug("setEQMode:\(err)");
}
}else{
- let value:UInt8 = UInt8(type.rawValue)
- DCDevice.shared.setEQ(type: value) { success in
-
- }
+// let value:UInt8 = UInt8(type.rawValue)
+// DCDevice.shared.setEQ(type: value) { success in
+//
+// }
}
}
}
}
else{
- DCDevice.shared.getEQ { (arg0,result) in
- guard let (type,list) = arg0 else{
- finished(nil)
- return
- }
- if type == 5{
- let nums = list.map { NSNumber(value: $0) }
- finished(nums)
- }
- else{
- finished(nil)
- }
- }
+// DCDevice.shared.getEQ { (arg0,result) in
+// guard let (type,list) = arg0 else{
+// finished(nil)
+// return
+// }
+// if type == 5{
+// let nums = list.map { NSNumber(value: $0) }
+// finished(nums)
+// }
+// else{
+// finished(nil)
+// }
+// }
}
}
static func resetCustomEQ(){
}
}
else{
- let list = [
- 0,0,0,0,0,0,0,0,0,0,0,0
- ]
- let dispatchGroup = DispatchGroup()
- for (index,item) in list.enumerated() {
- dispatchGroup.enter()
- DCDevice.shared.setCustomEQ(index: UInt8(index), value: item) {result in
- dispatchGroup.leave()
- }
- }
- dispatchGroup.notify(queue:.main) {
- DCDevice.shared.setEQ(type: 0x05) {result in
- }
- }
+// let list = [
+// 0,0,0,0,0,0,0,0,0,0,0,0
+// ]
+// let dispatchGroup = DispatchGroup()
+// for (index,item) in list.enumerated() {
+// dispatchGroup.enter()
+// DCDevice.shared.setCustomEQ(index: UInt8(index), value: item) {result in
+// dispatchGroup.leave()
+// }
+// }
+// dispatchGroup.notify(queue:.main) {
+// DCDevice.shared.setEQ(type: 0x05) {result in
+// }
+// }
}
}
static func setCustomEQ(index:Int,value:Int){
}
}
else{
- DCDevice.shared.setCustomEQ(index: UInt8(index), value: value) {result in
- }
+// DCDevice.shared.setCustomEQ(index: UInt8(index), value: value) {result in
+// }
}
}
}
finished(nil)
}
}
- else{
- let dn = DeepChordsAiSdk.shared.getDeviceName()
- finished(dn)
- }
+// else{
+// let dn = DeepChordsAiSdk.shared.getDeviceName()
+// finished(dn)
+// }
}
static func getVersion(finished:@escaping ((_ version:String?)->Void)) {
if CCDevice.isJoy {
finished(nil)
}
}
- else{
- DCDevice.shared.getSoftVersion {result in
- finished(result)
- }
- }
+// else{
+// DCDevice.shared.getSoftVersion {result in
+// finished(result)
+// }
+// }
}
}
App.shared.goToPage(JoyChatVC())
}
else{
- App.shared.goToPage(DcChatVC())
+// App.shared.goToPage(DcChatVC())
}
}
static func gotoFieldRecord(){
App.shared.goToPage(JoyXclyVC())
}
else{
- App.shared.goToPage(DcXclyVC())
+// App.shared.goToPage(DcXclyVC())
}
}
static func gotoCallRecord(){
}
else{
// if JoySdkManager.shared.callRecord.supportStereo{
- App.shared.goToPage(DcStereoCallVC())
+// App.shared.goToPage(DcStereoCallVC())
// }
// else{
// App.shared.goToPage(DcCallingRecordVC())
App.shared.goToPage(JoyChinese2EnglishVC())
}
else{
- App.shared.goToPage(DcChinese2EnglishVC())
+// App.shared.goToPage(DcChinese2EnglishVC())
}
}
static func gotoTcty(){
App.shared.goToPage(JoyTctyVC())
}
else{
- App.shared.goToPage(DcTctyVC())
+// App.shared.goToPage(DcTctyVC())
}
}
static func gotoDialogTranslate(){
App.shared.goToPage(JoyDialogTranslateVC())
}
else{
- App.shared.goToPage(DcDialogTranslateVC())
+// App.shared.goToPage(DcDialogTranslateVC())
}
}
}
if (advMsd.count >= 13) {
let mac = advMsd[7...12];
let text = mac.map { String($0, radix: 16).padLeft(toLength: 2, withPad: "0") }.joined(separator: ":").uppercased()
- Logger.debug(dict)
- Logger.debug(advMsd)
- Logger.debug(mac.joined())
- Logger.debug(text)
+// Logger.debug(dict)
+// Logger.debug(advMsd)
+// Logger.debug(mac.joined())
+// Logger.debug(text)
return text
} else {
return nil
func setupUI(){
- let item0 = UITabBarItem(title: "AI" + " " + "智能".l10n , image: UIImage(named: "tab_0_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_0_selected")?.withRenderingMode(.alwaysOriginal))
+ var title0 = "智能".l10n + " " + "AI"
+ if DCConfig.appLanguage == .chinse{
+ title0 = "AI" + " " + "智能".l10n
+ }
+
+ let item0 = UITabBarItem(title: title0 , image: UIImage(named: "tab_0_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_0_selected")?.withRenderingMode(.alwaysOriginal))
let nc0 = BaseNC(rootViewController: homeVC)
nc0.tabBarItem = item0
tempList.append(item.model)
}
}
+ if tempList.count == 0 {
+ return
+ }
App.shared.goToPage(RecordShareVC(cloudList: tempList))
}
@objc func deleteAction(){
tempList.append(item.model)
}
}
+ if tempList.count == 0 {
+ return
+ }
App.shared.goToPage(RecordShareVC(localList: tempList))
}
@objc func deleteAction(){
"阿拉伯文" : "العربية",
"越南文" : "الفيتنامية",
"马来文" :"الملايوية",
+ "丹麦文":"الدنماركية",
+ "希腊文":"اليونانية",
+ "芬兰文":"الفنلندية",
+ "希伯来文":"العبرية",
+ "印地文":"الهندية",
+ "意大利文":"الإيطالية",
+ "荷兰文":"الهولندية",
+ "挪威文":"النرويجية",
+ "波兰文":"البولندية",
+ "瑞典文":"السويدية",
+ "斯瓦希里文":"السواحلية",
+ "土耳其文":"التركية",
"保存录音" : "حفظ التسجيل",
"原文" : "النص الأصلي",
"阿拉伯文" : "Arabic",
"越南文" : "Vietnamese",
"马来文" : "Malay",
+ "丹麦文":"Danish",
+ "希腊文":"Greek",
+ "芬兰文":"Finnish",
+ "希伯来文":"Hebrew",
+ "印地文":"Hindi",
+ "意大利文":"Italian",
+ "荷兰文":"Dutch",
+ "挪威文":"Norwegian",
+ "波兰文":"Polish",
+ "瑞典文":"Swedish",
+ "斯瓦希里文":"Swahili",
+ "土耳其文":"Turkish",
"保存录音" : "I-save ang Recording",
"原文" : "Original na Teksto",
"阿拉伯文" : "Arabisch",
"越南文" : "Vietnamesisch",
"马来文" :"Malaiisch",
+ "丹麦文":"Dänisch",
+ "希腊文":"Griechisch",
+ "芬兰文":"Finnisch",
+ "希伯来文":"Hebräisch",
+ "印地文":"Hindi",
+ "意大利文":"Italienisch",
+ "荷兰文":"Niederländisch",
+ "挪威文":"Norwegisch",
+ "波兰文":"Polnisch",
+ "瑞典文":"Schwedisch",
+ "斯瓦希里文":"Swahili",
+ "土耳其文":"Türkisch",
"保存录音" : "Aufnahme speichern",
"原文" : "Originaltext",
"阿拉伯文" : "阿拉伯文",
"越南文" : "越南文",
"马来文" : "馬來文",
+ "丹麦文":"丹麥文",
+ "希腊文":"希臘文",
+ "芬兰文":"芬蘭文",
+ "希伯来文":"希伯來文",
+ "印地文":"印地文",
+ "意大利文":"意大利文",
+ "荷兰文":"荷蘭文",
+ "挪威文":"挪威文",
+ "波兰文":"波蘭文",
+ "瑞典文":"瑞典文",
+ "斯瓦希里文":"斯瓦希里文",
+ "土耳其文":"土耳其文",
"保存录音" : "保存錄音",
"原文" : "原文",
"阿拉伯文" : "Tiếng Ả Rập",
"越南文" : "Tiếng Việt",
"马来文" :"Tiếng Mã Lai",
+ "丹麦文":"Tiếng Đan Mạch",
+ "希腊文":"Tiếng Hy Lạp",
+ "芬兰文":"Tiếng Phần Lan",
+ "希伯来文":"Tiếng Do Thái",
+ "印地文":"Tiếng Hindi",
+ "意大利文":"Tiếng Ý",
+ "荷兰文":"Tiếng Hà Lan",
+ "挪威文":"Tiếng Na Uy",
+ "波兰文":"Tiếng Ba Lan",
+ "瑞典文":"Tiếng Thụy Điển",
+ "斯瓦希里文":"Tiếng Swahili",
+ "土耳其文":"Tiếng Thổ Nhĩ Kỳ",
"保存录音" : "Lưu bản ghi âm",
"原文" : "Văn bản gốc",
"阿拉伯文" : "",
"越南文" : "",
"马来文":"",
+ "丹麦文":"",
+ "希腊文":"",
+ "芬兰文":"",
+ "希伯来文":"",
+ "印地文":"",
+ "意大利文":"",
+ "荷兰文":"",
+ "挪威文":"",
+ "波兰文":"",
+ "瑞典文":"",
+ "斯瓦希里文":"",
+ "土耳其文":"",
"保存录音" : "",
"阿拉伯文" : "Arabic",
"越南文" : "Vietnamese",
"马来文":"Malay",
+ "丹麦文":"Danish",
+ "希腊文":"Greek",
+ "芬兰文":"Finnish",
+ "希伯来文":"Hebrew",
+ "印地文":"Hindi",
+ "意大利文":"Italian",
+ "荷兰文":"Dutch",
+ "挪威文":"Norwegian",
+ "波兰文":"Polish",
+ "瑞典文":"Swedish",
+ "斯瓦希里文":"Swahili",
+ "土耳其文":"Turkish",
"保存录音" : "Save Recording",
"原文" : "Original Text",
"阿拉伯文" : "Arabe",
"越南文" : "Vietnamien",
"马来文" : "Malais",
+ "丹麦文":"Danois",
+ "希腊文":"Grec",
+ "芬兰文":"Finnois",
+ "希伯来文":"Hébreu",
+ "印地文":"Hindi",
+ "意大利文":"Italien",
+ "荷兰文":"Néerlandais",
+ "挪威文":"Norvégien",
+ "波兰文":"Polonais",
+ "瑞典文":"Suédois",
+ "斯瓦希里文":"Swahili",
+ "土耳其文":"Turc",
"保存录音" : "Enregistrer l'enregistrement",
"原文" : "Texte original",
"阿拉伯文" : "Bahasa Arab",
"越南文" : "Bahasa Vietnam",
"马来文" : "Bahasa Melayu",
+ "丹麦文":"Bahasa Denmark",
+ "希腊文":"Bahasa Yunani",
+ "芬兰文":"Bahasa Finlandia",
+ "希伯来文":"Bahasa Ibrani",
+ "印地文":"Bahasa Hindi",
+ "意大利文":"Bahasa Italia",
+ "荷兰文":"Bahasa Belanda",
+ "挪威文":"Bahasa Norwegia",
+ "波兰文":"Bahasa Polandia",
+ "瑞典文":"Bahasa Swedia",
+ "斯瓦希里文":"Bahasa Swahili",
+ "土耳其文":"Bahasa Turki",
"保存录音" : "Simpan Rekaman",
"原文" : "Teks Asli",
"阿拉伯文" : "アラビア語",
"越南文" : "ベトナム語",
"马来文" : "マレー語",
+ "丹麦文":"デンマーク語",
+ "希腊文":"ギリシャ語",
+ "芬兰文":"フィンランド語",
+ "希伯来文":"ヘブライ語",
+ "印地文":"ヒンディー語",
+ "意大利文":"イタリア語",
+ "荷兰文":"オランダ語",
+ "挪威文":"ノルウェー語",
+ "波兰文":"ポーランド語",
+ "瑞典文":"スウェーデン語",
+ "斯瓦希里文":"スワヒリ語",
+ "土耳其文":"トルコ語",
"保存录音" : "録音を保存",
"原文" : "原文",
"阿拉伯文" : "아랍어",
"越南文" : "베트남어",
"马来文" : "말레이어",
+ "丹麦文":"덴마크어",
+ "希腊文":"그리스어",
+ "芬兰文":"핀란드어",
+ "希伯来文":"히브리어",
+ "印地文":"힌디어",
+ "意大利文":"이탈리아어",
+ "荷兰文":"네덜란드어",
+ "挪威文":"노르웨이어",
+ "波兰文":"폴란드어",
+ "瑞典文":"스웨덴어",
+ "斯瓦希里文":"스와힐리어",
+ "土耳其文":"터키어",
"保存录音" : "녹음 저장",
"原文" : "원문",
"阿拉伯文" : "Bahasa Arab",
"越南文" : "Bahasa Vietnam",
"马来文" : "Bahasa Melayu",
+ "丹麦文":"Bahasa Denmark",
+ "希腊文":"Bahasa Greek",
+ "芬兰文":"Bahasa Finland",
+ "希伯来文":"Bahasa Ibrani",
+ "印地文":"Bahasa Hindi",
+ "意大利文":"Bahasa Itali",
+ "荷兰文":"Bahasa Belanda",
+ "挪威文":"Bahasa Norway",
+ "波兰文":"Bahasa Poland",
+ "瑞典文":"Bahasa Sweden",
+ "斯瓦希里文":"Bahasa Swahili",
+ "土耳其文":"Bahasa Turki",
"保存录音" : "Simpan Rekod",
"原文" : "Teks Asal",
"阿拉伯文" : "Арабский",
"越南文" : "Вьетнамский",
"马来文" :"Малайский",
+ "丹麦文":"Датский",
+ "希腊文":"Греческий",
+ "芬兰文":"Финский",
+ "希伯来文":"Иврит",
+ "印地文":"Хинди",
+ "意大利文":"Итальянский",
+ "荷兰文":"Нидерландский",
+ "挪威文":"Норвежский",
+ "波兰文":"Польский",
+ "瑞典文":"Шведский",
+ "斯瓦希里文":"Суахили",
+ "土耳其文":"Турецкий",
+
"保存录音" : "Сохранить запись",
"原文" : "Оригинальный текст",
"阿拉伯文" : "Árabe",
"越南文" : "Vietnamita",
"马来文" :"Malayo",
+ "丹麦文":"Danés",
+ "希腊文":"Griego",
+ "芬兰文":"Finlandés",
+ "希伯来文":"Hebreo",
+ "印地文":"Hindi",
+ "意大利文":"Italiano",
+ "荷兰文":"Holandés",
+ "挪威文":"Noruego",
+ "波兰文":"Polaco",
+ "瑞典文":"Sueco",
+ "斯瓦希里文":"Swahili",
+ "土耳其文":"Turco",
"保存录音" : "Guardar grabación",
"原文" : "Texto original",
"阿拉伯文" : "ภาษาอาหรับ",
"越南文" : "ภาษาวิเอตนาม",
"马来文" :"ภาษามลายู",
+ "丹麦文":"ภาษาเดนมาร์ก",
+ "希腊文":"ภาษากรีก",
+ "芬兰文":"ภาษาฟินแลนด์",
+ "希伯来文":"ภาษาฮีบรู",
+ "印地文":"ภาษาฮินดี",
+ "意大利文":"ภาษาอิตาลี",
+ "荷兰文":"ภาษาดัตช์",
+ "挪威文":"ภาษานอร์เวย์",
+ "波兰文":"ภาษาโปแลนด์",
+ "瑞典文":"ภาษาสวีเดน",
+ "斯瓦希里文":"ภาษาสวาฮีลี",
+ "土耳其文":"ภาษาตุรกี",
"保存录音" : "บันทึกเสียง",
"原文" : "ข้อความต้นฉบับ",
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>AvailableLibraries</key>
- <array>
- <dict>
- <key>BinaryPath</key>
- <string>JLAudioUnitKit.framework/JLAudioUnitKit</string>
- <key>LibraryIdentifier</key>
- <string>ios-arm64</string>
- <key>LibraryPath</key>
- <string>JLAudioUnitKit.framework</string>
- <key>SupportedArchitectures</key>
- <array>
- <string>arm64</string>
- </array>
- <key>SupportedPlatform</key>
- <string>ios</string>
- </dict>
- <dict>
- <key>BinaryPath</key>
- <string>JLAudioUnitKit.framework/JLAudioUnitKit</string>
- <key>LibraryIdentifier</key>
- <string>ios-x86_64-simulator</string>
- <key>LibraryPath</key>
- <string>JLAudioUnitKit.framework</string>
- <key>SupportedArchitectures</key>
- <array>
- <string>x86_64</string>
- </array>
- <key>SupportedPlatform</key>
- <string>ios</string>
- <key>SupportedPlatformVariant</key>
- <string>simulator</string>
- </dict>
- </array>
- <key>CFBundlePackageType</key>
- <string>XFWK</string>
- <key>XCFrameworkFormatVersion</key>
- <string>1.0</string>
-</dict>
-</plist>
+++ /dev/null
-//
-// JLAudioUnitKit.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-//
-
-#import <Foundation/Foundation.h>
-
-//! Project version number for JLAudioUnitKit.
-FOUNDATION_EXPORT double JLAudioUnitKitVersionNumber;
-
-//! Project version string for JLAudioUnitKit.
-FOUNDATION_EXPORT const unsigned char JLAudioUnitKitVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import <JLAudioUnitKit/PublicHeader.h>
-
-#import <JLAudioUnitKit/JLSpeexDecoder.h>
-#import <JLAudioUnitKit/JLOpusDecoder.h>
-#import <JLAudioUnitKit/JLOpusEncoder.h>
-#import <JLAudioUnitKit/JLOpusFormat.h>
-#import <JLAudioUnitKit/JLOpusEncodeConfig.h>
-#import <JLAudioUnitKit/JLPcmToWtg.h>
-#import <JLAudioUnitKit/JLPcmToWav.h>
-#import <JLAudioUnitKit/JLAudioUnitPlayer.h>
-#import <JLAudioUnitKit/JLOpusToOgg.h>
+++ /dev/null
-//
-// JLAudioUnitPlayer.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/4/16.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <AudioToolbox/AudioToolbox.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(NSInteger, JLAudioUnitPlayerType) {
- JLAudioUnitPlayerTypeFile, // 支持 MP3/WAV/AAC 等文件格式(AVAudioPlayer)
- JLAudioUnitPlayerTypePCM // 支持 PCM 流式播放(Audio Queue)
-};
-
-@class JLAudioUnitPlayer;
-
-@protocol JLAudioPlayerDelegate <NSObject>
-@optional
-// 播放进度更新(秒)
-- (void)audioPlayer:(JLAudioUnitPlayer *)player didUpdateProgress:(NSTimeInterval)currentTime duration:(NSTimeInterval)duration;
-// 播放完成
-- (void)audioPlayerDidFinishPlaying:(JLAudioUnitPlayer *)player;
-// 播放错误
-- (void)audioPlayer:(JLAudioUnitPlayer *)player didFailWithError:(NSError *)error;
-@end
-
-@interface JLAudioUnitPlayer : NSObject
-
-@property (nonatomic, weak) id<JLAudioPlayerDelegate> delegate;
-@property (nonatomic, readonly) NSTimeInterval duration; // 总时长(文件模式下有效)
-@property (nonatomic, readonly) NSTimeInterval currentTime;
-@property (nonatomic, readonly) BOOL isPlaying;
-
-#pragma mark - 初始化方法
-
-/// 文件播放初始化(MP3/WAV/AAC)
-- (instancetype)initWithAudioFile:(NSString *)filePath;
-
-/// PCM 流播放初始化(需指定格式)
-- (instancetype)initWithPCMFormat:(AudioStreamBasicDescription)format;
-
-#pragma mark - 播放控制
-- (void)play;
-- (void)pause;
-- (void)stop;
-- (void)seekToTime:(NSTimeInterval)time; // 仅文件模式有效
-
-#pragma mark - PCM 流式输入(仅 PCM 模式有效)
-- (void)appendPCMData:(NSData *)pcmData;
-- (void)endPCMStream; // 结束 PCM 流输入
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusDecoder.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-// Copyright © 2024 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <JLAudioUnitKit/JLOpusFormat.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@class JLOpusDecoder;
-
-/// Opus 解码代理
-@protocol JLOpusDecoderDelegate <NSObject>
-
-/// Opus 数据解码
-/// - Parameters:
-/// - decoder: 解码器
-/// - data: pcm 数据
-/// - error: 错误信息
--(void)opusDecoder:(JLOpusDecoder *)decoder Data:(NSData* _Nullable)data error:(NSError* _Nullable)error;
-
-@end
-
-typedef void(^JLOpusDecoderConvertBlock)(NSString *_Nullable pcmPath,NSError *_Nullable error);
-
-/// Opus 解码
-@interface JLOpusDecoder : NSObject
-
-/// 数据格式参数
-@property (nonatomic, strong) JLOpusFormat *opusFormat;
-
-/// 代理委托
-@property(nonatomic, weak) id<JLOpusDecoderDelegate> delegate;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/// 初始化
-/// - Parameters:
-/// - format: 解码格式
-/// - delegate: 代理
-- (instancetype)initDecoder:(JLOpusFormat *)format delegate:(id<JLOpusDecoderDelegate>)delegate;
-
-/// 重置解码格式
-/// - Parameter format: 解码格式
--(void)resetOpusFramet:(JLOpusFormat *)format;
-
-/// 输入 Opus 数据
-/// - Parameter data: Opus 数据
--(void)opusDecoderInputData:(NSData *)data;
-
-/// 解码文件
-/// - Parameters:
-/// - input: opus 文件
-/// - outPut: 输出路径
-/// - result: 结果回调
--(void)opusDecodeFile:(NSString *)input outPut:(NSString *_Nullable)outPut Resoult:(JLOpusDecoderConvertBlock _Nullable)result;
-
-/// 释放
--(void)opusOnRelease;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusEncodeConfig.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/8/27.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(NSInteger, JLOpusEncoderBandwidth) {
- ///(4kHz bandpass)
- JLOpusEncoderBandwidthNarrowband = 1101, // 对应 OPUS_BANDWIDTH_NARROWBAND
- /// (6kHz bandpass)
- JLOpusEncoderBandwidthMediumband = 1102, // 对应 OPUS_BANDWIDTH_MEDIUMBAND
- /// (8kHz bandpass)
- JLOpusEncoderBandwidthWideband = 1103, // 对应 OPUS_BANDWIDTH_WIDEBAND
- /// (12kHz bandpass)
- JLOpusEncoderBandwidthSuperwideband = 1104,// 对应 OPUS_BANDWIDTH_SUPERWIDEBAND
- /// (20kHz bandpass)
- JLOpusEncoderBandwidthFullband = 1105 // 对应 OPUS_BANDWIDTH_FULLBAND
-};
-
-@interface JLOpusEncodeConfig : NSObject
-
-/// 采样率
-@property (nonatomic, assign) int sampleRate;
-
-/// 单/双声道
-@property (nonatomic, assign) int channels;
-
-/// 帧长度 20ms 默认值
-@property (nonatomic, assign) int frameDuration;
-
-/// 帧长度
-@property (nonatomic, assign) int frameSize;
-
-/// BitRate
-@property (nonatomic, assign) int bitRate;
-
-/// 可变比特率开关,默认 NO(使用 CBR)
-@property (nonatomic, assign) BOOL useVBR;
-
-/// VBR 限制模式,默认 NO
-@property (nonatomic, assign) BOOL constrainedVBR;
-
-/// 编码复杂度 0~10,默认 5
-@property (nonatomic, assign) int complexity;
-
-/// 强制输出声道数 -1: 自适应, 1: 单声道, 2: 双声道, 默认 -1
-@property (nonatomic, assign) int forceChannels;
-
-/// 是否启用 DTX(静音段不发送数据),默认 NO
-@property (nonatomic, assign) BOOL useDTX;
-
-/// 网络丢包百分比,默认 0
-@property (nonatomic, assign) int packetLossPercent;
-
-/// 最大带宽限制(OPUS_BANDWIDTH_*),默认 FULLBAND
-@property (nonatomic, assign) int bandwidth;
-
-/// PCM 输入有效位深,默认 16
-@property (nonatomic, assign) int lsbDepth;
-
-/// 专家模式下帧时长(ms),默认与 frameDuration 一致
-@property (nonatomic, assign) int expertFrameDuration;
-
-/// 是否启用数据头
-/// 默认是启用的
-@property (nonatomic, assign) BOOL hasDataHeader;
-
-/// 创建默认编码配置
-+ (instancetype)defaultConfig;
-
-/// 获取默认配置
-/// 杰理的无头配置
-+ (instancetype)defaultJL;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusEncoder.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-// Copyright © 2024 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <JLAudioUnitKit/JLOpusEncodeConfig.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@class JLOpusEncoder;
-
-/// Opus 编码代理
-@protocol JLOpusEncoderDelegate <NSObject>
-
-/// PCM 数据编码
-/// - Parameters:
-/// - encoder: 解码器
-/// - data: opus 数据
-/// - error: 错误信息
--(void)opusEncoder:(JLOpusEncoder *)encoder Data:(NSData* _Nullable)data error:(NSError* _Nullable)error;
-
-@end
-
-typedef void(^JLOpusEncoderConvertBlock)(NSString *_Nullable pcmPath,NSError *_Nullable error);
-
-/// Opus 编码
-@interface JLOpusEncoder : NSObject
-
-/// 音频格式
-@property (nonatomic, strong) JLOpusEncodeConfig *opusFormat;
-
-/// 代理
-@property (nonatomic, weak) id<JLOpusEncoderDelegate> delegate;
-
--(instancetype)init NS_UNAVAILABLE;
-
-/// 初始化
-/// - Parameters:
-/// - config: 音频格式
-/// - delegate: 代理
--(instancetype)initFormat:(JLOpusEncodeConfig *)format delegate:(id<JLOpusEncoderDelegate>)delegate;
-
-/// PCM 数据
-/// - Parameter data: PCM 数据
--(void)opusEncodeData:(NSData *)data;
-
-/// PCM 文件转换成 Opus 文件
-/// - Parameters:
-/// - pcmPath: PCM 文件存放路径
-/// - outPut: 文件输出路径
-/// - result: 结果回调
--(void)opusEncodeFile:(NSString *)pcmPath outPut:(NSString *_Nullable)outPut Resoult:(JLOpusEncoderConvertBlock _Nullable)result;
-
-/// 释放
--(void)opusOnRelease;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusOptions.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-// Copyright © 2024 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-#define OPUS_JL_MAX_FRAME_SIZE 48000 * 2
-#define OPUS_JL_MAX_PACKET_SIZE 1500
-
-
-@interface JLOpusFormat : NSObject
-
-/// 采样率
-@property (nonatomic, assign) int sampleRate;
-
-/// 单/双声道
-@property (nonatomic, assign) int channels;
-
-/// 帧长度 20ms 默认值
-@property (nonatomic, assign) int frameDuration;
-
-/// BitRate
-@property (nonatomic, assign) int bitRate;
-
-/// 数据帧大小
-@property (nonatomic, assign, readonly) int frameSize;
-
-/// 数据大小
-@property (nonatomic, assign) int dataSize;
-
-/// 是否包含数据头部
-@property (nonatomic, assign) BOOL hasDataHeader;
-
-/// 是否开启slik语音优化
-@property (nonatomic, assign) BOOL usVoipSlik;
-
-
--(instancetype)init NS_UNAVAILABLE;
-
-/// 默认配置
-/// sampleRate: 16000
-/// channels: 1
-/// frameDuration: 20
-/// dataSize: 40
-/// frameSize: 320
-/// hasDataHeader: YES
-/// bitRate: 16000
-/// usVoipSlik: false
-+(JLOpusFormat*)defaultFormats;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusToOgg.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/5/16.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef void(^JLOpusToOggConvertBlock)(NSData *_Nullable oggData, BOOL isLast, NSError *_Nullable error);
-
-/// 将Opus数据转换为Ogg数据
-@interface JLOpusToOgg : NSObject
-
-/// 转码内容的回调
-@property(nonatomic,strong)JLOpusToOggConvertBlock _Nullable convertBlock;
-
-/// 帧长
-/// - Parameter frameLen: 帧长
-/// 默认值 40
-- (instancetype)initWithFrameLength:(uint32_t)frameLen;
-
-/// 开始流
--(void)startStream;
-
-/// 添加Opus数据
-/// - Parameter opusData: 符合杰理的无头裸 opus 数据
-- (void)appendOpusData:(NSData *)opusData;
-
-/// 关闭流
-- (void)closeStream;
-
-
-/// 将Opus数据转换为Ogg数据
-/// opus 必须为 16000
-/// opus 必须是 单声道
-/// - Parameters:
-/// - opusData: 符合杰理的无头裸 opus 数据
-/// - frameLen: 帧长 公版默认帧长是 40
-/// - duration: 转换后的时长
-/// - error: 错误
-+ (NSData *_Nullable)convertOpusDataToOgg:(NSData *)opusData
- frameLen:(uint32_t)frameLen
- duration:(double *)duration
- error:(NSError *__autoreleasing _Nullable *)error ;
-
-/// 将Opus文件转换为Ogg文件
-/// 符合杰理的无头裸 opus 文件
-/// opus 必须为 16000
-/// opus 必须是 单声道
-/// - Parameters:
-/// - opusFilePath: opus文件路径
-/// - oggFilePath: ogg文件路径
-/// - frameLen: 帧长 公版默认帧长是 40
-/// - duration: 转换后的时长
-+(void)convertOpusFileToOgg:(NSString *)opusFilePath
- oggFilePath:(NSString *)oggFilePath
- frameLen:(uint32_t)frameLen
- duration:(double *)duration;
-
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLPcmToWav.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/4/15.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/// PCM 转 WAV
-@interface JLPcmToWav : NSObject
-
-#pragma mark - 流式编码接口
-
-/// 初始化流式编码器
-/// @param outputPath 输出文件路径
-/// @param sampleRate 采样率(如 16000)
-/// @param numChannels 声道数(1 或 2)
-/// @param bitsPerSample 位深(16)
-- (instancetype)initWithOutputPath:(NSString *)outputPath
- sampleRate:(uint32_t)sampleRate
- numChannels:(uint16_t)numChannels
- bitsPerSample:(uint16_t)bitsPerSample;
-
-/// 追加 PCM 数据(需确保数据格式与初始化参数一致)
-/// @param pcmData PCM 数据块
-/// @param error 错误信息
-- (BOOL)appendPCMData:(NSData *)pcmData error:(NSError **)error;
-
-/// 完成编码并关闭文件(必须调用以更新 WAV 头)
-/// @param error 错误信息
-- (BOOL)finishWithError:(NSError **)error;
-
-#pragma mark - 一次性编码接口(便捷方法)
-
-/// 将 PCM 数据一次性转为 WAV 文件
-/// @param pcmData PCM 数据块
-/// @param outputPath 输出文件路径
-/// @param sampleRate 采样率(如 16000)
-/// @param numChannels 声道数(1 或 2)
-/// @param bitsPerSample 位深(16)
-/// @param error 错误信息
-+ (BOOL)convertPCMData:(NSData *)pcmData
- toWAVFile:(NSString *)outputPath
- sampleRate:(uint32_t)sampleRate
- numChannels:(uint16_t)numChannels
- bitsPerSample:(uint16_t)bitsPerSample
- error:(NSError **)error;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLPcmToWtg.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/1/21.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface JLPcm2WtgModel : NSObject <NSCopying>
-
-/// 音频文件
-@property (nonatomic, copy) NSString *pcmPath;
-
-/// 输出文件
-@property (nonatomic, copy) NSString *wtgPath;
-
-@end
-
-
-/// JLPcmToWtgProtocol
-@protocol JLPcmToWtgDelegate <NSObject>
-
-/// 音频转码完成
-/// - Parameter model: 音频转码模型
-- (void)convertPcmToWtgDone:(JLPcm2WtgModel *)model;
-
-@end
-
-/// 音频转码
-/// PCM 转 WTG
-@interface JLPcmToWtg : NSObject
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/// 音频转码初始化
-/// - Parameter delegate: 音频转码代理
-- (instancetype)initWithDelegate:(id<JLPcmToWtgDelegate>)delegate;
-
-/// 音频转码
-/// 当前接口模型只限制 PCM 文件格式为:8k 16bit
-/// 输入的pcm文件(16bit,小端,8k采样率),wtg_filename:输出的wtg文件
-/// - Parameter model: 音频转码模型
--(void)convertPcmToWtg:(JLPcm2WtgModel *)model;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLSpeexUnit.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@class JLSpeexDecoder;
-
-@protocol JLSpeexDelegate <NSObject>
-
-/// Speex 数据解码
-/// - Parameters:
-/// - decoder: 解码器
-/// - data: PCM 数据
-/// - error: 错误信息
-- (void)speexDecoder:(JLSpeexDecoder *)decoder Data:(NSData* _Nullable)data error:(NSError* _Nullable)error;
-
-@end
-
-typedef void(^JLSpeexConvertBlock)(NSString *_Nullable pcmPath,NSError *_Nullable error);
-
-/// Speex 数据解码
-@interface JLSpeexDecoder : NSObject
-
--(instancetype)init NS_UNAVAILABLE;
-
-/// 初始化
-/// - Parameter delegate: 委托
--(instancetype)initWithDelegate:(id<JLSpeexDelegate>)delegate;
-
-/// 委托
-@property (nonatomic, weak) id<JLSpeexDelegate> delegate;
-
-/// 输入 Speex 数据
-/// - Parameter data: Speex 数据
--(void)speexInputData:(NSData*)data;
-
-/// 将 Speex 转换为 PCM
-/// - Parameters:
-/// - filePath: Speex 路径
-/// - opPath: 输出路径
-/// - result: 结果回调
--(void)speexConvertToPcm:(NSString *)filePath outPutFilePath:(NSString * _Nullable)opPath Result:(JLSpeexConvertBlock)result;
-
-/// 释放对象
--(void)speexOnRelease;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-framework module JLAudioUnitKit {
- umbrella header "JLAudioUnitKit.h"
- export *
-
- module * { export * }
-}
+++ /dev/null
-DESCRIPTION\r
------------\r
-This package includes the files needed to build the fixed point implementation\r
-of the ITU-T G.729 Appendix IV.\r
-\r
-DIFFERENCES WITH G.729B\r
------------------------\r
-The ANSI-C source code simulating the bit-exact, fixed point simulation \r
-software of enhanced VAD is integrated into the G.729B source code. \r
-The modification to the G.729B source code updated files of coder.c, \r
-cod_ld8k.c, bits.c, dec_sid.c, dtx.c, qsidgain.c, qsidlsf.c, tab_dtx.c, \r
-tab_dtx.h, ld8k.h, deleted vad.c/h and integrated the enhanced VAD functions\r
-into the G.729B project. The modification also replaced the original basic \r
-operators used in the original G.729B source code by the basic operators of \r
-ITU-T Software Tool Library STL2005.\r
-\r
-COMPILATION\r
------------\r
-For UNIX systems the following makefiles are provided\r
-\r
- coder.mak\r
- decoder.mak\r
-\r
-Edit the makefiles coder.mak and decoder.mak to set the proper options\r
-for your system.\r
-The command to compile and link all code on a UNIX system is\r
-\r
- make -f coder.mak\r
- make -f decoder.mak\r
-\r
-For other platforms, the *.mak files can be used to work out the\r
-compilation procedures.\r
-\r
-USAGE\r
------\r
-The command line instruction for the encoder is as follows:\r
- coder inputfile bitstreamfile dtx_option mode x \r
-where:\r
- inputfile : 8 kHz sampled data file containing 16 bit linear PCM signal \r
- bitstreamfile: binary file containing bitstream \r
- dtx_option : = 1 : DTX enabled 0 : DTX disabled\r
- mode X : Run encoder with enhanced VAD in operating point X, \r
- X=0 or 1 or 2 representing balanced or quality-preferred \r
- or bandwidth saving operating point, respectively \r
-\r
-The command line for the decoder is as follows:\r
- decoder bitstreamfile outputfile\r
-where:\r
- bitstreamfile: binary file containing bitstream\r
- outputfile : 8 kHz sampled data file containing 16 bit linear PCM signal\r
-\r
-\r
+++ /dev/null
-//
-// JLAudioUnitKit.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-//
-
-#import <Foundation/Foundation.h>
-
-//! Project version number for JLAudioUnitKit.
-FOUNDATION_EXPORT double JLAudioUnitKitVersionNumber;
-
-//! Project version string for JLAudioUnitKit.
-FOUNDATION_EXPORT const unsigned char JLAudioUnitKitVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import <JLAudioUnitKit/PublicHeader.h>
-
-#import <JLAudioUnitKit/JLSpeexDecoder.h>
-#import <JLAudioUnitKit/JLOpusDecoder.h>
-#import <JLAudioUnitKit/JLOpusEncoder.h>
-#import <JLAudioUnitKit/JLOpusFormat.h>
-#import <JLAudioUnitKit/JLOpusEncodeConfig.h>
-#import <JLAudioUnitKit/JLPcmToWtg.h>
-#import <JLAudioUnitKit/JLPcmToWav.h>
-#import <JLAudioUnitKit/JLAudioUnitPlayer.h>
-#import <JLAudioUnitKit/JLOpusToOgg.h>
+++ /dev/null
-//
-// JLAudioUnitPlayer.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/4/16.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <AudioToolbox/AudioToolbox.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(NSInteger, JLAudioUnitPlayerType) {
- JLAudioUnitPlayerTypeFile, // 支持 MP3/WAV/AAC 等文件格式(AVAudioPlayer)
- JLAudioUnitPlayerTypePCM // 支持 PCM 流式播放(Audio Queue)
-};
-
-@class JLAudioUnitPlayer;
-
-@protocol JLAudioPlayerDelegate <NSObject>
-@optional
-// 播放进度更新(秒)
-- (void)audioPlayer:(JLAudioUnitPlayer *)player didUpdateProgress:(NSTimeInterval)currentTime duration:(NSTimeInterval)duration;
-// 播放完成
-- (void)audioPlayerDidFinishPlaying:(JLAudioUnitPlayer *)player;
-// 播放错误
-- (void)audioPlayer:(JLAudioUnitPlayer *)player didFailWithError:(NSError *)error;
-@end
-
-@interface JLAudioUnitPlayer : NSObject
-
-@property (nonatomic, weak) id<JLAudioPlayerDelegate> delegate;
-@property (nonatomic, readonly) NSTimeInterval duration; // 总时长(文件模式下有效)
-@property (nonatomic, readonly) NSTimeInterval currentTime;
-@property (nonatomic, readonly) BOOL isPlaying;
-
-#pragma mark - 初始化方法
-
-/// 文件播放初始化(MP3/WAV/AAC)
-- (instancetype)initWithAudioFile:(NSString *)filePath;
-
-/// PCM 流播放初始化(需指定格式)
-- (instancetype)initWithPCMFormat:(AudioStreamBasicDescription)format;
-
-#pragma mark - 播放控制
-- (void)play;
-- (void)pause;
-- (void)stop;
-- (void)seekToTime:(NSTimeInterval)time; // 仅文件模式有效
-
-#pragma mark - PCM 流式输入(仅 PCM 模式有效)
-- (void)appendPCMData:(NSData *)pcmData;
-- (void)endPCMStream; // 结束 PCM 流输入
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusDecoder.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-// Copyright © 2024 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <JLAudioUnitKit/JLOpusFormat.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@class JLOpusDecoder;
-
-/// Opus 解码代理
-@protocol JLOpusDecoderDelegate <NSObject>
-
-/// Opus 数据解码
-/// - Parameters:
-/// - decoder: 解码器
-/// - data: pcm 数据
-/// - error: 错误信息
--(void)opusDecoder:(JLOpusDecoder *)decoder Data:(NSData* _Nullable)data error:(NSError* _Nullable)error;
-
-@end
-
-typedef void(^JLOpusDecoderConvertBlock)(NSString *_Nullable pcmPath,NSError *_Nullable error);
-
-/// Opus 解码
-@interface JLOpusDecoder : NSObject
-
-/// 数据格式参数
-@property (nonatomic, strong) JLOpusFormat *opusFormat;
-
-/// 代理委托
-@property(nonatomic, weak) id<JLOpusDecoderDelegate> delegate;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/// 初始化
-/// - Parameters:
-/// - format: 解码格式
-/// - delegate: 代理
-- (instancetype)initDecoder:(JLOpusFormat *)format delegate:(id<JLOpusDecoderDelegate>)delegate;
-
-/// 重置解码格式
-/// - Parameter format: 解码格式
--(void)resetOpusFramet:(JLOpusFormat *)format;
-
-/// 输入 Opus 数据
-/// - Parameter data: Opus 数据
--(void)opusDecoderInputData:(NSData *)data;
-
-/// 解码文件
-/// - Parameters:
-/// - input: opus 文件
-/// - outPut: 输出路径
-/// - result: 结果回调
--(void)opusDecodeFile:(NSString *)input outPut:(NSString *_Nullable)outPut Resoult:(JLOpusDecoderConvertBlock _Nullable)result;
-
-/// 释放
--(void)opusOnRelease;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusEncodeConfig.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/8/27.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(NSInteger, JLOpusEncoderBandwidth) {
- ///(4kHz bandpass)
- JLOpusEncoderBandwidthNarrowband = 1101, // 对应 OPUS_BANDWIDTH_NARROWBAND
- /// (6kHz bandpass)
- JLOpusEncoderBandwidthMediumband = 1102, // 对应 OPUS_BANDWIDTH_MEDIUMBAND
- /// (8kHz bandpass)
- JLOpusEncoderBandwidthWideband = 1103, // 对应 OPUS_BANDWIDTH_WIDEBAND
- /// (12kHz bandpass)
- JLOpusEncoderBandwidthSuperwideband = 1104,// 对应 OPUS_BANDWIDTH_SUPERWIDEBAND
- /// (20kHz bandpass)
- JLOpusEncoderBandwidthFullband = 1105 // 对应 OPUS_BANDWIDTH_FULLBAND
-};
-
-@interface JLOpusEncodeConfig : NSObject
-
-/// 采样率
-@property (nonatomic, assign) int sampleRate;
-
-/// 单/双声道
-@property (nonatomic, assign) int channels;
-
-/// 帧长度 20ms 默认值
-@property (nonatomic, assign) int frameDuration;
-
-/// 帧长度
-@property (nonatomic, assign) int frameSize;
-
-/// BitRate
-@property (nonatomic, assign) int bitRate;
-
-/// 可变比特率开关,默认 NO(使用 CBR)
-@property (nonatomic, assign) BOOL useVBR;
-
-/// VBR 限制模式,默认 NO
-@property (nonatomic, assign) BOOL constrainedVBR;
-
-/// 编码复杂度 0~10,默认 5
-@property (nonatomic, assign) int complexity;
-
-/// 强制输出声道数 -1: 自适应, 1: 单声道, 2: 双声道, 默认 -1
-@property (nonatomic, assign) int forceChannels;
-
-/// 是否启用 DTX(静音段不发送数据),默认 NO
-@property (nonatomic, assign) BOOL useDTX;
-
-/// 网络丢包百分比,默认 0
-@property (nonatomic, assign) int packetLossPercent;
-
-/// 最大带宽限制(OPUS_BANDWIDTH_*),默认 FULLBAND
-@property (nonatomic, assign) int bandwidth;
-
-/// PCM 输入有效位深,默认 16
-@property (nonatomic, assign) int lsbDepth;
-
-/// 专家模式下帧时长(ms),默认与 frameDuration 一致
-@property (nonatomic, assign) int expertFrameDuration;
-
-/// 是否启用数据头
-/// 默认是启用的
-@property (nonatomic, assign) BOOL hasDataHeader;
-
-/// 创建默认编码配置
-+ (instancetype)defaultConfig;
-
-/// 获取默认配置
-/// 杰理的无头配置
-+ (instancetype)defaultJL;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusEncoder.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-// Copyright © 2024 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import <JLAudioUnitKit/JLOpusEncodeConfig.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@class JLOpusEncoder;
-
-/// Opus 编码代理
-@protocol JLOpusEncoderDelegate <NSObject>
-
-/// PCM 数据编码
-/// - Parameters:
-/// - encoder: 解码器
-/// - data: opus 数据
-/// - error: 错误信息
--(void)opusEncoder:(JLOpusEncoder *)encoder Data:(NSData* _Nullable)data error:(NSError* _Nullable)error;
-
-@end
-
-typedef void(^JLOpusEncoderConvertBlock)(NSString *_Nullable pcmPath,NSError *_Nullable error);
-
-/// Opus 编码
-@interface JLOpusEncoder : NSObject
-
-/// 音频格式
-@property (nonatomic, strong) JLOpusEncodeConfig *opusFormat;
-
-/// 代理
-@property (nonatomic, weak) id<JLOpusEncoderDelegate> delegate;
-
--(instancetype)init NS_UNAVAILABLE;
-
-/// 初始化
-/// - Parameters:
-/// - config: 音频格式
-/// - delegate: 代理
--(instancetype)initFormat:(JLOpusEncodeConfig *)format delegate:(id<JLOpusEncoderDelegate>)delegate;
-
-/// PCM 数据
-/// - Parameter data: PCM 数据
--(void)opusEncodeData:(NSData *)data;
-
-/// PCM 文件转换成 Opus 文件
-/// - Parameters:
-/// - pcmPath: PCM 文件存放路径
-/// - outPut: 文件输出路径
-/// - result: 结果回调
--(void)opusEncodeFile:(NSString *)pcmPath outPut:(NSString *_Nullable)outPut Resoult:(JLOpusEncoderConvertBlock _Nullable)result;
-
-/// 释放
--(void)opusOnRelease;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusOptions.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-// Copyright © 2024 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-#define OPUS_JL_MAX_FRAME_SIZE 48000 * 2
-#define OPUS_JL_MAX_PACKET_SIZE 1500
-
-
-@interface JLOpusFormat : NSObject
-
-/// 采样率
-@property (nonatomic, assign) int sampleRate;
-
-/// 单/双声道
-@property (nonatomic, assign) int channels;
-
-/// 帧长度 20ms 默认值
-@property (nonatomic, assign) int frameDuration;
-
-/// BitRate
-@property (nonatomic, assign) int bitRate;
-
-/// 数据帧大小
-@property (nonatomic, assign, readonly) int frameSize;
-
-/// 数据大小
-@property (nonatomic, assign) int dataSize;
-
-/// 是否包含数据头部
-@property (nonatomic, assign) BOOL hasDataHeader;
-
-/// 是否开启slik语音优化
-@property (nonatomic, assign) BOOL usVoipSlik;
-
-
--(instancetype)init NS_UNAVAILABLE;
-
-/// 默认配置
-/// sampleRate: 16000
-/// channels: 1
-/// frameDuration: 20
-/// dataSize: 40
-/// frameSize: 320
-/// hasDataHeader: YES
-/// bitRate: 16000
-/// usVoipSlik: false
-+(JLOpusFormat*)defaultFormats;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLOpusToOgg.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/5/16.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef void(^JLOpusToOggConvertBlock)(NSData *_Nullable oggData, BOOL isLast, NSError *_Nullable error);
-
-/// 将Opus数据转换为Ogg数据
-@interface JLOpusToOgg : NSObject
-
-/// 转码内容的回调
-@property(nonatomic,strong)JLOpusToOggConvertBlock _Nullable convertBlock;
-
-/// 帧长
-/// - Parameter frameLen: 帧长
-/// 默认值 40
-- (instancetype)initWithFrameLength:(uint32_t)frameLen;
-
-/// 开始流
--(void)startStream;
-
-/// 添加Opus数据
-/// - Parameter opusData: 符合杰理的无头裸 opus 数据
-- (void)appendOpusData:(NSData *)opusData;
-
-/// 关闭流
-- (void)closeStream;
-
-
-/// 将Opus数据转换为Ogg数据
-/// opus 必须为 16000
-/// opus 必须是 单声道
-/// - Parameters:
-/// - opusData: 符合杰理的无头裸 opus 数据
-/// - frameLen: 帧长 公版默认帧长是 40
-/// - duration: 转换后的时长
-/// - error: 错误
-+ (NSData *_Nullable)convertOpusDataToOgg:(NSData *)opusData
- frameLen:(uint32_t)frameLen
- duration:(double *)duration
- error:(NSError *__autoreleasing _Nullable *)error ;
-
-/// 将Opus文件转换为Ogg文件
-/// 符合杰理的无头裸 opus 文件
-/// opus 必须为 16000
-/// opus 必须是 单声道
-/// - Parameters:
-/// - opusFilePath: opus文件路径
-/// - oggFilePath: ogg文件路径
-/// - frameLen: 帧长 公版默认帧长是 40
-/// - duration: 转换后的时长
-+(void)convertOpusFileToOgg:(NSString *)opusFilePath
- oggFilePath:(NSString *)oggFilePath
- frameLen:(uint32_t)frameLen
- duration:(double *)duration;
-
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLPcmToWav.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/4/15.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/// PCM 转 WAV
-@interface JLPcmToWav : NSObject
-
-#pragma mark - 流式编码接口
-
-/// 初始化流式编码器
-/// @param outputPath 输出文件路径
-/// @param sampleRate 采样率(如 16000)
-/// @param numChannels 声道数(1 或 2)
-/// @param bitsPerSample 位深(16)
-- (instancetype)initWithOutputPath:(NSString *)outputPath
- sampleRate:(uint32_t)sampleRate
- numChannels:(uint16_t)numChannels
- bitsPerSample:(uint16_t)bitsPerSample;
-
-/// 追加 PCM 数据(需确保数据格式与初始化参数一致)
-/// @param pcmData PCM 数据块
-/// @param error 错误信息
-- (BOOL)appendPCMData:(NSData *)pcmData error:(NSError **)error;
-
-/// 完成编码并关闭文件(必须调用以更新 WAV 头)
-/// @param error 错误信息
-- (BOOL)finishWithError:(NSError **)error;
-
-#pragma mark - 一次性编码接口(便捷方法)
-
-/// 将 PCM 数据一次性转为 WAV 文件
-/// @param pcmData PCM 数据块
-/// @param outputPath 输出文件路径
-/// @param sampleRate 采样率(如 16000)
-/// @param numChannels 声道数(1 或 2)
-/// @param bitsPerSample 位深(16)
-/// @param error 错误信息
-+ (BOOL)convertPCMData:(NSData *)pcmData
- toWAVFile:(NSString *)outputPath
- sampleRate:(uint32_t)sampleRate
- numChannels:(uint16_t)numChannels
- bitsPerSample:(uint16_t)bitsPerSample
- error:(NSError **)error;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLPcmToWtg.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2025/1/21.
-// Copyright © 2025 ZhuHai JieLi Technology Co.,Ltd. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface JLPcm2WtgModel : NSObject <NSCopying>
-
-/// 音频文件
-@property (nonatomic, copy) NSString *pcmPath;
-
-/// 输出文件
-@property (nonatomic, copy) NSString *wtgPath;
-
-@end
-
-
-/// JLPcmToWtgProtocol
-@protocol JLPcmToWtgDelegate <NSObject>
-
-/// 音频转码完成
-/// - Parameter model: 音频转码模型
-- (void)convertPcmToWtgDone:(JLPcm2WtgModel *)model;
-
-@end
-
-/// 音频转码
-/// PCM 转 WTG
-@interface JLPcmToWtg : NSObject
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/// 音频转码初始化
-/// - Parameter delegate: 音频转码代理
-- (instancetype)initWithDelegate:(id<JLPcmToWtgDelegate>)delegate;
-
-/// 音频转码
-/// 当前接口模型只限制 PCM 文件格式为:8k 16bit
-/// 输入的pcm文件(16bit,小端,8k采样率),wtg_filename:输出的wtg文件
-/// - Parameter model: 音频转码模型
--(void)convertPcmToWtg:(JLPcm2WtgModel *)model;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// JLSpeexUnit.h
-// JLAudioUnitKit
-//
-// Created by EzioChan on 2024/11/14.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@class JLSpeexDecoder;
-
-@protocol JLSpeexDelegate <NSObject>
-
-/// Speex 数据解码
-/// - Parameters:
-/// - decoder: 解码器
-/// - data: PCM 数据
-/// - error: 错误信息
-- (void)speexDecoder:(JLSpeexDecoder *)decoder Data:(NSData* _Nullable)data error:(NSError* _Nullable)error;
-
-@end
-
-typedef void(^JLSpeexConvertBlock)(NSString *_Nullable pcmPath,NSError *_Nullable error);
-
-/// Speex 数据解码
-@interface JLSpeexDecoder : NSObject
-
--(instancetype)init NS_UNAVAILABLE;
-
-/// 初始化
-/// - Parameter delegate: 委托
--(instancetype)initWithDelegate:(id<JLSpeexDelegate>)delegate;
-
-/// 委托
-@property (nonatomic, weak) id<JLSpeexDelegate> delegate;
-
-/// 输入 Speex 数据
-/// - Parameter data: Speex 数据
--(void)speexInputData:(NSData*)data;
-
-/// 将 Speex 转换为 PCM
-/// - Parameters:
-/// - filePath: Speex 路径
-/// - opPath: 输出路径
-/// - result: 结果回调
--(void)speexConvertToPcm:(NSString *)filePath outPutFilePath:(NSString * _Nullable)opPath Result:(JLSpeexConvertBlock)result;
-
-/// 释放对象
--(void)speexOnRelease;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-framework module JLAudioUnitKit {
- umbrella header "JLAudioUnitKit.h"
- export *
-
- module * { export * }
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>files</key>
- <dict>
- <key>Headers/JLAudioUnitKit.h</key>
- <data>
- hE2nr+4q2/NdSgBaayJc7ZoOXb0=
- </data>
- <key>Headers/JLAudioUnitPlayer.h</key>
- <data>
- QPMLV/XA8hjk39d+vT+S57t0fDU=
- </data>
- <key>Headers/JLOpusDecoder.h</key>
- <data>
- K1bYcaJ67prImNlGuldy8csTRHc=
- </data>
- <key>Headers/JLOpusEncodeConfig.h</key>
- <data>
- NArAew5QxnSJGsD0tRzQ2V7bHrY=
- </data>
- <key>Headers/JLOpusEncoder.h</key>
- <data>
- BkgtVe9kCM4Fkc9oH1tC3BNh5Kw=
- </data>
- <key>Headers/JLOpusFormat.h</key>
- <data>
- Du1x3VNk87NstmspRk7ElijuZrk=
- </data>
- <key>Headers/JLOpusToOgg.h</key>
- <data>
- fSJT6LcyylJHTHX1wsN3JHG2FxU=
- </data>
- <key>Headers/JLPcmToWav.h</key>
- <data>
- /BbZmqmWpWVBusXqjnzbjaBNCNg=
- </data>
- <key>Headers/JLPcmToWtg.h</key>
- <data>
- zoOdOFpIulND0F1OrfIXR1H0kh0=
- </data>
- <key>Headers/JLSpeexDecoder.h</key>
- <data>
- 5ecBKtD3BDGccLiKpTs0fS0CSgs=
- </data>
- <key>Info.plist</key>
- <data>
- Q2Tz1ljDQKvKxkn8afbgb/2RVnU=
- </data>
- <key>Modules/module.modulemap</key>
- <data>
- 2vYf0m+hGTOTapX6sliv/F1E1VI=
- </data>
- <key>readme.txt</key>
- <data>
- wijZX0Dr2OlODWS6XYbpeKabb7g=
- </data>
- </dict>
- <key>files2</key>
- <dict>
- <key>Headers/JLAudioUnitKit.h</key>
- <dict>
- <key>hash2</key>
- <data>
- J5pq6Ed3fR+cQ7CGPXDoPl7BZzix7Cjf5yJZFRRvxqs=
- </data>
- </dict>
- <key>Headers/JLAudioUnitPlayer.h</key>
- <dict>
- <key>hash2</key>
- <data>
- qBz0OA82HUH4kBtO8xiUw7Q4ohtiIvCSYfCqax5xjJY=
- </data>
- </dict>
- <key>Headers/JLOpusDecoder.h</key>
- <dict>
- <key>hash2</key>
- <data>
- cnAj6Nt6vgRLoEH6QY3Q+gYpjcxGPN1OLLZbCgdLymI=
- </data>
- </dict>
- <key>Headers/JLOpusEncodeConfig.h</key>
- <dict>
- <key>hash2</key>
- <data>
- qrPpsrXaNCvyxf0/gUZtvveL+ywsfgBUrMPFibjneOo=
- </data>
- </dict>
- <key>Headers/JLOpusEncoder.h</key>
- <dict>
- <key>hash2</key>
- <data>
- PK+jl5IacMxuDEKkBwsjwpnGYxj/6Th3ICW4YQ7aRPA=
- </data>
- </dict>
- <key>Headers/JLOpusFormat.h</key>
- <dict>
- <key>hash2</key>
- <data>
- Nm6vM9/EbFzyIWbsysu6EOO2S+vZVeplcop4NvoJaMA=
- </data>
- </dict>
- <key>Headers/JLOpusToOgg.h</key>
- <dict>
- <key>hash2</key>
- <data>
- dNSvJJnED/6E1p7TYZ4zBzUnLDVsZ8NovuNYjge6T/w=
- </data>
- </dict>
- <key>Headers/JLPcmToWav.h</key>
- <dict>
- <key>hash2</key>
- <data>
- l/SEQhSFh7ctq/pBV+Z7X+Z0/gz30eCw3s31otjMPho=
- </data>
- </dict>
- <key>Headers/JLPcmToWtg.h</key>
- <dict>
- <key>hash2</key>
- <data>
- MwtbX3Sa0nytA+m11x+1rDvP4WvJnZLljshuT5B3WD0=
- </data>
- </dict>
- <key>Headers/JLSpeexDecoder.h</key>
- <dict>
- <key>hash2</key>
- <data>
- pV0X3xn07Ps7wE+0EfL9Yu/08tp8Ug8s14iDigRU46o=
- </data>
- </dict>
- <key>Modules/module.modulemap</key>
- <dict>
- <key>hash2</key>
- <data>
- akFCUM59aSAaRM/ADWQ138YT9GD3oAjcaTvTUo24Ml8=
- </data>
- </dict>
- <key>readme.txt</key>
- <dict>
- <key>hash2</key>
- <data>
- +2GG9ORrf2yJnBe2joKWtyBZL9p2sCH8EXqK1GIgW0E=
- </data>
- </dict>
- </dict>
- <key>rules</key>
- <dict>
- <key>^.*</key>
- <true/>
- <key>^.*\.lproj/</key>
- <dict>
- <key>optional</key>
- <true/>
- <key>weight</key>
- <real>1000</real>
- </dict>
- <key>^.*\.lproj/locversion.plist$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>1100</real>
- </dict>
- <key>^Base\.lproj/</key>
- <dict>
- <key>weight</key>
- <real>1010</real>
- </dict>
- <key>^version.plist$</key>
- <true/>
- </dict>
- <key>rules2</key>
- <dict>
- <key>.*\.dSYM($|/)</key>
- <dict>
- <key>weight</key>
- <real>11</real>
- </dict>
- <key>^(.*/)?\.DS_Store$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>2000</real>
- </dict>
- <key>^.*</key>
- <true/>
- <key>^.*\.lproj/</key>
- <dict>
- <key>optional</key>
- <true/>
- <key>weight</key>
- <real>1000</real>
- </dict>
- <key>^.*\.lproj/locversion.plist$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>1100</real>
- </dict>
- <key>^Base\.lproj/</key>
- <dict>
- <key>weight</key>
- <real>1010</real>
- </dict>
- <key>^Info\.plist$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>20</real>
- </dict>
- <key>^PkgInfo$</key>
- <dict>
- <key>omit</key>
- <true/>
- <key>weight</key>
- <real>20</real>
- </dict>
- <key>^embedded\.provisionprofile$</key>
- <dict>
- <key>weight</key>
- <real>20</real>
- </dict>
- <key>^version\.plist$</key>
- <dict>
- <key>weight</key>
- <real>20</real>
- </dict>
- </dict>
-</dict>
-</plist>
+++ /dev/null
-DESCRIPTION\r
------------\r
-This package includes the files needed to build the fixed point implementation\r
-of the ITU-T G.729 Appendix IV.\r
-\r
-DIFFERENCES WITH G.729B\r
------------------------\r
-The ANSI-C source code simulating the bit-exact, fixed point simulation \r
-software of enhanced VAD is integrated into the G.729B source code. \r
-The modification to the G.729B source code updated files of coder.c, \r
-cod_ld8k.c, bits.c, dec_sid.c, dtx.c, qsidgain.c, qsidlsf.c, tab_dtx.c, \r
-tab_dtx.h, ld8k.h, deleted vad.c/h and integrated the enhanced VAD functions\r
-into the G.729B project. The modification also replaced the original basic \r
-operators used in the original G.729B source code by the basic operators of \r
-ITU-T Software Tool Library STL2005.\r
-\r
-COMPILATION\r
------------\r
-For UNIX systems the following makefiles are provided\r
-\r
- coder.mak\r
- decoder.mak\r
-\r
-Edit the makefiles coder.mak and decoder.mak to set the proper options\r
-for your system.\r
-The command to compile and link all code on a UNIX system is\r
-\r
- make -f coder.mak\r
- make -f decoder.mak\r
-\r
-For other platforms, the *.mak files can be used to work out the\r
-compilation procedures.\r
-\r
-USAGE\r
------\r
-The command line instruction for the encoder is as follows:\r
- coder inputfile bitstreamfile dtx_option mode x \r
-where:\r
- inputfile : 8 kHz sampled data file containing 16 bit linear PCM signal \r
- bitstreamfile: binary file containing bitstream \r
- dtx_option : = 1 : DTX enabled 0 : DTX disabled\r
- mode X : Run encoder with enhanced VAD in operating point X, \r
- X=0 or 1 or 2 representing balanced or quality-preferred \r
- or bandwidth saving operating point, respectively \r
-\r
-The command line for the decoder is as follows:\r
- decoder bitstreamfile outputfile\r
-where:\r
- bitstreamfile: binary file containing bitstream\r
- outputfile : 8 kHz sampled data file containing 16 bit linear PCM signal\r
-\r
-\r
<dict>
<key>NSPrivacyTracking</key>
<false/>
- <key>NSPrivacyTrackingDomains</key>
- <array/>
<key>NSPrivacyAccessedAPITypes</key>
- <array>
- <dict>
- <key>NSPrivacyAccessedAPIType</key>
- <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
- <key>NSPrivacyAccessedAPITypeReasons</key>
- <array>
- <string>E174.1</string>
- </array>
- </dict>
- </array>
+ <array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
+ <key>NSPrivacyTrackingDomains</key>
+ <array/>
</dict>
</plist>