骨传导调试
authorliangzhenying <867174124@qq.com>
Wed, 31 Dec 2025 01:39:19 +0000 (09:39 +0800)
committerliangzhenying <867174124@qq.com>
Wed, 31 Dec 2025 01:39:19 +0000 (09:39 +0800)
33 files changed:
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleRecord.swift
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCCallRecord.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCChat.swift
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCPhoneRecord.swift
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsAiSdk.swift
ShenYin/ShenYin.xcodeproj/project.pbxproj
ShenYin/ShenYin/Launch/AppManager.swift
ShenYin/ShenYin/Sdk/CCAiManager.swift
ShenYin/ShenYin/Sdk/CCAiSupportLanguage.swift
ShenYin/ShenYin/Sdk/CCBleManager.swift
ShenYin/ShenYin/Sdk/CCDevice.swift
ShenYin/ShenYin/Sdk/CCPage.swift
ShenYin/ShenYin/Sdk/DcSdk/DcSdkManager.swift
ShenYin/ShenYin/Sdk/DcSdk/DcTcty.swift
ShenYin/ShenYin/Sdk/DcSdk/DcThly.swift
ShenYin/ShenYin/Sdk/DcSdk/DcXcly.swift
ShenYin/ShenYin/Sdk/DcSdk/VC/DcDialogTranslateVC.swift
ShenYin/ShenYin/Sdk/DcSdk/VC/DcStereoCallVC.swift
ShenYin/ShenYin/Sdk/JoySdk/JoyChinse2English.swift
ShenYin/ShenYin/Sdk/JoySdk/JoyDevice.swift [deleted file]
ShenYin/ShenYin/Sdk/JoySdk/JoyTcty.swift
ShenYin/ShenYin/Tools/CCCall.swift [moved from ShenYin/ShenYin/Sdk/CCCall.swift with 100% similarity]
ShenYin/ShenYin/UI/Home/Chat/CCRole.swift [moved from ShenYin/ShenYin/Sdk/CCRole.swift with 100% similarity]
ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift
ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift
ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryBottonView.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift
ShenYin/ShenYin/UI/Home/TextTranslate/TextTranslateVC.swift
ShenYin/ShenYin/UI/Mode/ModeEffectsType.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Mode/ModeEffectsView.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguageSelectItem.swift

index 40db780..b6bf5ca 100644 (file)
@@ -33,6 +33,8 @@ public class DCBleRecord {
     public var codeCallback:((Int)->Void)?
     /// 录音文件回调
     public var filePathCallBack:((String?)->Void)?
+    /// 设置录音文件路径
+    public var filePath:String?
     
     var asrList : [(String,Int)] = []
     var asrText = ""
@@ -40,6 +42,7 @@ public class DCBleRecord {
     var translateList : [(String,Int)] = []
     var translateText = ""
     
+    
     init() {
         setupRecord()
     }
@@ -52,13 +55,13 @@ public class DCBleRecord {
         config.isTTs = isTTs
         config.ttsFormat = ttsFormat
         
-        StarburstSdk.shared().setupDeviceRecord(with: nil, asrConfig: config) { config in
+        StarburstSdk.shared().setupDeviceRecord(with: filePath, asrConfig: config) { config in
             DCLogger.debug("录音类型 \(config!.type == 0x00 ? "实时录音" : "通话录音")")
         } recognizeText: { [weak self]  model in
             guard let self = self else {return}
             guard let model = model else {return}
             
-            if let text = model.textResult{
+            if let text = model.textResult,!text.isEmpty{
                 DCLogger.debug("asr = \(text)")
                 asrSplitCallback?(DCResponseModel(text: text, index: model.definiteIndex, definite: model.definite))
                 let msg = asrList.firstIndex (where: { (str,idx) in
@@ -75,7 +78,7 @@ public class DCBleRecord {
                 
                 asrCallback?(asrText)
             }
-            if let translate = model.translateResult,let text = translate.text{
+            if let translate = model.translateResult,let text = translate.text,!text.isEmpty{
                 DCLogger.debug("translate = \(text)")
                 translateSplitCallback?(DCResponseModel(text: text, index: Int(translate.definiteIndex), definite: translate.definite))
                 let msg = translateList.firstIndex (where: { (str,idx) in
@@ -107,12 +110,15 @@ public class DCBleRecord {
     }
     
     /// 0x00实时录音,0x0c通话录音
-    public func start(type:Int){
-        asrList = []
-        asrText = ""
+    public func start(type:Int,recordPath:String?){
         
-        translateList = []
-        translateText = ""
+            asrList = []
+            asrText = ""
+            
+            translateList = []
+            translateText = ""
+            filePath = recordPath
+        DCLogger.debug("设置地址 \(filePath ?? "")")
         
         setupRecord()
         let config = StarburstBleAsrConfig()
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCCallRecord.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCCallRecord.swift
new file mode 100644 (file)
index 0000000..a6811bd
--- /dev/null
@@ -0,0 +1,98 @@
+//
+//  DCCallRecord.swift
+//  Example
+//
+//  Created by liangshi on 2025/12/30.
+//
+
+import StarburstSdk
+
+public class DCCallRecord {
+    public static let shared = DCCallRecord()
+    /// 语⾔编码,默认为普通话(zh-CN),auto_lang自动识别
+    public var fromLanguage:String = "auto_lang"
+    /// ⽬标语⾔编码,默认为英语(en-US),auto_lang自动识别
+    public var toLanguage:String = "auto_lang"
+    /// 是否翻译,默认false。如果为true翻译源语言和目标语言不能是同一种语言
+    public var isTranslate = false
+    /// 是否进⾏Tts,默认false
+    public var isTTs = false
+    /// 默认pcm ⽀持pcm / ogg_opus / mp3
+    public var ttsFormat = "mp3"
+    /// 识别回调
+    public var asrCallback:((String)->Void)?
+
+    /// 状态码回调
+    public var codeCallback:((Int)->Void)?
+    /// 录音文件回调
+    public var filePathCallBack:((String?)->Void)?
+    /// 设置录音文件路径
+    public var filePath:String?
+    
+    var asrList : [(String,Int)] = []
+    var asrText = ""
+
+    
+    
+    init() {
+        setupRecord()
+    }
+    
+    func setupRecord(){
+        let config = StarburstAsrConfig()
+        config.isTranslate = isTranslate
+        config.fromLanguage = fromLanguage
+        config.toLanguage = toLanguage
+        config.isTTs = isTTs
+        config.ttsFormat = ttsFormat
+        
+        StarburstSdk.shared().setupDeviceRecord(with: filePath, asrConfig: config) { config in
+            DCLogger.debug("录音类型 \(config!.type == 0x00 ? "实时录音" : "通话录音")")
+        } recognizeText: { [weak self]  model in
+            guard let self = self else {return}
+            guard let model = model else {return}
+            
+            if let text = model.textResult,!text.isEmpty{
+                DCLogger.debug("asr = \(text)")
+                let msg = asrList.firstIndex (where: { (str,idx) in
+                    return idx == model.definiteIndex;
+                })
+                if (msg == nil) {
+                    asrList.append((text,model.definiteIndex))
+                } else {
+                    asrList[msg!] = (text,model.definiteIndex)
+                }
+                asrText = asrList.compactMap({ (str,idx) in
+                    return str
+                }).joined(separator: "\n")
+                
+                asrCallback?(asrText)
+            }
+        } stateChange: { [weak self]  code in
+            DCLogger.debug("状态改变",code)
+            self?.codeCallback?(code.rawValue)
+        } finished: {[weak self]  filePath in
+            DCLogger.debug("文件录音保存路径 \(filePath ?? "")")
+            self?.filePathCallBack?(filePath)
+        }
+    }
+    
+    /// 0x00实时录音,0x0c通话录音
+    public func start(type:Int,recordPath:String?){
+        
+        asrList = []
+        asrText = ""
+
+        filePath = recordPath
+        DCLogger.debug("设置地址 \(filePath ?? "")")
+        
+        setupRecord()
+        let config = StarburstBleAsrConfig()
+        config.type = type
+        StarburstSdk.shared().startDeviceRecord(config)
+        
+    }
+    public func stop(){
+        StarburstSdk.shared().stopDeviceRecord()
+    }
+}
index fdc5c88..44db924 100644 (file)
@@ -59,12 +59,11 @@ public class DCChat{
 }
 extension DCChat{
     public func getVcSpeekerList(finished:@escaping ([DCRole]?,Bool)->Void){
-        StarburstSdk.shared().getVcSpeekerList { [weak self] (list, success) in
-            guard let self = self else { return }
+        StarburstSdk.shared().getVcSpeekerList { (list, success) in
             if success,let list = list {
                 var temp = [DCRole]()
                 for item in list {
-                    var role = DCRole()
+                    let role = DCRole()
                     role.sid = item.sid
                     role.name = item.name
                     role.type = item.type
index 2b1211c..40006b7 100644 (file)
@@ -43,13 +43,15 @@ public class DCDevice{
          
          let sender = BleSender()
          sender.data = total
-         sender.completion = { result in
+         sender.completion = {[weak self] result in
              DCLogger.debug("\(result.description)")
              if result.isSuccess{
                  finished(true)
              }
              else{
+                 DCLogger.debug("握手失败")
                  finished(false)
+                 self?.handShake(finished: finished)
              }
          }
          DCBleManager.shared.send(sender)
index 6846441..4046440 100644 (file)
@@ -56,7 +56,7 @@ public class DCPhoneRecord {
             guard let self = self else {return}
             guard let model = model else {return}
             
-            if let text = model.textResult{
+            if let text = model.textResult,!text.isEmpty{
                 DCLogger.debug("asr = \(text)")
                 let msg = asrList.firstIndex (where: { (str,idx) in
                     return idx == model.definiteIndex;
@@ -72,7 +72,7 @@ public class DCPhoneRecord {
                 
                 asrCallback?(asrText)
             }
-            if let translate = model.translateResult,let text = translate.text{
+            if let translate = model.translateResult,let text = translate.text,!text.isEmpty{
                 DCLogger.debug("translate = \(text)")
                 let msg = translateList.firstIndex (where: { (str,idx) in
                     return idx == translate.definiteIndex;
index bce2888..f11c184 100644 (file)
@@ -30,6 +30,8 @@ public class DeepChordsAiSdk{
         StarburstConfig.shared().enableEarbudsSwitchSync = true
         //耳机仓表情下发开关
         StarburstConfig.shared().enableEmotionSyncToDevice = false
+        // 通话录音声道数。1:单声道 ;2:⽴体声;默认单声道
+        StarburstConfig.shared().callRecordChannel = 2
         //添加调试信息
 //        StarburstConfig.shared().debugInfo = [
 //            "x-use-ppe":"1",
@@ -55,7 +57,7 @@ public class DeepChordsAiSdk{
         let format = DateFormatter()
         format.dateFormat = "yyyyMMddHHmmss"
         let text = format.string(from: Date())
-        return NSHomeDirectory() + "/Documents/\(text).log"
+        return NSHomeDirectory() + "/Documents/StarburstSdk_\(text).log"
     }
 }
 
@@ -74,13 +76,22 @@ extension DeepChordsAiSdk{
 
     }
     public func sumary(text:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
+        
         StarburstSdk.shared().summaryByText(withSplit: text) { model in
             guard let model = model else{return}
             finished((model.llmResponse,model.complete))
         } error: { error in
             finished(nil)
         }
-
-        
+    }
+    public func cancelTranslateByTextWithSplit(){
+        StarburstSdk.shared().cancelTranslateByTextWithSplit()
+    }
+    public func cancelSummaryByTextWithSplit(){
+        StarburstSdk.shared().cancelSummaryByTextWithSplit()
+    }
+    public func getDeviceName()->String?{
+        let dn = StarburstSdk.shared().getDeviceName()
+        return dn
     }
 }
index b5ec30c..810b0f0 100644 (file)
                                        "$(PROJECT_DIR)/ShenYin/Sdk/DcSdk/opus/code_opus/lib",
                                );
                                MARKETING_VERSION = 1.0.2;
-                               PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app1;
+                               PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                PROVISIONING_PROFILE_SPECIFIER = "";
                                SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
                                        "$(PROJECT_DIR)/ShenYin/Sdk/DcSdk/opus/code_opus/lib",
                                );
                                MARKETING_VERSION = 1.0.2;
-                               PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app1;
+                               PRODUCT_BUNDLE_IDENTIFIER = com.deepchords.app;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                                PROVISIONING_PROFILE_SPECIFIER = "";
                                SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
index 1f3ae04..9000a42 100644 (file)
@@ -31,12 +31,6 @@ class App{
         Logger.debug(DCFolder.user)
         Logger.debug(DCFolder.record)
         self.window?.rootViewController = BaseTC()
-        if CCAiManager.isJoy {
-            JoySdkManager.shared.setupSdk()
-        }
-        else{
-            DcSdkManager.shared.initSdk()
-        }
     }
     func goToLogin(){
         window?.rootViewController = BaseNC(rootViewController: LoginVC())
index 5840aa1..133c0d7 100644 (file)
@@ -4,42 +4,10 @@
 //
 //  Created by liangshi on 2025/12/25.
 //
-import JoyGemAI
-import DeepChordsSdk
+
 
 class CCAiManager {
-    static var isJoy = false
-    
-    static func translate(text:String,from:String,to:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
-        if isJoy {
-            JoyGemAIManager.shared().cancelTranslateRequest()
-            JoyGemAIManager.shared().translate(text, from: from, to: to) { result, finish in
-                finished((result,finish))
-            } error: { error in
-                finished(nil)
-            }
-        }
-        else{
-            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){
-        if isJoy {
-            JoyGemAIManager.shared().cancelSummaryRequest()
-            JoyGemAIManager.shared().summary(text) { text, finish in
-                finished((text,finish))
-            } error: { error in
-                finished(nil)
-            }
-        }
-        else{
-            DeepChordsAiSdk.shared.sumary(text: text) { result in
-                finished(result)
-            }
-        }
-    }
+
 }
 extension CCAiManager{
     static func preparePlayBlueTooth(){
index b9520c9..64f4eac 100644 (file)
@@ -6,7 +6,6 @@
 //
 
 import Foundation
-import JoyGemAI
 
 enum CCAiLanguage:String{
     case chinse = "chinse"
@@ -28,8 +27,10 @@ enum CCAiLanguage:String{
     static var chinse2english:[CCAiLanguage]{
         return [.chinse,.english]
     }
-    static var translate:[CCAiLanguage]{
-        return [.chinse,.english,.japanese,.korean,.french,.spanish,.portuguese,.indonesian,.russian,.malay,German,Filipino,thai,Arabic,Vietnam]
+    static var all:[CCAiLanguage]{
+        let list = [.chinse,.english,.japanese,.korean,.french,.spanish,.portuguese,.indonesian,.russian,.malay,German,Filipino,thai,Arabic,Vietnam]
+//        Logger.debug(list.map{$0.value})
+        return list
     }
     var title:String{
         switch self {
@@ -65,38 +66,72 @@ enum CCAiLanguage:String{
             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 kJoyGemAILocalizationZH
+            return "zh-CN"
         case .english:
-            return kJoyGemAILocalizationEN
+            return "en-US"
         case .japanese:
-            return kJoyGemAILocalizationJA
+            return "ja-JP"
         case .korean:
-            return kJoyGemAILocalizationKO
+            return "ko-KR"
         case .french:
-            return kJoyGemAILocalizationFR
+            return "fr-FR"
         case .spanish:
-            return kJoyGemAILocalizationES
+            return "es-MX"
         case .portuguese:
-            return kJoyGemAILocalizationPT
+            return "pt-BR"
         case .indonesian:
-            return kJoyGemAILocalizationID
+            return "id-ID"
         case .russian:
-            return kJoyGemAILocalizationRU_Target
+            return "ru"
         case .malay:
-            return kJoyGemAILocalizationMS
+            return "ms-MY"
         case .German:
-            return kJoyGemAILocalizationDE
+            return "de-DE"
         case .Filipino:
-            return kJoyGemAILocalizationFIL
+            return "fil-PH"
         case .thai:
-            return kJoyGemAILocalizationTH
+            return "th-TH"
         case .Arabic:
-            return kJoyGemAILocalizationAR
+            return "ar-SA"
         case .Vietnam:
-            return kJoyGemAILocalizationVI
+            return "vi"
         }
     }
 }
index 1f62adc..9e356a2 100644 (file)
@@ -71,23 +71,33 @@ extension CCBleManager:CBCentralManagerDelegate{
         }
         Logger.debug(peripheral)
         
-        if CCAiManager.isJoy{
-            let mac = JoySdkManager.getMac(advertisementData) ?? ""
+        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 = DcSdkManager.getMac(advertisementData) ?? ""
+            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))
+//            discoverDeviceCallback?(devices)
+//        }
     }
     
     func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
         stopScanDevice()
         Logger.debug("蓝牙已连接 \(peripheral)")
         peripheral.delegate = self
-        if CCAiManager.isJoy{
+        if CCDevice.isJoy{
             peripheral.discoverServices([CBUUID(string: JoySdkManager.serviceUUID),CBUUID(string: OtaMananger.otaServiceUUId)]);
         }
         else{
@@ -103,7 +113,7 @@ extension CCBleManager:CBCentralManagerDelegate{
         Logger.debug("蓝牙已断开 \(peripheral)")
         YLprogressHUD.showAutoHiden("蓝牙已断开".l10n)
         self.isConnetd = false
-        if CCAiManager.isJoy{
+        if CCDevice.isJoy{
             DCBleManager.shared.centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
         }
         NotificationManager.post(type: .deviceValidChange, objtect: nil)
@@ -122,7 +132,7 @@ extension CCBleManager: CBPeripheralDelegate {
     }
     
     func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
-        if CCAiManager.isJoy{
+        if CCDevice.isJoy{
             if (service.uuid.uuidString == JoySdkManager.serviceUUID) {
                 JoySdkManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
             }
@@ -136,7 +146,7 @@ extension CCBleManager: CBPeripheralDelegate {
     }
     
     func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: (any Error)?) {
-        if CCAiManager.isJoy{
+        if CCDevice.isJoy{
             if (characteristic.isNotifying == true && characteristic.service?.uuid.uuidString == JoySdkManager.serviceUUID && characteristic.uuid.uuidString == JoySdkManager.notifyUUID) {
                 Logger.debug("特征使能成功")
                 JoySdkManager.shared.bleConnected()
@@ -149,7 +159,7 @@ extension CCBleManager: CBPeripheralDelegate {
     
     func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
         //        Logger.debug("收到数据 ===uUId ",characteristic.uuid)
-        if CCAiManager.isJoy{
+        if CCDevice.isJoy{
             if OtaMananger.isOtadata(characteristic){
                 if let _ = characteristic.value,error == nil {
                     OtaMananger.shared.otaManager.peripheral(peripheral, didUpdateValueFor: characteristic)
@@ -190,7 +200,7 @@ extension CCBleManager{
         //                devices.append(DCPeripheral(device: item,mac: mac))
         //            }
         //        }
-        if CCAiManager.isJoy{
+        if CCDevice.isJoy{
             centralManager.scanForPeripherals(withServices: [CBUUID(string: JoySdkManager.serviceUUID)],options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
         }
         else{
@@ -205,7 +215,14 @@ extension CCBleManager{
     
     func connectPeripheral(_ peripheral: DCPeripheral) {
         connectPeripheral = peripheral
-        Logger.debug("连接中...")
+        if let name = peripheral.device.name,name.hasPrefix("AI") {
+            CCDevice.isJoy = false
+        }
+        else{
+            CCDevice.isJoy = true
+        }
+        CCDevice.initSdk()
+        Logger.debug(peripheral.device.name ?? "","连接中...")
         centralManager.connect(peripheral.device, options: [CBConnectPeripheralOptionEnableTransportBridgingKey:true])
     }
     
index 39d1d46..43af2ba 100644 (file)
 //  Created by liangshi on 2025/12/25.
 //
 import JoyGemAI
-
-enum ModeEffectsType:Int{
-    case normal
-    case fashion
-    case classic
-    case rock
-    case jazz
-    case custom
-    
-    var title:String{
-        switch self {
-        case .normal:
-            return "正常".l10n
-        case .fashion:
-            return "流行".l10n
-        case .classic:
-            return "经典".l10n
-        case .rock:
-            return "摇滚".l10n
-        case .jazz:
-            return "爵士".l10n
-        case .custom:
-            return "自定义".l10n
+import DeepChordsSdk
+class CCDevice{
+    static var isJoy = true
+    static func initSdk(){
+        if CCDevice.isJoy {
+            JoySdkManager.shared.setupSdk()
         }
-    }
-    var img:String{
-        switch self {
-        case .normal:
-            return "mode_normal"
-        case .fashion:
-            return "mode_fashion"
-        case .classic:
-            return "mode_classic"
-        case .rock:
-            return "mode_rock"
-        case .jazz:
-            return "mode_jazz"
-        case .custom:
-            return "mode_custom"
+        else{
+            DcSdkManager.shared.initSdk()
         }
     }
-    var value:JoyGemEQMode{
-        switch self {
-        case .normal:
-            return .normal
-        case .fashion:
-            return .pop
-        case .classic:
-            return .classic
-        case .rock:
-            return .rock
-        case .jazz:
-            return .jazz
-        case .custom:
-            return .custom
+    static func translate(text:String,from:String,to:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
+        if isJoy {
+            JoyGemAIManager.shared().cancelTranslateRequest()
+            JoyGemAIManager.shared().translate(text, from: from, to: to) { result, finish in
+                finished((result,finish))
+            } error: { error in
+                finished(nil)
+            }
+        }
+        else{
+            DeepChordsAiSdk.shared.cancelTranslateByTextWithSplit()
+            DeepChordsAiSdk.shared.translate(text: text, from: from, to: to) { result in
+                finished(result)
+            }
         }
     }
-    
-    static var all:[ModeEffectsType]{
-        return [.normal,.fashion,.classic,.rock,.jazz,.custom]
-    }
-}
-
-enum FindType:Int{
-    case left
-    case right
-    case all
-    case cancel
-    var value:JoyGemFindHeadphoneMode{
-        switch self {
-        case .left:
-            return .left
-        case .right:
-            return .right
-        case .cancel:
-            return .cancel
-        case .all:
-            return .all
+    static func summary(text:String,finished:@escaping ((stream:String,finish:Bool)?)->Void){
+        if isJoy {
+            JoyGemAIManager.shared().cancelSummaryRequest()
+            JoyGemAIManager.shared().summary(text) { text, finish in
+                finished((text,finish))
+            } error: { error in
+                finished(nil)
+            }
+        }
+        else{
+            DeepChordsAiSdk.shared.cancelSummaryByTextWithSplit()
+            DeepChordsAiSdk.shared.sumary(text: text) { result in
+                finished(result)
+            }
         }
     }
 }
-
-class CCDevice{
+extension CCDevice{
     static func findHeadphone(_ mode:FindType){
-        JoyGemAIManager.shared().device.findHeadphone(mode.value) { err in
-            Logger.debug("findHeadphone:\(err)");
+        if CCDevice.isJoy {
+            var value:JoyGemFindHeadphoneMode = .all
+            switch mode {
+            case .left:
+                value = .left
+            case .right:
+                value = .right
+            case .cancel:
+                value = .cancel
+            case .all:
+                value = .all
+            }
+            JoyGemAIManager.shared().device.findHeadphone(value) { err in
+                Logger.debug("findHeadphone:\(err)");
+            }
+        }
+        else{
+            let value:UInt8 = mode == .cancel ? 0:1
+            DCDevice.shared.findDevice(state: value) { result in
+            }
         }
     }
     static func getEQMode(finished:@escaping (ModeEffectsType?)->Void){
-        JoyGemAIManager.shared().device.getEQMode { mode in
-            let type = ModeEffectsType.all.first(where: {$0.value == mode}) ?? .normal
-            finished(type)
-        } error: { err in
-            Logger.debug("getEQMode:\(err)");
-            finished(nil)
+        if CCDevice.isJoy {
+            JoyGemAIManager.shared().device.getEQMode { mode in
+                var value:ModeEffectsType = .normal
+                switch mode {
+                case .normal:
+                    value = .normal
+                case .pop:
+                    value = .pop
+                case .classic:
+                    value = .classic
+                case .rock:
+                    value = .rock
+                case .jazz:
+                    value = .jazz
+                case .custom:
+                    value = .custom
+                }
+                finished(value)
+            } error: { err in
+                Logger.debug("getEQMode:\(err)");
+                finished(nil)
+            }
+        }
+        else{
+            /// type, 0x00(正常模式)
+            //    0x01(流行)
+            //    0x02(经典)
+            //    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)
+                }
+            }
         }
     }
     static func setEQMode(_ type:ModeEffectsType){
-        JoyGemAIManager.shared().device.setEQMode(type.value) { err in
-            Logger.debug("setEQMode:\(err)");
+        if CCDevice.isJoy {
+            var value:JoyGemEQMode = .normal
+            switch type {
+            case .normal:
+                value = .normal
+            case .pop:
+                value = .pop
+            case .classic:
+                value = .classic
+            case .rock:
+                value = .rock
+            case .jazz:
+                value = .jazz
+            case .custom:
+                value = .custom
+            }
+            
+            JoyGemAIManager.shared().device.setEQMode(value) { err in
+                Logger.debug("setEQMode:\(err)");
+            }
+        }else{
+            let value:UInt8 = UInt8(type.rawValue)
+            DCDevice.shared.setEQ(type: value) { success in
+                
+            }
         }
     }
     
     
     static func getCustomEQ(finished:@escaping ([NSNumber]?)->Void){
-        JoyGemAIManager.shared().device.getCustomEQ { eq in
-            Logger.debug("getCustomEQ:\(eq)");
-            finished(eq.bands)
-        } error: { err in
-            Logger.debug("getCustomEQ:\(err)");
-            finished(nil)
+        if CCDevice.isJoy {
+            JoyGemAIManager.shared().device.getCustomEQ { eq in
+                Logger.debug("getCustomEQ:\(eq)");
+                finished(eq.bands)
+            } error: { err in
+                Logger.debug("getCustomEQ:\(err)");
+                finished(nil)
+            }
+        }
+        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)
+                }
+            }
         }
     }
     static func resetCustomEQ(){
-        JoyGemAIManager.shared().device.resetCustomEQ { err in
-            Logger.debug("resetCustomEQ:\(err)");
+        if CCDevice.isJoy {
+            JoyGemAIManager.shared().device.resetCustomEQ { err in
+                Logger.debug("resetCustomEQ:\(err)");
+            }
+        }
+        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
+                }
+            }
         }
     }
     static func setCustomEQ(index:Int,value:Int){
-        JoyGemAIManager.shared().device.setCustomEQ(UInt(index), withGain: value) { err in
-            Logger.debug("setCustomEQ:\(err)");
+        if CCDevice.isJoy {
+            JoyGemAIManager.shared().device.setCustomEQ(UInt(index), withGain: value) { err in
+                Logger.debug("setCustomEQ:\(err)");
+            }
+        }
+        else{
+//            DCDevice.shared.setCustomEQ(index: UInt8(index), value: value) {result in
+//            }
         }
     }
 }
 extension CCDevice{
-    static func getMac(finished:@escaping ((_ mac:String?)->Void)) {
-        JoyGemAIManager.shared().device.macAddress { edr, ble in
-            Logger.debug("edr:\(edr),ble:\(ble)");
-            finished(edr.uppercased())
-        } error: { error in
-            Logger.debug("\(error!.localizedDescription)")
-            finished(nil)
-        }
-    }
+//    static func getMac(finished:@escaping ((_ mac:String?)->Void)) {
+//        if CCDevice.isJoy {
+//            JoyGemAIManager.shared().device.macAddress { edr, ble in
+//                Logger.debug("edr:\(edr),ble:\(ble)");
+//                finished(edr.uppercased())
+//            } error: { error in
+//                Logger.debug("\(error!.localizedDescription)")
+//                finished(nil)
+//            }
+//        }
+//        else{
+////            DCDevice.shared.getSoftVersion {result in
+////                finished(result)
+////            }
+//        }
+//    }
     static func getDN(finished:@escaping ((_ mac:String?)->Void)) {
-        JoyGemAIManager.shared().device.getDN { deviceName in
-            finished(deviceName)
-        } error: { error in
-            Logger.debug("获取dn失败","\(error!.localizedDescription)")
-            finished(nil)
+        if CCDevice.isJoy {
+            JoyGemAIManager.shared().device.getDN { deviceName in
+                finished(deviceName)
+            } error: { error in
+                Logger.debug("获取dn失败","\(error!.localizedDescription)")
+                finished(nil)
+            }
+        }
+        else{
+            let dn = DeepChordsAiSdk.shared.getDeviceName()
+            finished(dn)
         }
     }
     static func getVersion(finished:@escaping ((_ version:String?)->Void)) {
-        JoyGemAIManager.shared().device.software { version in
-            finished(version)
-        } error: { error in
-            Logger.debug("\(error!.localizedDescription)");
-            finished(nil)
+        if CCDevice.isJoy {
+            JoyGemAIManager.shared().device.software { version in
+                finished(version)
+            } error: { error in
+                Logger.debug("\(error!.localizedDescription)");
+                finished(nil)
+            }
+        }
+        else{
+            DCDevice.shared.getSoftVersion {result in
+                finished(result)
+            }
         }
     }
 }
index 75cc017..1fecf7b 100644 (file)
@@ -7,7 +7,7 @@
 
 class CCPage{
     static func gotoChat(){
-        if CCAiManager.isJoy {
+        if CCDevice.isJoy {
             App.shared.goToPage(JoyChatVC())
         }
         else{
@@ -15,7 +15,7 @@ class CCPage{
         }
     }
     static func gotoFieldRecord(){
-        if CCAiManager.isJoy {
+        if CCDevice.isJoy {
             App.shared.goToPage(JoyXclyVC())
         }
         else{
@@ -23,7 +23,7 @@ class CCPage{
         }
     }
     static func gotoCallRecord(){
-        if CCAiManager.isJoy {
+        if CCDevice.isJoy {
             if JoySdkManager.shared.callRecord.supportStereo{
                 App.shared.goToPage(JoyStereoCallVC())
             }
@@ -33,7 +33,7 @@ class CCPage{
         }
         else{
 //            if JoySdkManager.shared.callRecord.supportStereo{
-//                App.shared.goToPage(JoyStereoCallVC())
+//                App.shared.goToPage(DcStereoCallVC())
 //            }
 //            else{
                 App.shared.goToPage(DcCallingRecordVC())
@@ -41,7 +41,7 @@ class CCPage{
         }
     }
     static func gotoChinese2Enlgish(){
-        if CCAiManager.isJoy {
+        if CCDevice.isJoy {
             App.shared.goToPage(JoyChinese2EnglishVC())
         }
         else{
@@ -49,7 +49,7 @@ class CCPage{
         }
     }
     static func gotoTcty(){
-        if CCAiManager.isJoy {
+        if CCDevice.isJoy {
             App.shared.goToPage(JoyTctyVC())
         }
         else{
@@ -57,7 +57,7 @@ class CCPage{
         }
     }
     static func gotoDialogTranslate(){
-        if CCAiManager.isJoy {
+        if CCDevice.isJoy {
             App.shared.goToPage(JoyDialogTranslateVC())
         }
         else{
index afa6f9c..134d673 100644 (file)
@@ -103,7 +103,6 @@ class DcSdkManager{
 }
 extension DcSdkManager{
     static func getMac(_ dict:[String:Any])->String?{
-        
         if let advMsd = dict[CBAdvertisementDataManufacturerDataKey] as? Data {
             if (advMsd.count >= 6) {
                 let mac = advMsd;
index cbf25be..35b7dad 100644 (file)
@@ -20,8 +20,6 @@ class DcTcty:NSObject{
     
     override init(){
         super.init()
-        
-        
     }
 
     func setupSdk(){
index 5689633..09c479c 100644 (file)
@@ -30,19 +30,12 @@ class DcThly:NSObject{
             recordText = text
             recordNeedReloadData?(text)
         }
-        //        DCBleRecord.shared.translateCallback = { [weak self] text in
-        //            guard let self = self else{return}
-        //            self.toTextView.text = text
-        //            let range = NSMakeRange(toTextView.text.count - 1, 1)
-        //            self.toTextView.scrollRangeToVisible(range)
-        //        }
         DCBleRecord.shared.codeCallback = { [weak self] code in
             guard let self = self else{return}
             codeCallback?(code)
         }
         DCBleRecord.shared.filePathCallBack = { [weak self] path in
             guard let self = self else{return}
-            //            self.recordBtn.isSelected = false
             if recordText.isEmpty{
                 return
             }
@@ -66,7 +59,7 @@ class DcThly:NSObject{
             return
         }
         Logger.debug("开启通话录音")
-        DCBleRecord.shared.start(type: 0x00 )
+        DCBleRecord.shared.start(type: 0x00, recordPath: nil )
     }
     func recordResume(){
         //        JoyGemRecordManager.shared().resume()
index 958b1d4..b138c0d 100644 (file)
@@ -15,6 +15,9 @@ class DcXcly:NSObject{
     var recordNeedReloadData:((String)->Void)?
     var recordList : [(String,UInt)] = []
     var recordText = ""
+    private var pausText = ""
+    private var recordPath:String?
+    private var wavPath:String?
     /// 状态码回调
     public var codeCallback:((Int)->Void)?
     
@@ -25,8 +28,8 @@ class DcXcly:NSObject{
     func setupSdk(){
         DCBleRecord.shared.asrCallback = { [weak self] text in
             guard let self = self else{return}
-            recordText = text
-            recordNeedReloadData?(text)
+            recordText = pausText + text
+            recordNeedReloadData?(recordText)
         }
         DCBleRecord.shared.codeCallback = { [weak self] code in
             guard let self = self else{return}
@@ -34,7 +37,6 @@ class DcXcly:NSObject{
         }
         DCBleRecord.shared.filePathCallBack = { [weak self] path in
             guard let self = self else{return}
-            //            self.recordBtn.isSelected = false
             if recordText.isEmpty{
                 return
             }
@@ -43,6 +45,10 @@ class DcXcly:NSObject{
             }
             let path1 = OpusTool.opusFile(toWAVFile: path)
             guard let wavPath = DCFolder.recordFileResave(srcPath: path1) else{return}
+            self.wavPath = wavPath
+            if path == recordPath {
+                return
+            }
             recordFinish?(wavPath)
         }
     }
@@ -53,16 +59,39 @@ class DcXcly:NSObject{
         Logger.debug("开启录音")
         recordList.removeAll()
         recordText = ""
+        pausText = ""
+        wavPath = nil
         setupSdk()
-        DCBleRecord.shared.start(type: 0x0c )
+        recordPath = DcXcly.getFilePath()
+        DCBleRecord.shared.start(type: 0x0c, recordPath: recordPath )
     }
     func recordResume(){
-//        JoyGemRecordManager.shared().resume()
+        wavPath = nil
+        pausText = recordText
+        DCBleRecord.shared.start(type: 0x0c, recordPath: recordPath )
     }
     func recordPause(){
-//        JoyGemRecordManager.shared().pause()
+        DCBleRecord.shared.stop()
     }
     func recordStop(){
+        recordPath = nil
         DCBleRecord.shared.stop()
+        if let path = wavPath {
+            recordFinish?(path)
+        }
+    }
+}
+
+extension DcXcly{
+    static func getFilePath()->String?{
+        // 获取缓存目录路径
+        guard let cacheDirectory = FileManager.default.urls(for:.cachesDirectory, in:.userDomainMask).first else {
+            print("无法获取缓存目录")
+            return nil
+        }
+        // 构建压缩文件路径
+        let name = "\(Int(Date().timeIntervalSince1970*1000)).opus"
+        let path = cacheDirectory.appendingPathComponent(name).path
+        return path
     }
 }
index 529eee9..bec6320 100644 (file)
@@ -318,7 +318,7 @@ extension DcDialogTranslateVC:DialogRecordBarDelegate{
         DCBleRecord.shared.toLanguage = toolBar.languageView.rightItem.language.value
         DCBleRecord.shared.isTranslate = true
         DCBleRecord.shared.isTTs = true
-        DCBleRecord.shared.start(type: 0x00)
+        DCBleRecord.shared.start(type: 0x00,recordPath: nil)
 
         do {
             try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker])
index 6fa9e3f..e672677 100644 (file)
@@ -127,45 +127,45 @@ class DcStereoCallVC:BaseVC{
     }
     
     func setupSdk(){
-        JoySdkManager.shared.callRecord.recordFinish = {[weak self] path in
-            guard let self = self else { return  }
-            if !needSave {
-                return
-            }
-            let v = PopTextField()
-            v.show()
-            v.cancelTap = {
-                App.shared.popPage()
-            }
-            v.okTap = { [weak self]  text in
-                guard let self = self else{return}
-                gotoDetail(fileName: text, wavPath: path, language: toolBar.leftItem.language)
-            }
-        }
-        JoySdkManager.shared.callRecord.stereoNeedReloadData = {[weak self] (text,index) in
-            guard let self = self else { return  }
-            if (index == 1) {
-                selfTextView.text = text
-                selfTextView.scrollToBottom()
-            } else if (index == 2) {
-                otherTextView.text = text
-                otherTextView.scrollToBottom()
-            }
-        }
-        JoySdkManager.shared.callRecord.callRecordAutoFinish = {[weak self]  in
-            guard let self = self else { return  }
-            stopAction()
-        }
-        JoySdkManager.shared.callRecord.callRecordNotOnCall = {[weak self]  in
-            guard let self = self else { return  }
-            YLprogressHUD.showAutoHiden("未处于通话状态".l10n)
-            rhythView.reset()
-            toolBar.recordBtn.isSelected = false
-            toolBar.leftItem.alpha = 1
-        }
-        if autoStart{
-            startRecord()
-        }
+//        JoySdkManager.shared.callRecord.recordFinish = {[weak self] path in
+//            guard let self = self else { return  }
+//            if !needSave {
+//                return
+//            }
+//            let v = PopTextField()
+//            v.show()
+//            v.cancelTap = {
+//                App.shared.popPage()
+//            }
+//            v.okTap = { [weak self]  text in
+//                guard let self = self else{return}
+//                gotoDetail(fileName: text, wavPath: path, language: toolBar.leftItem.language)
+//            }
+//        }
+//        JoySdkManager.shared.callRecord.stereoNeedReloadData = {[weak self] (text,index) in
+//            guard let self = self else { return  }
+//            if (index == 1) {
+//                selfTextView.text = text
+//                selfTextView.scrollToBottom()
+//            } else if (index == 2) {
+//                otherTextView.text = text
+//                otherTextView.scrollToBottom()
+//            }
+//        }
+//        JoySdkManager.shared.callRecord.callRecordAutoFinish = {[weak self]  in
+//            guard let self = self else { return  }
+//            stopAction()
+//        }
+//        JoySdkManager.shared.callRecord.callRecordNotOnCall = {[weak self]  in
+//            guard let self = self else { return  }
+//            YLprogressHUD.showAutoHiden("未处于通话状态".l10n)
+//            rhythView.reset()
+//            toolBar.recordBtn.isSelected = false
+//            toolBar.leftItem.alpha = 1
+//        }
+//        if autoStart{
+//            startRecord()
+//        }
     }
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
index f8a93f1..cc97567 100644 (file)
@@ -20,8 +20,8 @@ class JoyChinse2English:NSObject{
     
     func start(){
         startIndex += 100000
-        //            JoyGemSIManager.shared().originalLanguage = bar.leftItem.language.value
-        //            JoyGemSIManager.shared().targetLanguage = bar.rightItem.language.value
+//        JoyGemSIManager.shared().originalLanguage = kJoyGemAILocalizationAuto
+//        JoyGemSIManager.shared().targetLanguage = kJoyGemAILocalizationAuto
         JoyGemSIManager.shared().start()
         //            do {
         //                try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker])
diff --git a/ShenYin/ShenYin/Sdk/JoySdk/JoyDevice.swift b/ShenYin/ShenYin/Sdk/JoySdk/JoyDevice.swift
deleted file mode 100644 (file)
index 316c6be..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-////
-////  CCDevice.swift
-////  ShenYin
-////
-////  Created by liangshi on 2025/12/5.
-////
-//import JoyGemAI
-//
-//enum ModeEffectsType:Int{
-//    case normal
-//    case fashion
-//    case classic
-//    case rock
-//    case jazz
-//    case custom
-//    
-//    var title:String{
-//        switch self {
-//        case .normal:
-//            return "正常".l10n
-//        case .fashion:
-//            return "流行".l10n
-//        case .classic:
-//            return "经典".l10n
-//        case .rock:
-//            return "摇滚".l10n
-//        case .jazz:
-//            return "爵士".l10n
-//        case .custom:
-//            return "自定义".l10n
-//        }
-//    }
-//    var img:String{
-//        switch self {
-//        case .normal:
-//            return "mode_normal"
-//        case .fashion:
-//            return "mode_fashion"
-//        case .classic:
-//            return "mode_classic"
-//        case .rock:
-//            return "mode_rock"
-//        case .jazz:
-//            return "mode_jazz"
-//        case .custom:
-//            return "mode_custom"
-//        }
-//    }
-//    var value:JoyGemEQMode{
-//        switch self {
-//        case .normal:
-//            return .normal
-//        case .fashion:
-//            return .pop
-//        case .classic:
-//            return .classic
-//        case .rock:
-//            return .rock
-//        case .jazz:
-//            return .jazz
-//        case .custom:
-//            return .custom
-//        }
-//    }
-//    
-//    static var all:[ModeEffectsType]{
-//        return [.normal,.fashion,.classic,.rock,.jazz,.custom]
-//    }
-//}
-//
-//enum FindType:Int{
-//    case left
-//    case right
-//    case all
-//    case cancel
-//    var value:JoyGemFindHeadphoneMode{
-//        switch self {
-//        case .left:
-//            return .left
-//        case .right:
-//            return .right
-//        case .cancel:
-//            return .cancel
-//        case .all:
-//            return .all
-//        }
-//    }
-//}
-//
-//class CCDevice{
-//    static func findHeadphone(_ mode:FindType){
-//        JoyGemAIManager.shared().device.findHeadphone(mode.value) { err in
-//            Logger.debug("findHeadphone:\(err)");
-//        }
-//    }
-//    static func getEQMode(finished:@escaping (ModeEffectsType?)->Void){
-//        JoyGemAIManager.shared().device.getEQMode { mode in
-//            let type = ModeEffectsType.all.first(where: {$0.value == mode}) ?? .normal
-//            finished(type)
-//        } error: { err in
-//            Logger.debug("getEQMode:\(err)");
-//            finished(nil)
-//        }
-//    }
-//    static func setEQMode(_ type:ModeEffectsType){
-//        JoyGemAIManager.shared().device.setEQMode(type.value) { err in
-//            Logger.debug("setEQMode:\(err)");
-//        }
-//    }
-//    
-//    
-//    static func getCustomEQ(finished:@escaping ([NSNumber]?)->Void){
-//        JoyGemAIManager.shared().device.getCustomEQ { eq in
-//            Logger.debug("getCustomEQ:\(eq)");
-//            finished(eq.bands)
-//        } error: { err in
-//            Logger.debug("getCustomEQ:\(err)");
-//            finished(nil)
-//        }
-//    }
-//    static func resetCustomEQ(){
-//        JoyGemAIManager.shared().device.resetCustomEQ { err in
-//            Logger.debug("resetCustomEQ:\(err)");
-//        }
-//    }
-//    static func setCustomEQ(index:Int,value:Int){
-//        JoyGemAIManager.shared().device.setCustomEQ(UInt(index), withGain: value) { err in
-//            Logger.debug("setCustomEQ:\(err)");
-//        }
-//    }
-//}
-//extension CCDevice{
-//    static func getMac(finished:@escaping ((_ mac:String?)->Void)) {
-//        JoyGemAIManager.shared().device.macAddress { edr, ble in
-//            Logger.debug("edr:\(edr),ble:\(ble)");
-//            finished(edr.uppercased())
-//        } error: { error in
-//            Logger.debug("\(error!.localizedDescription)")
-//            finished(nil)
-//        }
-//    }
-//    static func getDN(finished:@escaping ((_ mac:String?)->Void)) {
-//        //        DispatchQueue.main.asyncAfter(deadline:.now() + 2) {
-//        //            print("延迟2秒后执行")
-//        //
-//        //        }
-//        JoyGemAIManager.shared().device.getDN { deviceName in
-//            finished(deviceName)
-//        } error: { error in
-//            Logger.debug("获取dn失败","\(error!.localizedDescription)")
-//            finished(nil)
-//        }
-//    }
-//    static func getVersion(finished:@escaping ((_ version:String?)->Void)) {
-//        JoyGemAIManager.shared().device.software { version in
-//            finished(version)
-//        } error: { error in
-//            Logger.debug("\(error!.localizedDescription)");
-//            finished(nil)
-//        }
-//    }
-//}
index 368ae4c..8b3945f 100644 (file)
@@ -4,6 +4,8 @@
 //
 //  Created by liangshi on 2025/12/29.
 //
+//1、先暂停后停止,结束不了
+//2、暂停后,音频只有后半部分
 
 import JoyGemAI
 
index e88f28c..f2fa628 100644 (file)
@@ -154,7 +154,7 @@ class DialogRecordBar: BaseView {
         if recordView.isBusy {
             return
         }
-        let v = LanguagePickerView(languages: CCAiLanguage.translate,isLeft: true,left: languageView.leftItem.language,right: languageView.rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: true,left: languageView.leftItem.language,right: languageView.rightItem.language)
         v.selectedIndex = v.list.firstIndex(where: {$0.title == languageView.leftItem.language.title}) ?? 0
         v.show()
         v.didSelected = {[weak self] (index,value) in
@@ -173,7 +173,7 @@ class DialogRecordBar: BaseView {
         if recordView.isBusy{
             return
         }
-        let v = LanguagePickerView(languages: CCAiLanguage.translate,isLeft: false,left: languageView.leftItem.language,right: languageView.rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: false,left: languageView.leftItem.language,right: languageView.rightItem.language)
         v.selectedIndex = v.list.firstIndex(where: {$0.title == languageView.rightItem.language.title}) ?? 0
         v.show()
         v.didSelected = {[weak self] (index,value) in
index 9dbae62..e8b47f8 100644 (file)
@@ -73,14 +73,14 @@ class FieldRecordBar: BaseView {
         if recordBtn.isSelected || recordBtn.activeView.animating {
             return
         }
-        let list = CCAiLanguage.translate.map{$0.title}
+        let list = CCAiLanguage.all.map{$0.title}
         
         let v = CustomPicker(title: "请选择语言".l10n, list:list )
         v.selectedIndex = list.firstIndex(where: {leftItem.language.title == $0})!
         v.show()
         v.didSelected = {[weak self] (index,value) in
             guard let self = self else { return  }
-            leftItem.language = CCAiLanguage.translate.first(where: {$0.title == value})!
+            leftItem.language = CCAiLanguage.all.first(where: {$0.title == value})!
             delegate?.fieldRecordBar(self, languageChange:leftItem.language)
         }
         return
index 799ec62..b1b007d 100644 (file)
@@ -111,7 +111,7 @@ class RecordBar: BaseView {
         if recordBtn.isSelected {
             return
         }
-        let v = LanguagePickerView(languages: CCAiLanguage.translate,isLeft: true,left: leftItem.language,right: rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: true,left: leftItem.language,right: rightItem.language)
         v.selectedIndex = v.list.firstIndex(where: {$0.title == leftItem.language.title}) ?? 0
         v.show()
         v.didSelected = {[weak self] (index,value) in
@@ -135,7 +135,7 @@ class RecordBar: BaseView {
         if recordBtn.isSelected {
             return
         }
-        let v = LanguagePickerView(languages: CCAiLanguage.translate,isLeft: false,left: leftItem.language,right: rightItem.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: false,left: leftItem.language,right: rightItem.language)
         v.selectedIndex = v.list.firstIndex(where: {$0.title == rightItem.language.title}) ?? 0
         v.show()
         v.didSelected = {[weak self] (index,value) in
index 80fa23a..3777a3e 100644 (file)
@@ -7,7 +7,7 @@
 
 class HistoryBottonView: BaseView {
     let titleLabel = UILabel()
-    var type = ModeEffectsType.fashion{
+    var type = ModeEffectsType.pop{
         didSet{
             titleLabel.text = type.title
         }
index 34383c0..3fa7b46 100644 (file)
@@ -303,7 +303,7 @@ extension RecordDetailVC:RecordDetailTopBarDelegate{
 }
 extension RecordDetailVC:RecordDetailBarDelegate{
     func recordDetailBarTranstlateAction(_ bar: RecordDetailBar) {
-        var list = CCAiLanguage.translate.map{$0.title}
+        var list = CCAiLanguage.all.map{$0.title}
 //        list = list.filter { $0 != data!.from.title }
         
         let v = CustomPicker(title: "请选择语言".l10n, list:list )
@@ -312,7 +312,7 @@ extension RecordDetailVC:RecordDetailBarDelegate{
         v.show()
         v.didSelected = {[weak self] (index,value) in
             guard let self = self else { return  }
-            data!.to = CCAiLanguage.translate.first(where: {$0.title == value})!
+            data!.to = CCAiLanguage.all.first(where: {$0.title == value})!
             translateAction()
             if !topBar.tranlateItem.isSelected {
                 topBar.tralateAction()
@@ -411,7 +411,7 @@ extension RecordDetailVC{
     func translateAction(){
         translateView.content = ""
         
-        CCAiManager.translate(text: originView.content, from: data!.from.value, to: data!.to.value) {[weak self] result in
+        CCDevice.translate(text: originView.content, from: data!.from.value, to: data!.to.value) {[weak self] result in
             guard let self = self else{return}
             guard let (text, finish) = result else {return}
             translateView.content += text
@@ -422,7 +422,7 @@ extension RecordDetailVC{
     }
     func summaryAction(){
         summaryView.content = ""
-        CCAiManager.summary(text: originView.content) {[weak self] result in
+        CCDevice.summary(text: originView.content) {[weak self] result in
             guard let self = self else{return}
             guard let (text, finish) = result else {return}
             summaryView.content += text
index 1af0ed4..d39f0f5 100644 (file)
@@ -95,7 +95,7 @@ extension TextTranlateVC:SendToolBarDelegate{
         let from = languageItem.leftLabel.language.value
         let to = languageItem.rightLabel.language.value
         
-        CCAiManager.translate(text:text, from: from, to: to) { [weak self] response in
+        CCDevice.translate(text:text, from: from, to: to) { [weak self] response in
             guard let self = self else{return}
             guard let (result, finish) = response else{return}
             if !finish{
diff --git a/ShenYin/ShenYin/UI/Mode/ModeEffectsType.swift b/ShenYin/ShenYin/UI/Mode/ModeEffectsType.swift
new file mode 100644 (file)
index 0000000..274d340
--- /dev/null
@@ -0,0 +1,60 @@
+//
+//  Mode.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/12/30.
+//
+
+enum ModeEffectsType:Int{
+    case normal = 0
+    case pop = 1
+    case classic = 2
+    case jazz = 3
+    case rock = 4
+    case custom = 5
+    
+    var title:String{
+        switch self {
+        case .normal:
+            return "正常".l10n
+        case .pop:
+            return "流行".l10n
+        case .classic:
+            return "经典".l10n
+        case .rock:
+            return "摇滚".l10n
+        case .jazz:
+            return "爵士".l10n
+        case .custom:
+            return "自定义".l10n
+        }
+    }
+    var img:String{
+        switch self {
+        case .normal:
+            return "mode_normal"
+        case .pop:
+            return "mode_fashion"
+        case .classic:
+            return "mode_classic"
+        case .rock:
+            return "mode_rock"
+        case .jazz:
+            return "mode_jazz"
+        case .custom:
+            return "mode_custom"
+        }
+    }
+    
+    
+    static var all:[ModeEffectsType]{
+        return [.normal,.pop,.classic,.rock,.jazz,.custom]
+    }
+}
+
+enum FindType:Int{
+    case left
+    case right
+    case all
+    case cancel
+}
index 7619224..b4253fc 100644 (file)
@@ -104,7 +104,7 @@ class ModeEffectsView: BaseView {
         let icon = UIImageView()
         let titleLabel = UILabel()
         let selectedIcon = UIImageView()
-        var type = ModeEffectsType.fashion{
+        var type = ModeEffectsType.pop{
             didSet{
                 titleLabel.text = type.title
                 icon.image = UIImage(named:type.img)
index b00f1b1..c7279dd 100644 (file)
@@ -63,7 +63,7 @@ class LanguageSelectItem: BaseView {
         rightLabel.language = text1
     }
     @objc func leftAction(){
-        let v = LanguagePickerView(languages: CCAiLanguage.translate,isLeft: true,left: leftLabel.language,right: rightLabel.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: true,left: leftLabel.language,right: rightLabel.language)
         v.selectedIndex = v.list.firstIndex(where: {$0.title == leftLabel.language.title}) ?? 0
         v.show()
         v.didSelected = {[weak self] (index,value) in
@@ -79,7 +79,7 @@ class LanguageSelectItem: BaseView {
         }
     }
     @objc func rightAction(){
-        let v = LanguagePickerView(languages: CCAiLanguage.translate,isLeft: false,left: leftLabel.language,right: rightLabel.language)
+        let v = LanguagePickerView(languages: CCAiLanguage.all,isLeft: false,left: leftLabel.language,right: rightLabel.language)
         v.selectedIndex = v.list.firstIndex(where: {$0.title == rightLabel.language.title}) ?? 0
         v.show()
         v.didSelected = {[weak self] (index,value) in